diff --git a/.gitignore b/.gitignore index b1b850be6634a94404231bba62280b2aa7938179..96d70870f6cd7169b51c6ef3fc002c70cbd6419e 100644 --- a/.gitignore +++ b/.gitignore @@ -69,7 +69,7 @@ node_modules/ toy*.ts .DS_Store -build/ +# build/ # Commented out for HF deployment - need pre-built files .firebase-emu/ *.log .DS_Store diff --git a/build/api/crawler.js b/build/api/crawler.js new file mode 100644 index 0000000000000000000000000000000000000000..0c0dcab31e244433eef6aa957beff4a75420e088 --- /dev/null +++ b/build/api/crawler.js @@ -0,0 +1,1170 @@ +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var __param = (this && this.__param) || function (paramIndex, decorator) { + return function (target, key) { decorator(target, key, paramIndex); } +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +var _a, _b, _c, _d, _e, _f; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.CrawlerHost = void 0; +const tsyringe_1 = require("tsyringe"); +const url_1 = require("url"); +const crypto_1 = require("crypto"); +const lodash_1 = __importDefault(require("lodash")); +const civ_rpc_1 = require("civkit/civ-rpc"); +const lang_1 = require("civkit/lang"); +const defer_1 = require("civkit/defer"); +const decorators_1 = require("civkit/decorators"); +const fancy_file_1 = require("civkit/fancy-file"); +const crawler_options_1 = require("../dto/crawler-options"); +const crawled_1 = require("../db/crawled"); +const domain_blockade_1 = require("../db/domain-blockade"); +const transform_server_event_stream_1 = require("../lib/transform-server-event-stream"); +const puppeteer_1 = require("../services/puppeteer"); +const jsdom_1 = require("../services/jsdom"); +const snapshot_formatter_1 = require("../services/snapshot-formatter"); +const curl_1 = require("../services/curl"); +const lm_1 = require("../services/lm"); +const misc_1 = require("../utils/misc"); +const cf_browser_rendering_1 = require("../services/cf-browser-rendering"); +const logger_1 = require("../services/logger"); +const rate_limit_1 = require("../shared/services/rate-limit"); +const async_context_1 = require("../services/async-context"); +const registry_1 = require("../services/registry"); +const errors_1 = require("../services/errors"); +const openai_1 = require("../shared/utils/openai"); +const proxy_provider_1 = require("../shared/services/proxy-provider"); +const firebase_storage_bucket_1 = require("../shared/services/firebase-storage-bucket"); +const jina_embeddings_auth_1 = require("../dto/jina-embeddings-auth"); +const robots_text_1 = require("../services/robots-text"); +const temp_file_1 = require("../services/temp-file"); +const misc_2 = require("../services/misc"); +const http_1 = require("civkit/http"); +const geoip_1 = require("../services/geoip"); +const indexProto = { + toString: function () { + return (0, lodash_1.default)(this) + .toPairs() + .map(([k, v]) => k ? `[${lodash_1.default.upperFirst(lodash_1.default.lowerCase(k))}] ${v}` : '') + .value() + .join('\n') + '\n'; + } +}; +let CrawlerHost = class CrawlerHost extends civ_rpc_1.RPCHost { + constructor(globalLogger, puppeteerControl, curlControl, cfBrowserRendering, proxyProvider, lmControl, jsdomControl, snapshotFormatter, firebaseObjectStorage, rateLimitControl, threadLocal, robotsTxtService, tempFileManager, geoIpService, miscService) { + super(...arguments); + this.globalLogger = globalLogger; + this.puppeteerControl = puppeteerControl; + this.curlControl = curlControl; + this.cfBrowserRendering = cfBrowserRendering; + this.proxyProvider = proxyProvider; + this.lmControl = lmControl; + this.jsdomControl = jsdomControl; + this.snapshotFormatter = snapshotFormatter; + this.firebaseObjectStorage = firebaseObjectStorage; + this.rateLimitControl = rateLimitControl; + this.threadLocal = threadLocal; + this.robotsTxtService = robotsTxtService; + this.tempFileManager = tempFileManager; + this.geoIpService = geoIpService; + this.miscService = miscService; + this.logger = this.globalLogger.child({ service: this.constructor.name }); + this.cacheRetentionMs = 1000 * 3600 * 24 * 7; + this.cacheValidMs = 1000 * 3600; + this.urlValidMs = 1000 * 3600 * 4; + this.abuseBlockMs = 1000 * 3600; + this.domainProfileRetentionMs = 1000 * 3600 * 24 * 30; + this.batchedCaches = []; + this.proxyIterMap = new WeakMap(); + puppeteerControl.on('crawled', async (snapshot, options) => { + if (!snapshot.title?.trim() && !snapshot.pdfs?.length) { + return; + } + if (options.cookies?.length || options.private) { + // Potential privacy issue, dont cache if cookies are used + return; + } + if (options.injectFrameScripts?.length || options.injectPageScripts?.length || options.viewport) { + // Potentially mangeled content, dont cache if scripts are injected + return; + } + if (snapshot.isIntermediate) { + return; + } + if (!snapshot.lastMutationIdle) { + // Never reached mutationIdle, presumably too short timeout + return; + } + if (options.locale) { + Reflect.set(snapshot, 'locale', options.locale); + } + const analyzed = await this.jsdomControl.analyzeHTMLTextLite(snapshot.html); + if (analyzed.tokens < 200) { + // Does not contain enough content + if (snapshot.status !== 200) { + return; + } + if (snapshot.html.includes('captcha') || snapshot.html.includes('cf-turnstile')) { + return; + } + } + await this.setToCache(options.url, snapshot); + }); + puppeteerControl.on('abuse', async (abuseEvent) => { + this.logger.warn(`Abuse detected on ${abuseEvent.url}, blocking ${abuseEvent.url.hostname}`, { reason: abuseEvent.reason, sn: abuseEvent.sn }); + await domain_blockade_1.DomainBlockade.save(domain_blockade_1.DomainBlockade.from({ + domain: abuseEvent.url.hostname.toLowerCase(), + triggerReason: `${abuseEvent.reason}`, + triggerUrl: abuseEvent.url.toString(), + createdAt: new Date(), + expireAt: new Date(Date.now() + this.abuseBlockMs), + })).catch((err) => { + this.logger.warn(`Failed to save domain blockade for ${abuseEvent.url.hostname}`, { err: (0, lang_1.marshalErrorLike)(err) }); + }); + }); + setInterval(() => { + const thisBatch = this.batchedCaches; + this.batchedCaches = []; + if (!thisBatch.length) { + return; + } + const batch = crawled_1.Crawled.DB.batch(); + for (const x of thisBatch) { + batch.set(crawled_1.Crawled.COLLECTION.doc(x._id), x.degradeForFireStore(), { merge: true }); + } + batch.commit() + .then(() => { + this.logger.debug(`Saved ${thisBatch.length} caches by batch`); + }) + .catch((err) => { + this.logger.warn(`Failed to save cache in batch`, { err }); + }); + }, 1000 * 10 + Math.round(1000 * Math.random())).unref(); + } + async init() { + await this.dependencyReady(); + if (this.puppeteerControl.effectiveUA) { + this.curlControl.impersonateChrome(this.puppeteerControl.effectiveUA); + } + this.emit('ready'); + } + async getIndex(auth) { + const indexObject = Object.create(indexProto); + Object.assign(indexObject, { + usage1: 'https://r.jina.ai/YOUR_URL', + usage2: 'https://s.jina.ai/YOUR_SEARCH_QUERY', + homepage: 'https://jina.ai/reader', + }); + await auth?.solveUID(); + if (auth && auth.user) { + indexObject[''] = undefined; + indexObject.authenticatedAs = `${auth.user.user_id} (${auth.user.full_name})`; + indexObject.balanceLeft = auth.user.wallet.total_balance; + } + return indexObject; + } + async getIndexCtrl(ctx, auth) { + const indexObject = await this.getIndex(auth); + if (!ctx.accepts('text/plain') && (ctx.accepts('text/json') || ctx.accepts('application/json'))) { + return indexObject; + } + return (0, civ_rpc_1.assignTransferProtocolMeta)(`${indexObject}`, { contentType: 'text/plain; charset=utf-8', envelope: null }); + } + async crawl(rpcReflect, ctx, auth, crawlerOptionsHeaderOnly, crawlerOptionsParamsAllowed) { + const uid = await auth.solveUID(); + let chargeAmount = 0; + const crawlerOptions = ctx.method === 'GET' ? crawlerOptionsHeaderOnly : crawlerOptionsParamsAllowed; + const tierPolicy = await this.saasAssertTierPolicy(crawlerOptions, auth); + // Use koa ctx.URL, a standard URL object to avoid node.js framework prop naming confusion + const targetUrl = await this.getTargetUrl((0, misc_1.tryDecodeURIComponent)(`${ctx.URL.pathname}${ctx.URL.search}`), crawlerOptions); + if (!targetUrl) { + return await this.getIndex(auth); + } + // Prevent circular crawling + this.puppeteerControl.circuitBreakerHosts.add(ctx.hostname.toLowerCase()); + if (uid) { + const user = await auth.assertUser(); + if (!(user.wallet.total_balance > 0)) { + throw new errors_1.InsufficientBalanceError(`Account balance not enough to run this query, please recharge.`); + } + const rateLimitPolicy = auth.getRateLimits('CRAWL') || [ + parseInt(user.metadata?.speed_level) >= 2 ? + rate_limit_1.RateLimitDesc.from({ + occurrence: 5000, + periodSeconds: 60 + }) : + rate_limit_1.RateLimitDesc.from({ + occurrence: 500, + periodSeconds: 60 + }) + ]; + const apiRoll = await this.rateLimitControl.simpleRPCUidBasedLimit(rpcReflect, uid, ['CRAWL'], ...rateLimitPolicy); + rpcReflect.finally(() => { + if (crawlerOptions.tokenBudget && chargeAmount > crawlerOptions.tokenBudget) { + return; + } + if (chargeAmount) { + auth.reportUsage(chargeAmount, `reader-crawl`).catch((err) => { + this.logger.warn(`Unable to report usage for ${uid}`, { err: (0, lang_1.marshalErrorLike)(err) }); + }); + apiRoll.chargeAmount = chargeAmount; + } + }); + } + else if (ctx.ip) { + const apiRoll = await this.rateLimitControl.simpleRpcIPBasedLimit(rpcReflect, ctx.ip, ['CRAWL'], [ + // 20 requests per minute + new Date(Date.now() - 60 * 1000), 20 + ]); + rpcReflect.finally(() => { + if (crawlerOptions.tokenBudget && chargeAmount > crawlerOptions.tokenBudget) { + return; + } + apiRoll.chargeAmount = chargeAmount; + }); + } + if (!uid) { + // Enforce no proxy is allocated for anonymous users due to abuse. + crawlerOptions.proxy = 'none'; + const blockade = (await domain_blockade_1.DomainBlockade.fromFirestoreQuery(domain_blockade_1.DomainBlockade.COLLECTION + .where('domain', '==', targetUrl.hostname.toLowerCase()) + .where('expireAt', '>=', new Date()) + .limit(1)))[0]; + if (blockade) { + throw new errors_1.SecurityCompromiseError(`Domain ${targetUrl.hostname} blocked until ${blockade.expireAt || 'Eternally'} due to previous abuse found on ${blockade.triggerUrl || 'site'}: ${blockade.triggerReason}`); + } + } + const crawlOpts = await this.configure(crawlerOptions); + this.logger.info(`Accepting request from ${uid || ctx.ip}`, { opts: crawlerOptions }); + if (crawlerOptions.robotsTxt) { + await this.robotsTxtService.assertAccessAllowed(targetUrl, crawlerOptions.robotsTxt); + } + if (rpcReflect.signal.aborted) { + return; + } + if (!ctx.accepts('text/plain') && ctx.accepts('text/event-stream')) { + const sseStream = new transform_server_event_stream_1.OutputServerEventStream(); + rpcReflect.return(sseStream); + try { + for await (const scrapped of this.iterSnapshots(targetUrl, crawlOpts, crawlerOptions)) { + if (!scrapped) { + continue; + } + if (rpcReflect.signal.aborted) { + break; + } + const formatted = await this.formatSnapshot(crawlerOptions, scrapped, targetUrl, this.urlValidMs, crawlOpts); + chargeAmount = this.assignChargeAmount(formatted, tierPolicy); + sseStream.write({ + event: 'data', + data: formatted, + }); + if (chargeAmount && scrapped.pdfs?.length) { + break; + } + } + } + catch (err) { + this.logger.error(`Failed to crawl ${targetUrl}`, { err: (0, lang_1.marshalErrorLike)(err) }); + sseStream.write({ + event: 'error', + data: (0, lang_1.marshalErrorLike)(err), + }); + } + sseStream.end(); + return sseStream; + } + let lastScrapped; + if (!ctx.accepts('text/plain') && (ctx.accepts('text/json') || ctx.accepts('application/json'))) { + try { + for await (const scrapped of this.iterSnapshots(targetUrl, crawlOpts, crawlerOptions)) { + lastScrapped = scrapped; + if (rpcReflect.signal.aborted) { + break; + } + if (!scrapped || !crawlerOptions.isSnapshotAcceptableForEarlyResponse(scrapped)) { + continue; + } + if (!scrapped.title) { + continue; + } + const formatted = await this.formatSnapshot(crawlerOptions, scrapped, targetUrl, this.urlValidMs, crawlOpts); + chargeAmount = this.assignChargeAmount(formatted, tierPolicy); + if (scrapped?.pdfs?.length && !chargeAmount) { + continue; + } + return formatted; + } + } + catch (err) { + if (!lastScrapped) { + throw err; + } + } + if (!lastScrapped) { + if (crawlOpts.targetSelector) { + throw new civ_rpc_1.AssertionFailureError(`No content available for URL ${targetUrl} with target selector ${Array.isArray(crawlOpts.targetSelector) ? crawlOpts.targetSelector.join(', ') : crawlOpts.targetSelector}`); + } + throw new civ_rpc_1.AssertionFailureError(`No content available for URL ${targetUrl}`); + } + const formatted = await this.formatSnapshot(crawlerOptions, lastScrapped, targetUrl, this.urlValidMs, crawlOpts); + chargeAmount = this.assignChargeAmount(formatted, tierPolicy); + return formatted; + } + if (crawlerOptions.isRequestingCompoundContentFormat()) { + throw new civ_rpc_1.ParamValidationError({ + path: 'respondWith', + message: `You are requesting compound content format, please explicitly accept 'text/event-stream' or 'application/json' in header.` + }); + } + try { + for await (const scrapped of this.iterSnapshots(targetUrl, crawlOpts, crawlerOptions)) { + lastScrapped = scrapped; + if (rpcReflect.signal.aborted) { + break; + } + if (!scrapped || !crawlerOptions.isSnapshotAcceptableForEarlyResponse(scrapped)) { + continue; + } + if (!scrapped.title) { + continue; + } + const formatted = await this.formatSnapshot(crawlerOptions, scrapped, targetUrl, this.urlValidMs, crawlOpts); + chargeAmount = this.assignChargeAmount(formatted, tierPolicy); + if (crawlerOptions.respondWith === 'screenshot' && Reflect.get(formatted, 'screenshotUrl')) { + return (0, civ_rpc_1.assignTransferProtocolMeta)(`${formatted.textRepresentation}`, { code: 302, envelope: null, headers: { Location: Reflect.get(formatted, 'screenshotUrl') } }); + } + if (crawlerOptions.respondWith === 'pageshot' && Reflect.get(formatted, 'pageshotUrl')) { + return (0, civ_rpc_1.assignTransferProtocolMeta)(`${formatted.textRepresentation}`, { code: 302, envelope: null, headers: { Location: Reflect.get(formatted, 'pageshotUrl') } }); + } + return (0, civ_rpc_1.assignTransferProtocolMeta)(`${formatted.textRepresentation}`, { contentType: 'text/plain; charset=utf-8', envelope: null }); + } + } + catch (err) { + if (!lastScrapped) { + throw err; + } + } + if (!lastScrapped) { + if (crawlOpts.targetSelector) { + throw new civ_rpc_1.AssertionFailureError(`No content available for URL ${targetUrl} with target selector ${Array.isArray(crawlOpts.targetSelector) ? crawlOpts.targetSelector.join(', ') : crawlOpts.targetSelector}`); + } + throw new civ_rpc_1.AssertionFailureError(`No content available for URL ${targetUrl}`); + } + const formatted = await this.formatSnapshot(crawlerOptions, lastScrapped, targetUrl, this.urlValidMs, crawlOpts); + chargeAmount = this.assignChargeAmount(formatted, tierPolicy); + if (crawlerOptions.respondWith === 'screenshot' && Reflect.get(formatted, 'screenshotUrl')) { + return (0, civ_rpc_1.assignTransferProtocolMeta)(`${formatted.textRepresentation}`, { code: 302, envelope: null, headers: { Location: Reflect.get(formatted, 'screenshotUrl') } }); + } + if (crawlerOptions.respondWith === 'pageshot' && Reflect.get(formatted, 'pageshotUrl')) { + return (0, civ_rpc_1.assignTransferProtocolMeta)(`${formatted.textRepresentation}`, { code: 302, envelope: null, headers: { Location: Reflect.get(formatted, 'pageshotUrl') } }); + } + return (0, civ_rpc_1.assignTransferProtocolMeta)(`${formatted.textRepresentation}`, { contentType: 'text/plain; charset=utf-8', envelope: null }); + } + async getTargetUrl(originPath, crawlerOptions) { + let url = ''; + const targetUrlFromGet = originPath.slice(1); + if (crawlerOptions.pdf) { + const pdfFile = crawlerOptions.pdf; + const identifier = pdfFile instanceof fancy_file_1.FancyFile ? (await pdfFile.sha256Sum) : (0, crypto_1.randomUUID)(); + url = `blob://pdf/${identifier}`; + crawlerOptions.url ??= url; + } + else if (targetUrlFromGet) { + url = targetUrlFromGet.trim(); + } + else if (crawlerOptions.url) { + url = crawlerOptions.url.trim(); + } + if (!url) { + throw new civ_rpc_1.ParamValidationError({ + message: 'No URL provided', + path: 'url' + }); + } + const { url: safeURL, ips } = await this.miscService.assertNormalizedUrl(url); + if (this.puppeteerControl.circuitBreakerHosts.has(safeURL.hostname.toLowerCase())) { + throw new errors_1.SecurityCompromiseError({ + message: `Circular hostname: ${safeURL.protocol}`, + path: 'url' + }); + } + crawlerOptions._hintIps = ips; + return safeURL; + } + getUrlDigest(urlToCrawl) { + const normalizedURL = new URL(urlToCrawl); + if (!normalizedURL.hash.startsWith('#/')) { + normalizedURL.hash = ''; + } + const normalizedUrl = normalizedURL.toString().toLowerCase(); + const digest = snapshot_formatter_1.md5Hasher.hash(normalizedUrl.toString()); + return digest; + } + async *queryCache(urlToCrawl, cacheTolerance) { + const digest = this.getUrlDigest(urlToCrawl); + const cache = (await (crawled_1.Crawled.fromFirestoreQuery(crawled_1.Crawled.COLLECTION.where('urlPathDigest', '==', digest).orderBy('createdAt', 'desc').limit(1)).catch((err) => { + this.logger.warn(`Failed to query cache, unknown issue`, { err }); + // https://github.com/grpc/grpc-node/issues/2647 + // https://github.com/googleapis/nodejs-firestore/issues/1023 + // https://github.com/googleapis/nodejs-firestore/issues/1023 + return undefined; + })))?.[0]; + yield cache; + if (!cache) { + return; + } + const age = Date.now() - cache.createdAt.valueOf(); + const stale = cache.createdAt.valueOf() < (Date.now() - cacheTolerance); + this.logger.info(`${stale ? 'Stale cache exists' : 'Cache hit'} for ${urlToCrawl}, normalized digest: ${digest}, ${age}ms old, tolerance ${cacheTolerance}ms`, { + url: urlToCrawl, digest, age, stale, cacheTolerance + }); + let snapshot; + let screenshotUrl; + let pageshotUrl; + const preparations = [ + this.firebaseObjectStorage.downloadFile(`snapshots/${cache._id}`).then((r) => { + snapshot = JSON.parse(r.toString('utf-8')); + }), + cache.screenshotAvailable ? + this.firebaseObjectStorage.signDownloadUrl(`screenshots/${cache._id}`, Date.now() + this.urlValidMs).then((r) => { + screenshotUrl = r; + }) : + Promise.resolve(undefined), + cache.pageshotAvailable ? + this.firebaseObjectStorage.signDownloadUrl(`pageshots/${cache._id}`, Date.now() + this.urlValidMs).then((r) => { + pageshotUrl = r; + }) : + Promise.resolve(undefined) + ]; + try { + await Promise.all(preparations); + } + catch (_err) { + // Swallow cache errors. + return undefined; + } + yield { + isFresh: !stale, + ...cache, + snapshot: { + ...snapshot, + screenshot: undefined, + pageshot: undefined, + screenshotUrl, + pageshotUrl, + } + }; + } + async setToCache(urlToCrawl, snapshot) { + const digest = this.getUrlDigest(urlToCrawl); + this.logger.info(`Caching snapshot of ${urlToCrawl}...`, { url: urlToCrawl, digest, title: snapshot?.title, href: snapshot?.href }); + const nowDate = new Date(); + const cache = crawled_1.Crawled.from({ + _id: (0, crypto_1.randomUUID)(), + url: urlToCrawl.toString(), + createdAt: nowDate, + expireAt: new Date(nowDate.valueOf() + this.cacheRetentionMs), + htmlSignificantlyModifiedByJs: snapshot.htmlSignificantlyModifiedByJs, + urlPathDigest: digest, + }); + const savingOfSnapshot = this.firebaseObjectStorage.saveFile(`snapshots/${cache._id}`, Buffer.from(JSON.stringify({ + ...snapshot, + screenshot: undefined, + pageshot: undefined, + }), 'utf-8'), { + metadata: { + contentType: 'application/json', + } + }).then((r) => { + cache.snapshotAvailable = true; + return r; + }); + if (snapshot.screenshot) { + await this.firebaseObjectStorage.saveFile(`screenshots/${cache._id}`, snapshot.screenshot, { + metadata: { + contentType: 'image/png', + } + }); + cache.screenshotAvailable = true; + } + if (snapshot.pageshot) { + await this.firebaseObjectStorage.saveFile(`pageshots/${cache._id}`, snapshot.pageshot, { + metadata: { + contentType: 'image/png', + } + }); + cache.pageshotAvailable = true; + } + await savingOfSnapshot; + this.batchedCaches.push(cache); + // const r = await Crawled.save(cache.degradeForFireStore()).catch((err) => { + // this.logger.error(`Failed to save cache for ${urlToCrawl}`, { err: marshalErrorLike(err) }); + // return undefined; + // }); + return cache; + } + async *iterSnapshots(urlToCrawl, crawlOpts, crawlerOpts) { + // if (crawlerOpts?.respondWith.includes(CONTENT_FORMAT.VLM)) { + // const finalBrowserSnapshot = await this.getFinalSnapshot(urlToCrawl, { + // ...crawlOpts, engine: ENGINE_TYPE.BROWSER + // }, crawlerOpts); + // yield* this.lmControl.geminiFromBrowserSnapshot(finalBrowserSnapshot); + // return; + // } + if (crawlerOpts?.respondWith.includes(crawler_options_1.CONTENT_FORMAT.READER_LM)) { + const finalAutoSnapshot = await this.getFinalSnapshot(urlToCrawl, { + ...crawlOpts, + engine: crawlOpts?.engine || crawler_options_1.ENGINE_TYPE.AUTO, + }, crawler_options_1.CrawlerOptions.from({ + ...crawlerOpts, + respondWith: 'html', + })); + if (!finalAutoSnapshot?.html) { + throw new civ_rpc_1.AssertionFailureError(`Unexpected non HTML content for ReaderLM: ${urlToCrawl}`); + } + if (crawlerOpts?.instruction || crawlerOpts?.jsonSchema) { + const jsonSchema = crawlerOpts.jsonSchema ? JSON.stringify(crawlerOpts.jsonSchema, undefined, 2) : undefined; + yield* this.lmControl.readerLMFromSnapshot(crawlerOpts.instruction, jsonSchema, finalAutoSnapshot); + return; + } + try { + yield* this.lmControl.readerLMMarkdownFromSnapshot(finalAutoSnapshot); + } + catch (err) { + if (err instanceof http_1.HTTPServiceError && err.status === 429) { + throw new errors_1.ServiceNodeResourceDrainError(`Reader LM is at capacity, please try again later.`); + } + throw err; + } + return; + } + yield* this.cachedScrap(urlToCrawl, crawlOpts, crawlerOpts); + } + async *cachedScrap(urlToCrawl, crawlOpts, crawlerOpts) { + if (crawlerOpts?.html) { + const snapshot = { + href: urlToCrawl.toString(), + html: crawlerOpts.html, + title: '', + text: '', + }; + yield this.jsdomControl.narrowSnapshot(snapshot, crawlOpts); + return; + } + if (crawlerOpts?.pdf) { + const pdfFile = crawlerOpts.pdf instanceof fancy_file_1.FancyFile ? crawlerOpts.pdf : this.tempFileManager.cacheBuffer(Buffer.from(crawlerOpts.pdf, 'base64')); + const pdfLocalPath = (0, url_1.pathToFileURL)((await pdfFile.filePath)); + const snapshot = { + href: urlToCrawl.toString(), + html: ``, + title: '', + text: '', + pdfs: [pdfLocalPath.href], + }; + yield this.jsdomControl.narrowSnapshot(snapshot, crawlOpts); + return; + } + if (crawlOpts?.engine === crawler_options_1.ENGINE_TYPE.CURL || + // deprecated name + crawlOpts?.engine === 'direct') { + let sideLoaded; + try { + sideLoaded = (crawlOpts?.allocProxy && !crawlOpts?.proxyUrl) ? + await this.sideLoadWithAllocatedProxy(urlToCrawl, crawlOpts) : + await this.curlControl.sideLoad(urlToCrawl, crawlOpts); + } + catch (err) { + if (err instanceof errors_1.ServiceBadAttemptError) { + throw new civ_rpc_1.AssertionFailureError(err.message); + } + throw err; + } + if (!sideLoaded?.file) { + throw new civ_rpc_1.AssertionFailureError(`Remote server did not return a body: ${urlToCrawl}`); + } + const draftSnapshot = await this.snapshotFormatter.createSnapshotFromFile(urlToCrawl, sideLoaded.file, sideLoaded.contentType, sideLoaded.fileName); + draftSnapshot.status = sideLoaded.status; + draftSnapshot.statusText = sideLoaded.statusText; + yield this.jsdomControl.narrowSnapshot(draftSnapshot, crawlOpts); + return; + } + if (crawlOpts?.engine === crawler_options_1.ENGINE_TYPE.CF_BROWSER_RENDERING) { + const html = await this.cfBrowserRendering.fetchContent(urlToCrawl.href); + const snapshot = { + href: urlToCrawl.toString(), + html, + title: '', + text: '', + }; + yield this.jsdomControl.narrowSnapshot(snapshot, crawlOpts); + return; + } + const cacheTolerance = crawlerOpts?.cacheTolerance ?? this.cacheValidMs; + const cacheIt = this.queryCache(urlToCrawl, cacheTolerance); + let cache = (await cacheIt.next()).value; + if (cache?.htmlSignificantlyModifiedByJs === false) { + if (crawlerOpts && crawlerOpts.timeout === undefined) { + crawlerOpts.respondTiming ??= crawler_options_1.RESPOND_TIMING.HTML; + } + } + if (!crawlerOpts || crawlerOpts.isCacheQueryApplicable()) { + cache = (await cacheIt.next()).value; + } + cacheIt.return(undefined); + if (cache?.isFresh && + (!crawlOpts?.favorScreenshot || (crawlOpts?.favorScreenshot && (cache.screenshotAvailable && cache.pageshotAvailable))) && + (lodash_1.default.get(cache.snapshot, 'locale') === crawlOpts?.locale)) { + if (cache.snapshot) { + cache.snapshot.isFromCache = true; + } + yield this.jsdomControl.narrowSnapshot(cache.snapshot, crawlOpts); + return; + } + if (crawlOpts?.engine !== crawler_options_1.ENGINE_TYPE.BROWSER && !this.knownUrlThatSideLoadingWouldCrashTheBrowser(urlToCrawl)) { + const sideLoadSnapshotPermitted = crawlerOpts?.browserIsNotRequired() && + [crawler_options_1.RESPOND_TIMING.HTML, crawler_options_1.RESPOND_TIMING.VISIBLE_CONTENT].includes(crawlerOpts.presumedRespondTiming); + try { + const altOpts = { ...crawlOpts }; + let sideLoaded = (crawlOpts?.allocProxy && !crawlOpts?.proxyUrl) ? + await this.sideLoadWithAllocatedProxy(urlToCrawl, altOpts) : + await this.curlControl.sideLoad(urlToCrawl, altOpts).catch((err) => { + this.logger.warn(`Failed to side load ${urlToCrawl.origin}`, { err: (0, lang_1.marshalErrorLike)(err), href: urlToCrawl.href }); + if (err instanceof civ_rpc_1.ApplicationError && !(err instanceof errors_1.ServiceBadAttemptError)) { + return Promise.reject(err); + } + return this.sideLoadWithAllocatedProxy(urlToCrawl, altOpts); + }); + if (!sideLoaded.file) { + throw new errors_1.ServiceBadAttemptError(`Remote server did not return a body: ${urlToCrawl}`); + } + const draftSnapshot = await this.snapshotFormatter.createSnapshotFromFile(urlToCrawl, sideLoaded.file, sideLoaded.contentType, sideLoaded.fileName).catch((err) => { + if (err instanceof civ_rpc_1.ApplicationError) { + return Promise.reject(new errors_1.ServiceBadAttemptError(err.message)); + } + return Promise.reject(err); + }); + draftSnapshot.status = sideLoaded.status; + draftSnapshot.statusText = sideLoaded.statusText; + if (sideLoaded.status == 200 && !sideLoaded.contentType.startsWith('text/html')) { + yield draftSnapshot; + return; + } + let analyzed = await this.jsdomControl.analyzeHTMLTextLite(draftSnapshot.html); + draftSnapshot.title ??= analyzed.title; + draftSnapshot.isIntermediate = true; + if (sideLoadSnapshotPermitted) { + yield this.jsdomControl.narrowSnapshot(draftSnapshot, crawlOpts); + } + let fallbackProxyIsUsed = false; + if (((!crawlOpts?.allocProxy || crawlOpts.allocProxy !== 'none') && !crawlOpts?.proxyUrl) && + (analyzed.tokens < 42 || sideLoaded.status !== 200)) { + const proxyLoaded = await this.sideLoadWithAllocatedProxy(urlToCrawl, altOpts); + if (!proxyLoaded.file) { + throw new errors_1.ServiceBadAttemptError(`Remote server did not return a body: ${urlToCrawl}`); + } + const proxySnapshot = await this.snapshotFormatter.createSnapshotFromFile(urlToCrawl, proxyLoaded.file, proxyLoaded.contentType, proxyLoaded.fileName).catch((err) => { + if (err instanceof civ_rpc_1.ApplicationError) { + return Promise.reject(new errors_1.ServiceBadAttemptError(err.message)); + } + return Promise.reject(err); + }); + proxySnapshot.status = proxyLoaded.status; + proxySnapshot.statusText = proxyLoaded.statusText; + if (proxyLoaded.status === 200 && crawlerOpts?.browserIsNotRequired()) { + } + analyzed = await this.jsdomControl.analyzeHTMLTextLite(proxySnapshot.html); + if (proxyLoaded.status === 200 || analyzed.tokens >= 200) { + proxySnapshot.isIntermediate = true; + if (sideLoadSnapshotPermitted) { + yield this.jsdomControl.narrowSnapshot(proxySnapshot, crawlOpts); + } + sideLoaded = proxyLoaded; + fallbackProxyIsUsed = true; + } + } + if (crawlOpts && (sideLoaded.status === 200 || analyzed.tokens >= 200 || crawlOpts.allocProxy)) { + this.logger.info(`Side load seems to work, applying to crawler.`, { url: urlToCrawl.href }); + crawlOpts.sideLoad ??= sideLoaded.sideLoadOpts; + if (fallbackProxyIsUsed) { + this.logger.info(`Proxy seems to salvage the page`, { url: urlToCrawl.href }); + } + } + } + catch (err) { + this.logger.warn(`Failed to side load ${urlToCrawl.origin}`, { err: (0, lang_1.marshalErrorLike)(err), href: urlToCrawl.href }); + if (err instanceof civ_rpc_1.ApplicationError && + !(err instanceof errors_1.ServiceBadAttemptError) && + !(err instanceof civ_rpc_1.DataStreamBrokenError)) { + throw err; + } + } + } + else if (crawlOpts?.allocProxy && crawlOpts.allocProxy !== 'none' && !crawlOpts.proxyUrl) { + const proxyUrl = await this.proxyProvider.alloc(this.figureOutBestProxyCountry(crawlOpts)); + crawlOpts.proxyUrl = proxyUrl.href; + } + try { + if (crawlOpts?.targetSelector || crawlOpts?.removeSelector || crawlOpts?.withIframe || crawlOpts?.withShadowDom) { + for await (const x of this.puppeteerControl.scrap(urlToCrawl, crawlOpts)) { + yield this.jsdomControl.narrowSnapshot(x, crawlOpts); + } + return; + } + yield* this.puppeteerControl.scrap(urlToCrawl, crawlOpts); + } + catch (err) { + if (cache && !(err instanceof errors_1.SecurityCompromiseError)) { + this.logger.warn(`Failed to scrap ${urlToCrawl}, but a stale cache is available. Falling back to cache`, { err: (0, lang_1.marshalErrorLike)(err) }); + yield this.jsdomControl.narrowSnapshot(cache.snapshot, crawlOpts); + return; + } + throw err; + } + } + assignChargeAmount(formatted, saasTierPolicy) { + if (!formatted) { + return 0; + } + let amount = 0; + if (formatted.content) { + amount = (0, openai_1.countGPTToken)(formatted.content); + } + else if (formatted.description) { + amount += (0, openai_1.countGPTToken)(formatted.description); + } + if (formatted.text) { + amount += (0, openai_1.countGPTToken)(formatted.text); + } + if (formatted.html) { + amount += (0, openai_1.countGPTToken)(formatted.html); + } + if (formatted.screenshotUrl || formatted.screenshot) { + // OpenAI image token count for 1024x1024 image + amount += 765; + } + if (saasTierPolicy) { + amount = this.saasApplyTierPolicy(saasTierPolicy, amount); + } + Object.assign(formatted, { usage: { tokens: amount } }); + (0, civ_rpc_1.assignMeta)(formatted, { usage: { tokens: amount } }); + return amount; + } + async *scrapMany(urls, options, crawlerOpts) { + const iterators = urls.map((url) => this.cachedScrap(url, options, crawlerOpts)); + const results = iterators.map((_x) => undefined); + let nextDeferred = (0, defer_1.Defer)(); + let concluded = false; + const handler = async (it, idx) => { + try { + for await (const x of it) { + results[idx] = x; + if (x) { + nextDeferred.resolve(); + nextDeferred = (0, defer_1.Defer)(); + } + } + } + catch (err) { + this.logger.warn(`Failed to scrap ${urls[idx]}`, { err: (0, lang_1.marshalErrorLike)(err) }); + } + }; + Promise.allSettled(iterators.map((it, idx) => handler(it, idx))).finally(() => { + concluded = true; + nextDeferred.resolve(); + }); + yield results; + try { + while (!concluded) { + await nextDeferred.promise; + yield results; + } + yield results; + } + finally { + for (const x of iterators) { + x.return(); + } + } + } + async configure(opts) { + this.threadLocal.set('withGeneratedAlt', opts.withGeneratedAlt); + this.threadLocal.set('withLinksSummary', opts.withLinksSummary); + this.threadLocal.set('withImagesSummary', opts.withImagesSummary); + this.threadLocal.set('keepImgDataUrl', opts.keepImgDataUrl); + this.threadLocal.set('cacheTolerance', opts.cacheTolerance); + this.threadLocal.set('withIframe', opts.withIframe); + this.threadLocal.set('withShadowDom', opts.withShadowDom); + this.threadLocal.set('userAgent', opts.userAgent); + if (opts.timeout) { + this.threadLocal.set('timeout', opts.timeout * 1000); + } + this.threadLocal.set('retainImages', opts.retainImages); + this.threadLocal.set('noGfm', opts.noGfm); + this.threadLocal.set('DNT', Boolean(opts.doNotTrack)); + if (opts.markdown) { + this.threadLocal.set('turndownOpts', opts.markdown); + } + const crawlOpts = { + proxyUrl: opts.proxyUrl, + cookies: opts.setCookies, + favorScreenshot: ['screenshot', 'pageshot'].some((x) => opts.respondWith.includes(x)), + removeSelector: opts.removeSelector, + targetSelector: opts.targetSelector, + waitForSelector: opts.waitForSelector, + overrideUserAgent: opts.userAgent, + timeoutMs: opts.timeout ? opts.timeout * 1000 : undefined, + withIframe: opts.withIframe, + withShadowDom: opts.withShadowDom, + locale: opts.locale, + referer: opts.referer, + viewport: opts.viewport, + engine: opts.engine, + allocProxy: opts.proxy?.endsWith('+') ? opts.proxy.slice(0, -1) : opts.proxy, + proxyResources: (opts.proxyUrl || opts.proxy?.endsWith('+')) ? true : false, + private: Boolean(opts.doNotTrack), + }; + if (crawlOpts.targetSelector?.length) { + if (typeof crawlOpts.targetSelector === 'string') { + crawlOpts.targetSelector = [crawlOpts.targetSelector]; + } + for (const s of crawlOpts.targetSelector) { + for (const e of s.split(',').map((x) => x.trim())) { + if (e.startsWith('*') || e.startsWith(':') || e.includes('*:')) { + throw new civ_rpc_1.ParamValidationError({ + message: `Unacceptable selector: '${e}'. We cannot accept match-all selector for performance reasons. Sorry.`, + path: 'targetSelector' + }); + } + } + } + } + if (opts._hintIps?.length) { + const hints = await this.geoIpService.lookupCities(opts._hintIps); + const board = {}; + for (const x of hints) { + if (x.country?.code) { + board[x.country.code] = (board[x.country.code] || 0) + 1; + } + } + const hintCountry = lodash_1.default.maxBy(Array.from(Object.entries(board)), 1)?.[0]; + crawlOpts.countryHint = hintCountry?.toLowerCase(); + } + if (opts.locale) { + crawlOpts.extraHeaders ??= {}; + crawlOpts.extraHeaders['Accept-Language'] = opts.locale; + } + if (opts.respondWith.includes(crawler_options_1.CONTENT_FORMAT.VLM)) { + crawlOpts.favorScreenshot = true; + } + if (opts.injectFrameScript?.length) { + crawlOpts.injectFrameScripts = (await Promise.all(opts.injectFrameScript.map((x) => { + if (URL.canParse(x)) { + return fetch(x).then((r) => r.text()); + } + return x; + }))).filter(Boolean); + } + if (opts.injectPageScript?.length) { + crawlOpts.injectPageScripts = (await Promise.all(opts.injectPageScript.map((x) => { + if (URL.canParse(x)) { + return fetch(x).then((r) => r.text()); + } + return x; + }))).filter(Boolean); + } + return crawlOpts; + } + async formatSnapshot(crawlerOptions, snapshot, nominalUrl, urlValidMs, scrappingOptions) { + const presumedURL = crawlerOptions.base === 'final' ? new URL(snapshot.href) : nominalUrl; + const respondWith = crawlerOptions.respondWith; + if (respondWith === crawler_options_1.CONTENT_FORMAT.READER_LM || respondWith === crawler_options_1.CONTENT_FORMAT.VLM) { + const output = { + title: snapshot.title, + content: snapshot.parsed?.textContent, + url: presumedURL?.href || snapshot.href, + }; + Object.defineProperty(output, 'textRepresentation', { + value: snapshot.parsed?.textContent, + enumerable: false, + }); + return output; + } + return this.formatSnapshotWithPDFSideLoad(respondWith, snapshot, presumedURL, urlValidMs, scrappingOptions); + } + async formatSnapshotWithPDFSideLoad(mode, snapshot, nominalUrl, urlValidMs, scrappingOptions) { + const snapshotCopy = lodash_1.default.cloneDeep(snapshot); + if (snapshotCopy.pdfs?.length) { + const pdfUrl = snapshotCopy.pdfs[0]; + if (pdfUrl.startsWith('http')) { + const sideLoaded = scrappingOptions?.sideLoad?.impersonate[pdfUrl]; + if (sideLoaded?.status === 200 && sideLoaded.body) { + snapshotCopy.pdfs[0] = (0, url_1.pathToFileURL)(await sideLoaded?.body.filePath).href; + return this.snapshotFormatter.formatSnapshot(mode, snapshotCopy, nominalUrl, urlValidMs); + } + const r = await this.curlControl.sideLoad(new URL(pdfUrl), scrappingOptions).catch((err) => { + if (err instanceof errors_1.ServiceBadAttemptError) { + return Promise.reject(new civ_rpc_1.AssertionFailureError(`Failed to load PDF(${pdfUrl}): ${err.message}`)); + } + return Promise.reject(err); + }); + if (r.status !== 200) { + throw new civ_rpc_1.AssertionFailureError(`Failed to load PDF(${pdfUrl}): Server responded status ${r.status}`); + } + if (!r.contentType.includes('application/pdf')) { + throw new civ_rpc_1.AssertionFailureError(`Failed to load PDF(${pdfUrl}): Server responded with wrong content type ${r.contentType}`); + } + if (!r.file) { + throw new civ_rpc_1.AssertionFailureError(`Failed to load PDF(${pdfUrl}): Server did not return a body`); + } + snapshotCopy.pdfs[0] = (0, url_1.pathToFileURL)(await r.file.filePath).href; + } + } + return this.snapshotFormatter.formatSnapshot(mode, snapshotCopy, nominalUrl, urlValidMs); + } + async getFinalSnapshot(url, opts, crawlerOptions) { + const it = this.cachedScrap(url, opts, crawlerOptions); + let lastSnapshot; + let lastError; + try { + for await (const x of it) { + lastSnapshot = x; + } + } + catch (err) { + lastError = err; + } + if (!lastSnapshot && lastError) { + throw lastError; + } + if (!lastSnapshot) { + throw new civ_rpc_1.AssertionFailureError(`No content available`); + } + return lastSnapshot; + } + async simpleCrawl(mode, url, opts) { + const it = this.iterSnapshots(url, { ...opts, minIntervalMs: 500 }); + let lastSnapshot; + let goodEnough = false; + try { + for await (const x of it) { + lastSnapshot = x; + if (goodEnough) { + break; + } + if (lastSnapshot?.parsed?.content) { + // After it's good enough, wait for next snapshot; + goodEnough = true; + } + } + } + catch (err) { + if (lastSnapshot) { + return this.snapshotFormatter.formatSnapshot(mode, lastSnapshot, url, this.urlValidMs); + } + throw err; + } + if (!lastSnapshot) { + throw new civ_rpc_1.AssertionFailureError(`No content available`); + } + return this.snapshotFormatter.formatSnapshot(mode, lastSnapshot, url, this.urlValidMs); + } + getDomainProfileUrlDigest(url) { + const pathname = url.pathname; + const pathVec = pathname.split('/'); + const parentPath = pathVec.slice(0, -1).join('/'); + const finalPath = parentPath || pathname; + const key = url.origin.toLocaleLowerCase() + finalPath; + return { + digest: snapshot_formatter_1.md5Hasher.hash(key), + path: finalPath, + }; + } + async sideLoadWithAllocatedProxy(url, opts) { + if (opts?.allocProxy === 'none') { + return this.curlControl.sideLoad(url, opts); + } + let proxy; + if (opts) { + let it = this.proxyIterMap.get(opts); + if (!it) { + it = this.proxyProvider.iterAlloc(this.figureOutBestProxyCountry(opts)); + this.proxyIterMap.set(opts, it); + } + proxy = (await it.next()).value; + } + proxy ??= await this.proxyProvider.alloc(this.figureOutBestProxyCountry(opts)); + this.logger.debug(`Proxy allocated`, { proxy: proxy.href }); + const r = await this.curlControl.sideLoad(url, { + ...opts, + proxyUrl: proxy.href, + }); + if (opts && opts.allocProxy) { + opts.proxyUrl ??= proxy.href; + } + return { ...r, proxy }; + } + figureOutBestProxyCountry(opts) { + if (!opts) { + return 'auto'; + } + let draft; + if (opts.allocProxy) { + if (this.proxyProvider.supports(opts.allocProxy)) { + draft = opts.allocProxy; + } + else if (opts.allocProxy === 'none') { + return 'none'; + } + } + if (opts.countryHint) { + if (this.proxyProvider.supports(opts.countryHint)) { + draft ??= opts.countryHint; + } + } + draft ??= opts.allocProxy || 'auto'; + return draft; + } + knownUrlThatSideLoadingWouldCrashTheBrowser(url) { + if (url.hostname === 'chromewebstore.google.com') { + return true; + } + return false; + } + async saasAssertTierPolicy(opts, auth) { + let chargeScalar = 1; + let minimalCharge = 0; + if (opts.withGeneratedAlt) { + await auth.assertTier(0, 'Alt text generation'); + minimalCharge = 765; + } + if (opts.injectPageScript || opts.injectFrameScript) { + await auth.assertTier(0, 'Script injection'); + minimalCharge = 4_000; + } + if (opts.withIframe) { + await auth.assertTier(0, 'Iframe'); + } + if (opts.engine === crawler_options_1.ENGINE_TYPE.CF_BROWSER_RENDERING) { + await auth.assertTier(0, 'Cloudflare browser rendering'); + minimalCharge = 4_000; + } + if (opts.respondWith.includes('lm') || opts.engine?.includes('lm')) { + await auth.assertTier(0, 'Language model'); + minimalCharge = 4_000; + chargeScalar = 3; + } + if (opts.proxy && opts.proxy !== 'none') { + await auth.assertTier(['auto', 'any'].includes(opts.proxy) ? 0 : 2, 'Proxy allocation'); + chargeScalar = 5; + } + return { + budget: opts.tokenBudget || 0, + chargeScalar, + minimalCharge, + }; + } + saasApplyTierPolicy(policy, chargeAmount) { + const effectiveChargeAmount = policy.chargeScalar * Math.max(chargeAmount, policy.minimalCharge); + if (policy.budget && policy.budget < effectiveChargeAmount) { + throw new errors_1.BudgetExceededError(`Token budget (${policy.budget}) exceeded, intended charge amount ${effectiveChargeAmount}`); + } + return effectiveChargeAmount; + } +}; +exports.CrawlerHost = CrawlerHost; +__decorate([ + (0, registry_1.Method)({ + name: 'getIndex', + description: 'Index of the service', + proto: { + http: { + action: 'get', + path: '/', + } + }, + tags: ['misc', 'crawl'], + returnType: [String, Object], + }), + __param(0, (0, registry_1.Ctx)()), + __param(1, (0, registry_1.Param)({ required: false })), + __metadata("design:type", Function), + __metadata("design:paramtypes", [typeof (_c = typeof registry_1.Context !== "undefined" && registry_1.Context) === "function" ? _c : Object, jina_embeddings_auth_1.JinaEmbeddingsAuthDTO]), + __metadata("design:returntype", Promise) +], CrawlerHost.prototype, "getIndexCtrl", null); +__decorate([ + (0, registry_1.Method)({ + name: 'crawlByPostingToIndex', + description: 'Crawl any url into markdown', + proto: { + http: { + action: 'POST', + path: '/', + } + }, + tags: ['crawl'], + returnType: [String, transform_server_event_stream_1.OutputServerEventStream], + }), + (0, registry_1.Method)({ + description: 'Crawl any url into markdown', + proto: { + http: { + action: ['GET', 'POST'], + path: '::url', + } + }, + tags: ['crawl'], + returnType: [String, transform_server_event_stream_1.OutputServerEventStream, civ_rpc_1.RawString], + }), + __param(0, (0, registry_1.RPCReflect)()), + __param(1, (0, registry_1.Ctx)()), + __metadata("design:type", Function), + __metadata("design:paramtypes", [typeof (_d = typeof civ_rpc_1.RPCReflection !== "undefined" && civ_rpc_1.RPCReflection) === "function" ? _d : Object, typeof (_e = typeof registry_1.Context !== "undefined" && registry_1.Context) === "function" ? _e : Object, jina_embeddings_auth_1.JinaEmbeddingsAuthDTO, + crawler_options_1.CrawlerOptionsHeaderOnly, + crawler_options_1.CrawlerOptions]), + __metadata("design:returntype", Promise) +], CrawlerHost.prototype, "crawl", null); +__decorate([ + (0, decorators_1.retryWith)((err) => { + if (err instanceof errors_1.ServiceBadApproachError) { + return false; + } + if (err instanceof errors_1.ServiceBadAttemptError) { + // Keep trying + return true; + } + if (err instanceof civ_rpc_1.ApplicationError) { + // Quit with this error + return false; + } + return undefined; + }, 3), + __metadata("design:type", Function), + __metadata("design:paramtypes", [typeof (_f = typeof URL !== "undefined" && URL) === "function" ? _f : Object, Object]), + __metadata("design:returntype", Promise) +], CrawlerHost.prototype, "sideLoadWithAllocatedProxy", null); +exports.CrawlerHost = CrawlerHost = __decorate([ + (0, tsyringe_1.singleton)(), + __metadata("design:paramtypes", [logger_1.GlobalLogger, + puppeteer_1.PuppeteerControl, + curl_1.CurlControl, + cf_browser_rendering_1.CFBrowserRendering, typeof (_a = typeof proxy_provider_1.ProxyProviderService !== "undefined" && proxy_provider_1.ProxyProviderService) === "function" ? _a : Object, lm_1.LmControl, + jsdom_1.JSDomControl, + snapshot_formatter_1.SnapshotFormatter, + firebase_storage_bucket_1.FirebaseStorageBucketControl, typeof (_b = typeof rate_limit_1.RateLimitControl !== "undefined" && rate_limit_1.RateLimitControl) === "function" ? _b : Object, async_context_1.AsyncLocalContext, + robots_text_1.RobotsTxtService, + temp_file_1.TempFileManager, + geoip_1.GeoIPService, + misc_2.MiscService]) +], CrawlerHost); +//# sourceMappingURL=crawler.js.map \ No newline at end of file diff --git a/build/api/crawler.js.map b/build/api/crawler.js.map new file mode 100644 index 0000000000000000000000000000000000000000..76ec163211f757fb6f81da0b21ba4b9f9b9d380d --- /dev/null +++ b/build/api/crawler.js.map @@ -0,0 +1 @@ +{"version":3,"file":"crawler.js","sourceRoot":"","sources":["../../src/api/crawler.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/build/api/searcher.js b/build/api/searcher.js new file mode 100644 index 0000000000000000000000000000000000000000..a25ceb1a1244958bf51d8b6ea7d0d3a46117acb0 --- /dev/null +++ b/build/api/searcher.js @@ -0,0 +1,771 @@ +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var __param = (this && this.__param) || function (paramIndex, decorator) { + return function (target, key) { decorator(target, key, paramIndex); } +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +var _a, _b, _c, _d, _e, _f; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.SearcherHost = void 0; +const tsyringe_1 = require("tsyringe"); +const civ_rpc_1 = require("civkit/civ-rpc"); +const lang_1 = require("civkit/lang"); +const hash_1 = require("civkit/hash"); +const lodash_1 = __importDefault(require("lodash")); +const rate_limit_1 = require("../shared/services/rate-limit"); +const crawler_1 = require("./crawler"); +const crawler_options_1 = require("../dto/crawler-options"); +const snapshot_formatter_1 = require("../services/snapshot-formatter"); +const serper_search_1 = require("../services/serper-search"); +const logger_1 = require("../services/logger"); +const async_context_1 = require("../services/async-context"); +const registry_1 = require("../services/registry"); +const transform_server_event_stream_1 = require("../lib/transform-server-event-stream"); +const jina_embeddings_auth_1 = require("../dto/jina-embeddings-auth"); +const errors_1 = require("../services/errors"); +// import { SerperBingSearchService, SerperGoogleSearchService } from '../services/serp/serper'; +const misc_1 = require("../utils/misc"); +const lru_cache_1 = require("lru-cache"); +const api_roll_1 = require("../shared/db/api-roll"); +const searched_1 = require("../db/searched"); +// import { SerperSearchQueryParams, WORLD_COUNTRIES, WORLD_LANGUAGES } from '../shared/3rd-party/serper-search'; +const internal_1 = require("../services/serp/internal"); +const WORLD_COUNTRY_CODES = Object.keys(WORLD_COUNTRIES).map((x) => x.toLowerCase()); +let SearcherHost = class SearcherHost extends civ_rpc_1.RPCHost { + constructor(globalLogger, rateLimitControl, threadLocal, crawler, snapshotFormatter, serperGoogle, serperBing, jinaSerp) { + super(...arguments); + this.globalLogger = globalLogger; + this.rateLimitControl = rateLimitControl; + this.threadLocal = threadLocal; + this.crawler = crawler; + this.snapshotFormatter = snapshotFormatter; + this.serperGoogle = serperGoogle; + this.serperBing = serperBing; + this.jinaSerp = jinaSerp; + this.logger = this.globalLogger.child({ service: this.constructor.name }); + this.cacheRetentionMs = 1000 * 3600 * 24 * 7; + this.cacheValidMs = 1000 * 3600; + this.pageCacheToleranceMs = 1000 * 3600 * 24; + this.reasonableDelayMs = 15_000; + this.targetResultCount = 5; + this.highFreqKeyCache = new lru_cache_1.LRUCache({ + max: 256, + ttl: 60 * 60 * 1000, + updateAgeOnGet: false, + updateAgeOnHas: false, + }); + this.batchedCaches = []; + setInterval(() => { + const thisBatch = this.batchedCaches; + this.batchedCaches = []; + if (!thisBatch.length) { + return; + } + const batch = searched_1.SERPResult.DB.batch(); + for (const x of thisBatch) { + batch.set(searched_1.SERPResult.COLLECTION.doc(), x.degradeForFireStore()); + } + batch.commit() + .then(() => { + this.logger.debug(`Saved ${thisBatch.length} caches by batch`); + }) + .catch((err) => { + this.logger.warn(`Failed to cache search result in batch`, { err }); + }); + }, 1000 * 10 + Math.round(1000 * Math.random())).unref(); + } + async init() { + await this.dependencyReady(); + this.emit('ready'); + } + async search(rpcReflect, ctx, auth, crawlerOptions, searchExplicitOperators, count, variant, searchEngine, num, gl, hl, location, page, fallback, q) { + // We want to make our search API follow SERP schema, so we need to expose 'num' parameter. + // Since we used 'count' as 'num' previously, we need to keep 'count' for old users. + // Here we combine 'count' and 'num' to 'count' for the rest of the function. + count = (num !== undefined ? num : count) ?? 10; + const authToken = auth.bearerToken; + let highFreqKey; + if (authToken && this.highFreqKeyCache.has(authToken)) { + highFreqKey = this.highFreqKeyCache.get(authToken); + auth.user = highFreqKey.user; + auth.uid = highFreqKey.user?.user_id; + } + const uid = await auth.solveUID(); + // Return content by default + const crawlWithoutContent = crawlerOptions.respondWith.includes('no-content'); + const withFavicon = Boolean(ctx.get('X-With-Favicons')); + this.threadLocal.set('collect-favicon', withFavicon); + crawlerOptions.respondTiming ??= crawler_options_1.RESPOND_TIMING.VISIBLE_CONTENT; + let chargeAmount = 0; + const noSlashPath = decodeURIComponent(ctx.path).slice(1); + if (!noSlashPath && !q) { + const index = await this.crawler.getIndex(auth); + if (!uid) { + index.note = 'Authentication is required to use this endpoint. Please provide a valid API key via Authorization header.'; + } + if (!ctx.accepts('text/plain') && (ctx.accepts('text/json') || ctx.accepts('application/json'))) { + return index; + } + return (0, civ_rpc_1.assignTransferProtocolMeta)(`${index}`, { contentType: 'text/plain', envelope: null }); + } + const user = await auth.assertUser(); + if (!(user.wallet.total_balance > 0)) { + throw new errors_1.InsufficientBalanceError(`Account balance not enough to run this query, please recharge.`); + } + if (highFreqKey?.blockedUntil) { + const now = new Date(); + const blockedTimeRemaining = (highFreqKey.blockedUntil.valueOf() - now.valueOf()); + if (blockedTimeRemaining > 0) { + throw rate_limit_1.RateLimitTriggeredError.from({ + message: `Per UID rate limit exceeded (async)`, + retryAfter: Math.ceil(blockedTimeRemaining / 1000), + }); + } + } + const rateLimitPolicy = auth.getRateLimits(rpcReflect.name.toUpperCase()) || [ + parseInt(user.metadata?.speed_level) >= 2 ? + rate_limit_1.RateLimitDesc.from({ + occurrence: 1000, + periodSeconds: 60 + }) : + rate_limit_1.RateLimitDesc.from({ + occurrence: 100, + periodSeconds: 60 + }) + ]; + const apiRollPromise = this.rateLimitControl.simpleRPCUidBasedLimit(rpcReflect, uid, [rpcReflect.name.toUpperCase()], ...rateLimitPolicy); + if (!highFreqKey) { + // Normal path + await apiRollPromise; + if (rateLimitPolicy.some((x) => { + const rpm = x.occurrence / (x.periodSeconds / 60); + if (rpm >= 400) { + return true; + } + return false; + })) { + this.highFreqKeyCache.set(auth.bearerToken, { + user, + }); + } + } + else { + // High freq key path + apiRollPromise.then( + // Rate limit not triggered, make sure not blocking. + () => { + delete highFreqKey.blockedUntil; + }, + // Rate limit triggered + (err) => { + if (!(err instanceof rate_limit_1.RateLimitTriggeredError)) { + return; + } + const now = Date.now(); + let tgtDate; + if (err.retryAfterDate) { + tgtDate = err.retryAfterDate; + } + else if (err.retryAfter) { + tgtDate = new Date(now + err.retryAfter * 1000); + } + if (tgtDate) { + const dt = tgtDate.valueOf() - now; + highFreqKey.blockedUntil = tgtDate; + setTimeout(() => { + if (highFreqKey.blockedUntil === tgtDate) { + delete highFreqKey.blockedUntil; + } + }, dt).unref(); + } + }).finally(async () => { + // Always asynchronously update user(wallet); + const user = await auth.getBrief().catch(() => undefined); + if (user) { + highFreqKey.user = user; + } + }); + } + rpcReflect.finally(async () => { + if (chargeAmount) { + auth.reportUsage(chargeAmount, `reader-${rpcReflect.name}`).catch((err) => { + this.logger.warn(`Unable to report usage for ${uid}`, { err: (0, lang_1.marshalErrorLike)(err) }); + }); + try { + const apiRoll = await apiRollPromise; + apiRoll.chargeAmount = chargeAmount; + } + catch (err) { + await this.rateLimitControl.record({ + uid, + tags: [rpcReflect.name.toUpperCase()], + status: api_roll_1.API_CALL_STATUS.SUCCESS, + chargeAmount, + }).save().catch((err) => { + this.logger.warn(`Failed to save rate limit record`, { err: (0, lang_1.marshalErrorLike)(err) }); + }); + } + } + }); + delete crawlerOptions.html; + const crawlOpts = await this.crawler.configure(crawlerOptions); + const searchQuery = searchExplicitOperators.addTo(q || noSlashPath); + let fetchNum = count; + if ((page ?? 1) === 1) { + fetchNum = count > 10 ? 30 : 20; + } + let fallbackQuery; + let chargeAmountScaler = 1; + if (searchEngine === 'bing') { + this.threadLocal.set('bing-preferred', true); + chargeAmountScaler = 3; + } + if (variant !== 'web') { + chargeAmountScaler = 5; + } + // Search with fallback logic if enabled + const searchParams = { + variant, + provider: searchEngine, + q: searchQuery, + num: fetchNum, + gl, + hl, + location, + page, + }; + const { results, query: successQuery, tryTimes } = await this.searchWithFallback(searchParams, fallback, crawlerOptions.noCache); + chargeAmountScaler *= tryTimes; + fallbackQuery = successQuery !== searchQuery ? successQuery : undefined; + if (!results.length) { + throw new civ_rpc_1.AssertionFailureError(`No search results available for query ${searchQuery}`); + } + if (crawlOpts.timeoutMs && crawlOpts.timeoutMs < 30_000) { + delete crawlOpts.timeoutMs; + } + let lastScrapped; + const targetResultCount = crawlWithoutContent ? count : count + 2; + const trimmedResults = results.filter((x) => Boolean(x.link)).slice(0, targetResultCount).map((x) => this.mapToFinalResults(x)); + trimmedResults.toString = function () { + let r = this.map((x, i) => x ? Reflect.apply(x.toString, x, [i]) : '').join('\n\n').trimEnd() + '\n'; + if (fallbackQuery) { + r = `Fallback query: ${fallbackQuery}\n\n${r}`; + } + return r; + }; + if (!crawlerOptions.respondWith.includes('no-content') && + ['html', 'text', 'shot', 'markdown', 'content'].some((x) => crawlerOptions.respondWith.includes(x))) { + for (const x of trimmedResults) { + x.content ??= ''; + } + } + const assigningOfGeneralMixins = Promise.allSettled(trimmedResults.map((x) => this.assignGeneralMixin(x))); + let it; + if (crawlWithoutContent || count === 0) { + it = (0, misc_1.toAsyncGenerator)(trimmedResults); + await assigningOfGeneralMixins; + } + else { + it = this.fetchSearchResults(crawlerOptions.respondWith, trimmedResults, crawlOpts, crawler_options_1.CrawlerOptions.from({ ...crawlerOptions, cacheTolerance: crawlerOptions.cacheTolerance ?? this.pageCacheToleranceMs }), count); + } + if (!ctx.accepts('text/plain') && ctx.accepts('text/event-stream')) { + const sseStream = new transform_server_event_stream_1.OutputServerEventStream(); + rpcReflect.return(sseStream); + try { + for await (const scrapped of it) { + if (!scrapped) { + continue; + } + if (rpcReflect.signal.aborted) { + break; + } + chargeAmount = this.assignChargeAmount(scrapped, count, chargeAmountScaler, fallbackQuery); + lastScrapped = scrapped; + if (fallbackQuery) { + sseStream.write({ + event: 'meta', + data: { fallback: fallbackQuery }, + }); + } + sseStream.write({ + event: 'data', + data: scrapped, + }); + } + } + catch (err) { + this.logger.error(`Failed to collect search result for query ${searchQuery}`, { err: (0, lang_1.marshalErrorLike)(err) }); + sseStream.write({ + event: 'error', + data: (0, lang_1.marshalErrorLike)(err), + }); + } + sseStream.end(); + return sseStream; + } + let earlyReturn = false; + if (!ctx.accepts('text/plain') && (ctx.accepts('text/json') || ctx.accepts('application/json'))) { + let earlyReturnTimer; + const setEarlyReturnTimer = () => { + if (earlyReturnTimer) { + return; + } + earlyReturnTimer = setTimeout(async () => { + if (!lastScrapped) { + return; + } + await assigningOfGeneralMixins; + chargeAmount = this.assignChargeAmount(lastScrapped, count, chargeAmountScaler, fallbackQuery); + rpcReflect.return(lastScrapped); + earlyReturn = true; + }, ((crawlerOptions.timeout || 0) * 1000) || this.reasonableDelayMs); + }; + for await (const scrapped of it) { + lastScrapped = scrapped; + if (rpcReflect.signal.aborted || earlyReturn) { + break; + } + if (lodash_1.default.some(scrapped, (x) => this.pageQualified(x))) { + setEarlyReturnTimer(); + } + if (!this.searchResultsQualified(scrapped, count)) { + continue; + } + if (earlyReturnTimer) { + clearTimeout(earlyReturnTimer); + } + await assigningOfGeneralMixins; + chargeAmount = this.assignChargeAmount(scrapped, count, chargeAmountScaler, fallbackQuery); + return scrapped; + } + if (earlyReturnTimer) { + clearTimeout(earlyReturnTimer); + } + if (!lastScrapped) { + throw new civ_rpc_1.AssertionFailureError(`No content available for query ${searchQuery}`); + } + if (!earlyReturn) { + await assigningOfGeneralMixins; + chargeAmount = this.assignChargeAmount(lastScrapped, count, chargeAmountScaler, fallbackQuery); + } + return lastScrapped; + } + let earlyReturnTimer; + const setEarlyReturnTimer = () => { + if (earlyReturnTimer) { + return; + } + earlyReturnTimer = setTimeout(async () => { + if (!lastScrapped) { + return; + } + await assigningOfGeneralMixins; + chargeAmount = this.assignChargeAmount(lastScrapped, count, chargeAmountScaler, fallbackQuery); + rpcReflect.return((0, civ_rpc_1.assignTransferProtocolMeta)(`${lastScrapped}`, { contentType: 'text/plain', envelope: null })); + earlyReturn = true; + }, ((crawlerOptions.timeout || 0) * 1000) || this.reasonableDelayMs); + }; + for await (const scrapped of it) { + lastScrapped = scrapped; + if (rpcReflect.signal.aborted || earlyReturn) { + break; + } + if (lodash_1.default.some(scrapped, (x) => this.pageQualified(x))) { + setEarlyReturnTimer(); + } + if (!this.searchResultsQualified(scrapped, count)) { + continue; + } + if (earlyReturnTimer) { + clearTimeout(earlyReturnTimer); + } + await assigningOfGeneralMixins; + chargeAmount = this.assignChargeAmount(scrapped, count, chargeAmountScaler, fallbackQuery); + return (0, civ_rpc_1.assignTransferProtocolMeta)(`${scrapped}`, { contentType: 'text/plain', envelope: null }); + } + if (earlyReturnTimer) { + clearTimeout(earlyReturnTimer); + } + if (!lastScrapped) { + throw new civ_rpc_1.AssertionFailureError(`No content available for query ${searchQuery}`); + } + if (!earlyReturn) { + await assigningOfGeneralMixins; + chargeAmount = this.assignChargeAmount(lastScrapped, count, chargeAmountScaler, fallbackQuery); + } + return (0, civ_rpc_1.assignTransferProtocolMeta)(`${lastScrapped}`, { contentType: 'text/plain', envelope: null }); + } + /** + * Search with fallback to progressively shorter queries if no results found + * @param params Search parameters + * @param useFallback Whether to use the fallback mechanism + * @param noCache Whether to bypass cache + * @returns Search response and the successful query + */ + async searchWithFallback(params, useFallback = false, noCache = false) { + // Try original query first + const originalQuery = params.q; + const containsRTL = /[\u0600-\u06FF\u0750-\u077F\u08A0-\u08FF\uFB50-\uFDFF\uFE70-\uFEFF\u0590-\u05FF\uFB1D-\uFB4F\u0700-\u074F\u0780-\u07BF\u07C0-\u07FF]/.test(originalQuery); + // Extract results based on variant + let tryTimes = 1; + const results = await this.cachedSearch(params.variant, params, noCache); + if (results.length || !useFallback) { + return { results, query: params.q, tryTimes }; + } + let queryTerms = originalQuery.split(/\s+/); + const lastResort = containsRTL ? queryTerms.slice(queryTerms.length - 2) : queryTerms.slice(0, 2); + this.logger.info(`No results for "${originalQuery}", trying fallback queries`); + let terms = []; + // fallback n times + const n = 4; + while (tryTimes < n) { + const delta = Math.ceil(queryTerms.length / n) * tryTimes; + terms = containsRTL ? queryTerms.slice(delta) : queryTerms.slice(0, queryTerms.length - delta); + const query = terms.join(' '); + if (!query) { + break; + } + tryTimes += 1; + this.logger.info(`Retrying search with fallback query: "${query}"`); + const fallbackParams = { ...params, q: query }; + const fallbackResults = await this.cachedSearch(params.variant, fallbackParams, noCache); + if (fallbackResults.length > 0) { + return { results: fallbackResults, query: fallbackParams.q, tryTimes }; + } + } + if (terms.length > lastResort.length) { + const query = lastResort.join(' '); + this.logger.info(`Retrying search with fallback query: "${query}"`); + const fallbackParams = { ...params, q: query }; + tryTimes += 1; + const fallbackResults = await this.cachedSearch(params.variant, fallbackParams, noCache); + if (fallbackResults.length > 0) { + return { results: fallbackResults, query, tryTimes }; + } + } + return { results, query: originalQuery, tryTimes }; + } + async *fetchSearchResults(mode, searchResults, options, crawlerOptions, count) { + if (!searchResults) { + return; + } + const urls = searchResults.map((x) => new URL(x.url)); + const snapshotMap = new WeakMap(); + for await (const scrapped of this.crawler.scrapMany(urls, options, crawlerOptions)) { + const mapped = scrapped.map((x, i) => { + if (!x) { + return {}; + } + if (snapshotMap.has(x)) { + return snapshotMap.get(x); + } + return this.crawler.formatSnapshotWithPDFSideLoad(mode, x, urls[i], undefined, options).then((r) => { + snapshotMap.set(x, r); + return r; + }).catch((err) => { + this.logger.error(`Failed to format snapshot for ${urls[i].href}`, { err: (0, lang_1.marshalErrorLike)(err) }); + return {}; + }); + }); + const resultArray = await Promise.all(mapped); + for (const [i, v] of resultArray.entries()) { + if (v) { + Object.assign(searchResults[i], v); + } + } + yield this.reOrganizeSearchResults(searchResults, count); + } + } + reOrganizeSearchResults(searchResults, count) { + const targetResultCount = count || this.targetResultCount; + const [qualifiedPages, unqualifiedPages] = lodash_1.default.partition(searchResults, (x) => this.pageQualified(x)); + const acceptSet = new Set(qualifiedPages); + const n = targetResultCount - qualifiedPages.length; + for (const x of unqualifiedPages.slice(0, n >= 0 ? n : 0)) { + acceptSet.add(x); + } + const filtered = searchResults.filter((x) => acceptSet.has(x)).slice(0, targetResultCount); + const resultArray = filtered; + resultArray.toString = searchResults.toString; + return resultArray; + } + assignChargeAmount(formatted, num, scaler, fallbackQuery) { + let contentCharge = 0; + for (const x of formatted) { + const itemAmount = this.crawler.assignChargeAmount(x) || 0; + if (!itemAmount) { + continue; + } + contentCharge += itemAmount; + } + const numCharge = Math.ceil(formatted.length / 10) * 10000 * scaler; + const final = Math.max(contentCharge, numCharge); + if (final === numCharge) { + for (const x of formatted) { + x.usage = { tokens: Math.ceil(numCharge / formatted.length) }; + } + } + const metadata = { usage: { tokens: final } }; + if (fallbackQuery) { + metadata.fallback = fallbackQuery; + } + (0, civ_rpc_1.assignMeta)(formatted, metadata); + return final; + } + pageQualified(formattedPage) { + return formattedPage.title && + formattedPage.content || + formattedPage.screenshotUrl || + formattedPage.pageshotUrl || + formattedPage.text || + formattedPage.html; + } + searchResultsQualified(results, targetResultCount = this.targetResultCount) { + return lodash_1.default.every(results, (x) => this.pageQualified(x)) && results.length >= targetResultCount; + } + async getFavicon(domain) { + const url = `https://www.google.com/s2/favicons?sz=32&domain_url=${domain}`; + try { + const response = await fetch(url); + if (!response.ok) { + return ''; + } + const ab = await response.arrayBuffer(); + const buffer = Buffer.from(ab); + const base64 = buffer.toString('base64'); + return `data:image/png;base64,${base64}`; + } + catch (error) { + this.logger.warn(`Failed to get favicon base64 string`, { err: (0, lang_1.marshalErrorLike)(error) }); + return ''; + } + } + *iterProviders(preference, variant) { + if (preference === 'bing') { + yield this.serperBing; + yield variant === 'web' ? this.jinaSerp : this.serperGoogle; + yield this.serperGoogle; + return; + } + if (preference === 'google') { + yield variant === 'web' ? this.jinaSerp : this.serperGoogle; + yield this.serperGoogle; + yield this.serperGoogle; + return; + } + yield variant === 'web' ? this.jinaSerp : this.serperGoogle; + yield this.serperGoogle; + yield this.serperGoogle; + } + async cachedSearch(variant, query, noCache) { + const queryDigest = (0, hash_1.objHashMd5B64Of)({ ...query, variant }); + const provider = query.provider; + Reflect.deleteProperty(query, 'provider'); + let cache; + if (!noCache) { + cache = (await searched_1.SERPResult.fromFirestoreQuery(searched_1.SERPResult.COLLECTION.where('queryDigest', '==', queryDigest) + .orderBy('createdAt', 'desc') + .limit(1)))[0]; + if (cache) { + const age = Date.now() - cache.createdAt.valueOf(); + const stale = cache.createdAt.valueOf() < (Date.now() - this.cacheValidMs); + this.logger.info(`${stale ? 'Stale cache exists' : 'Cache hit'} for search query "${query.q}", normalized digest: ${queryDigest}, ${age}ms old`, { + query, digest: queryDigest, age, stale + }); + if (!stale) { + return cache.response; + } + } + } + try { + let r; + let lastError; + outerLoop: for (const client of this.iterProviders(provider, variant)) { + const t0 = Date.now(); + try { + switch (variant) { + case 'images': { + r = await Reflect.apply(client.imageSearch, client, [query]); + break; + } + case 'news': { + r = await Reflect.apply(client.newsSearch, client, [query]); + break; + } + case 'web': + default: { + r = await Reflect.apply(client.webSearch, client, [query]); + break; + } + } + const dt = Date.now() - t0; + this.logger.info(`Search took ${dt}ms, ${client.constructor.name}(${variant})`, { searchDt: dt, variant, client: client.constructor.name }); + break outerLoop; + } + catch (err) { + lastError = err; + const dt = Date.now() - t0; + this.logger.warn(`Failed to do ${variant} search using ${client.constructor.name}`, { err, variant, searchDt: dt, }); + } + } + if (r?.length) { + const nowDate = new Date(); + const record = searched_1.SERPResult.from({ + query, + queryDigest, + response: r, + createdAt: nowDate, + expireAt: new Date(nowDate.valueOf() + this.cacheRetentionMs) + }); + this.batchedCaches.push(record); + } + else if (lastError) { + throw lastError; + } + return r; + } + catch (err) { + if (cache) { + this.logger.warn(`Failed to fetch search result, but a stale cache is available. falling back to stale cache`, { err: (0, lang_1.marshalErrorLike)(err) }); + return cache.response; + } + throw err; + } + } + mapToFinalResults(input) { + const whitelistedProps = [ + 'imageUrl', 'imageWidth', 'imageHeight', 'source', 'date', 'siteLinks' + ]; + const result = { + title: input.title, + url: input.link, + description: Reflect.get(input, 'snippet'), + ...lodash_1.default.pick(input, whitelistedProps), + }; + return result; + } + async assignGeneralMixin(result) { + const collectFavicon = this.threadLocal.get('collect-favicon'); + if (collectFavicon && result.url) { + const url = new URL(result.url); + Reflect.set(result, 'favicon', await this.getFavicon(url.origin)); + } + Object.setPrototypeOf(result, searchResultProto); + } +}; +exports.SearcherHost = SearcherHost; +__decorate([ + (0, registry_1.Method)({ + name: 'searchIndex', + ext: { + http: { + action: ['get', 'post'], + path: '/search' + } + }, + tags: ['search'], + returnType: [String, transform_server_event_stream_1.OutputServerEventStream], + }), + (0, registry_1.Method)({ + ext: { + http: { + action: ['get', 'post'], + path: '::q' + } + }, + tags: ['search'], + returnType: [String, transform_server_event_stream_1.OutputServerEventStream, civ_rpc_1.RawString], + }), + __param(0, (0, registry_1.RPCReflect)()), + __param(1, (0, registry_1.Ctx)()), + __param(5, (0, registry_1.Param)('count', { validate: (v) => v >= 0 && v <= 20 })), + __param(6, (0, registry_1.Param)('type', { type: new Set(['web', 'images', 'news']), default: 'web' })), + __param(7, (0, registry_1.Param)('provider', { type: new Set(['google', 'bing']), default: 'google' })), + __param(8, (0, registry_1.Param)('num', { validate: (v) => v >= 0 && v <= 20 })), + __param(9, (0, registry_1.Param)('gl', { validate: (v) => WORLD_COUNTRY_CODES.includes(v?.toLowerCase()) })), + __param(10, (0, registry_1.Param)('hl', { validate: (v) => WORLD_LANGUAGES.some(l => l.code === v) })), + __param(11, (0, registry_1.Param)('location')), + __param(12, (0, registry_1.Param)('page')), + __param(13, (0, registry_1.Param)('fallback', { type: Boolean, default: true })), + __param(14, (0, registry_1.Param)('q')), + __metadata("design:type", Function), + __metadata("design:paramtypes", [typeof (_d = typeof civ_rpc_1.RPCReflection !== "undefined" && civ_rpc_1.RPCReflection) === "function" ? _d : Object, typeof (_e = typeof registry_1.Context !== "undefined" && registry_1.Context) === "function" ? _e : Object, jina_embeddings_auth_1.JinaEmbeddingsAuthDTO, + crawler_options_1.CrawlerOptions, typeof (_f = typeof serper_search_1.GoogleSearchExplicitOperatorsDto !== "undefined" && serper_search_1.GoogleSearchExplicitOperatorsDto) === "function" ? _f : Object, Number, String, String, Number, String, String, String, Number, Boolean, String]), + __metadata("design:returntype", Promise) +], SearcherHost.prototype, "search", null); +exports.SearcherHost = SearcherHost = __decorate([ + (0, tsyringe_1.singleton)(), + __metadata("design:paramtypes", [logger_1.GlobalLogger, typeof (_a = typeof rate_limit_1.RateLimitControl !== "undefined" && rate_limit_1.RateLimitControl) === "function" ? _a : Object, async_context_1.AsyncLocalContext, + crawler_1.CrawlerHost, + snapshot_formatter_1.SnapshotFormatter, typeof (_b = typeof SerperGoogleSearchService !== "undefined" && SerperGoogleSearchService) === "function" ? _b : Object, typeof (_c = typeof SerperBingSearchService !== "undefined" && SerperBingSearchService) === "function" ? _c : Object, internal_1.InternalJinaSerpService]) +], SearcherHost); +const dataItems = [ + { key: 'title', label: 'Title' }, + { key: 'source', label: 'Source' }, + { key: 'url', label: 'URL Source' }, + { key: 'imageUrl', label: 'Image URL' }, + { key: 'description', label: 'Description' }, + { key: 'publishedTime', label: 'Published Time' }, + { key: 'imageWidth', label: 'Image Width' }, + { key: 'imageHeight', label: 'Image Height' }, + { key: 'date', label: 'Date' }, + { key: 'favicon', label: 'Favicon' }, +]; +const searchResultProto = { + toString(i) { + const chunks = []; + for (const item of dataItems) { + const v = Reflect.get(this, item.key); + if (typeof v !== 'undefined') { + if (i === undefined) { + chunks.push(`[${item.label}]: ${v}`); + } + else { + chunks.push(`[${i + 1}] ${item.label}: ${v}`); + } + } + } + if (this.content) { + chunks.push(`\n${this.content}`); + } + if (this.images) { + const imageSummaryChunks = [`${i === undefined ? '' : `[${i + 1}] `}Images:`]; + for (const [k, v] of Object.entries(this.images)) { + imageSummaryChunks.push(`- ![${k}](${v})`); + } + if (imageSummaryChunks.length === 1) { + imageSummaryChunks.push('This page does not seem to contain any images.'); + } + chunks.push(imageSummaryChunks.join('\n')); + } + if (this.links) { + const linkSummaryChunks = [`${i === undefined ? '' : `[${i + 1}] `}Links/Buttons:`]; + if (Array.isArray(this.links)) { + for (const [k, v] of this.links) { + linkSummaryChunks.push(`- [${k}](${v})`); + } + } + else { + for (const [k, v] of Object.entries(this.links)) { + linkSummaryChunks.push(`- [${k}](${v})`); + } + } + if (linkSummaryChunks.length === 1) { + linkSummaryChunks.push('This page does not seem to contain any buttons/links.'); + } + chunks.push(linkSummaryChunks.join('\n')); + } + return chunks.join('\n'); + } +}; +//# sourceMappingURL=searcher.js.map \ No newline at end of file diff --git a/build/api/searcher.js.map b/build/api/searcher.js.map new file mode 100644 index 0000000000000000000000000000000000000000..37d54e2950c214b30f37610aa8b5e597b0abf275 --- /dev/null +++ b/build/api/searcher.js.map @@ -0,0 +1 @@ +{"version":3,"file":"searcher.js","sourceRoot":"","sources":["../../src/api/searcher.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;AAAA,uCAAqC;AACrC,4CAEwB;AACxB,sCAA+C;AAC/C,sCAA8C;AAC9C,oDAAuB;AAEvB,8DAAyG;AAEzG,uCAA+D;AAC/D,4DAAwE;AACxE,uEAAuG;AACvG,6DAA6E;AAE7E,+CAAkD;AAClD,6DAA8D;AAC9D,mDAA+E;AAC/E,wFAA+E;AAC/E,sEAAoE;AACpE,+CAA8D;AAE9D,gGAAgG;AAChG,wCAAiD;AAEjD,yCAAqC;AACrC,oDAAwD;AACxD,6CAA4C;AAC5C,iHAAiH;AACjH,wDAAoE;AAGpE,MAAM,mBAAmB,GAAG,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;AAa9E,IAAM,YAAY,GAAlB,MAAM,YAAa,SAAQ,iBAAO;IAoBrC,YACc,YAA0B,EAC1B,gBAAkC,EAClC,WAA8B,EAC9B,OAAoB,EACpB,iBAAoC,EACpC,YAAuC,EACvC,UAAmC,EACnC,QAAiC;QAE3C,KAAK,CAAC,GAAG,SAAS,CAAC,CAAC;QATV,iBAAY,GAAZ,YAAY,CAAc;QAC1B,qBAAgB,GAAhB,gBAAgB,CAAkB;QAClC,gBAAW,GAAX,WAAW,CAAmB;QAC9B,YAAO,GAAP,OAAO,CAAa;QACpB,sBAAiB,GAAjB,iBAAiB,CAAmB;QACpC,iBAAY,GAAZ,YAAY,CAA2B;QACvC,eAAU,GAAV,UAAU,CAAyB;QACnC,aAAQ,GAAR,QAAQ,CAAyB;QA3B/C,WAAM,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC;QAErE,qBAAgB,GAAG,IAAI,GAAG,IAAI,GAAG,EAAE,GAAG,CAAC,CAAC;QACxC,iBAAY,GAAG,IAAI,GAAG,IAAI,CAAC;QAC3B,yBAAoB,GAAG,IAAI,GAAG,IAAI,GAAG,EAAE,CAAC;QAExC,sBAAiB,GAAG,MAAM,CAAC;QAE3B,sBAAiB,GAAG,CAAC,CAAC;QAEtB,qBAAgB,GAAG,IAAI,oBAAQ,CAAyB;YACpD,GAAG,EAAE,GAAG;YACR,GAAG,EAAE,EAAE,GAAG,EAAE,GAAG,IAAI;YACnB,cAAc,EAAE,KAAK;YACrB,cAAc,EAAE,KAAK;SACxB,CAAC,CAAC;QAEH,kBAAa,GAAiB,EAAE,CAAC;QAc7B,WAAW,CAAC,GAAG,EAAE;YACb,MAAM,SAAS,GAAG,IAAI,CAAC,aAAa,CAAC;YACrC,IAAI,CAAC,aAAa,GAAG,EAAE,CAAC;YACxB,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC;gBACpB,OAAO;YACX,CAAC;YACD,MAAM,KAAK,GAAG,qBAAU,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;YAEpC,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;gBACxB,KAAK,CAAC,GAAG,CAAC,qBAAU,CAAC,UAAU,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,mBAAmB,EAAE,CAAC,CAAC;YACpE,CAAC;YACD,KAAK,CAAC,MAAM,EAAE;iBACT,IAAI,CAAC,GAAG,EAAE;gBACP,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,SAAS,CAAC,MAAM,kBAAkB,CAAC,CAAC;YACnE,CAAC,CAAC;iBACD,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;gBACX,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,wCAAwC,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;YACxE,CAAC,CAAC,CAAC;QACX,CAAC,EAAE,IAAI,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC;IAC7D,CAAC;IAEQ,KAAK,CAAC,IAAI;QACf,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;QAE7B,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACvB,CAAC;IAuBK,AAAN,KAAK,CAAC,MAAM,CACM,UAAyB,EAChC,GAAY,EACnB,IAA2B,EAC3B,cAA8B,EAC9B,uBAAyD,EAEzD,KAAa,EAEb,OAAkC,EAElC,YAA+B,EAE/B,GAAY,EAC8E,EAAW,EAClB,EAAW,EAC3E,QAAiB,EACrB,IAAa,EACyB,QAAkB,EAC3D,CAAU;QAEtB,2FAA2F;QAC3F,oFAAoF;QACpF,6EAA6E;QAC7E,KAAK,GAAG,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QAEhD,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC;QACnC,IAAI,WAAuC,CAAC;QAC5C,IAAI,SAAS,IAAI,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;YACpD,WAAW,GAAG,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,SAAS,CAAE,CAAC;YACpD,IAAI,CAAC,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC;YAC7B,IAAI,CAAC,GAAG,GAAG,WAAW,CAAC,IAAI,EAAE,OAAO,CAAC;QACzC,CAAC;QAED,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;QAClC,4BAA4B;QAC5B,MAAM,mBAAmB,GAAG,cAAc,CAAC,WAAW,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;QAC9E,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAC;QACxD,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,iBAAiB,EAAE,WAAW,CAAC,CAAC;QACrD,cAAc,CAAC,aAAa,KAAK,gCAAc,CAAC,eAAe,CAAC;QAEhE,IAAI,YAAY,GAAG,CAAC,CAAC;QACrB,MAAM,WAAW,GAAG,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC1D,IAAI,CAAC,WAAW,IAAI,CAAC,CAAC,EAAE,CAAC;YACrB,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YAChD,IAAI,CAAC,GAAG,EAAE,CAAC;gBACP,KAAK,CAAC,IAAI,GAAG,2GAA2G,CAAC;YAC7H,CAAC;YACD,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC,EAAE,CAAC;gBAE9F,OAAO,KAAK,CAAC;YACjB,CAAC;YAED,OAAO,IAAA,oCAA0B,EAAC,GAAG,KAAK,EAAE,EACxC,EAAE,WAAW,EAAE,YAAY,EAAE,QAAQ,EAAE,IAAI,EAAE,CAChD,CAAC;QACN,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QACrC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,GAAG,CAAC,CAAC,EAAE,CAAC;YACnC,MAAM,IAAI,iCAAwB,CAAC,gEAAgE,CAAC,CAAC;QACzG,CAAC;QAED,IAAI,WAAW,EAAE,YAAY,EAAE,CAAC;YAC5B,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,MAAM,oBAAoB,GAAG,CAAC,WAAW,CAAC,YAAY,CAAC,OAAO,EAAE,GAAG,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;YAClF,IAAI,oBAAoB,GAAG,CAAC,EAAE,CAAC;gBAC3B,MAAM,oCAAuB,CAAC,IAAI,CAAC;oBAC/B,OAAO,EAAE,qCAAqC;oBAC9C,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC;iBACrD,CAAC,CAAC;YACP,CAAC;QACL,CAAC;QAED,MAAM,eAAe,GAAG,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,IAAI;YACzE,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC;gBACvC,0BAAa,CAAC,IAAI,CAAC;oBACf,UAAU,EAAE,IAAI;oBAChB,aAAa,EAAE,EAAE;iBACpB,CAAC,CAAC,CAAC;gBACJ,0BAAa,CAAC,IAAI,CAAC;oBACf,UAAU,EAAE,GAAG;oBACf,aAAa,EAAE,EAAE;iBACpB,CAAC;SACT,CAAC;QAEF,MAAM,cAAc,GAAG,IAAI,CAAC,gBAAgB,CAAC,sBAAsB,CAC/D,UAAU,EAAE,GAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,EACjD,GAAG,eAAe,CACrB,CAAC;QAEF,IAAI,CAAC,WAAW,EAAE,CAAC;YACf,cAAc;YACd,MAAM,cAAc,CAAC;YAErB,IAAI,eAAe,CAAC,IAAI,CACpB,CAAC,CAAC,EAAE,EAAE;gBACF,MAAM,GAAG,GAAG,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,aAAa,GAAG,EAAE,CAAC,CAAC;gBAClD,IAAI,GAAG,IAAI,GAAG,EAAE,CAAC;oBACb,OAAO,IAAI,CAAC;gBAChB,CAAC;gBAED,OAAO,KAAK,CAAC;YACjB,CAAC,CAAC,EACJ,CAAC;gBACC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,WAAY,EAAE;oBACzC,IAAI;iBACP,CAAC,CAAC;YACP,CAAC;QAEL,CAAC;aAAM,CAAC;YACJ,qBAAqB;YACrB,cAAc,CAAC,IAAI;YACf,oDAAoD;YACpD,GAAG,EAAE;gBACD,OAAO,WAAW,CAAC,YAAY,CAAC;YACpC,CAAC;YACD,uBAAuB;YACvB,CAAC,GAAG,EAAE,EAAE;gBACJ,IAAI,CAAC,CAAC,GAAG,YAAY,oCAAuB,CAAC,EAAE,CAAC;oBAC5C,OAAO;gBACX,CAAC;gBACD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;gBACvB,IAAI,OAAO,CAAC;gBACZ,IAAI,GAAG,CAAC,cAAc,EAAE,CAAC;oBACrB,OAAO,GAAG,GAAG,CAAC,cAAc,CAAC;gBACjC,CAAC;qBAAM,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC;oBACxB,OAAO,GAAG,IAAI,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;gBACpD,CAAC;gBAED,IAAI,OAAO,EAAE,CAAC;oBACV,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE,GAAG,GAAG,CAAC;oBACnC,WAAW,CAAC,YAAY,GAAG,OAAO,CAAC;oBACnC,UAAU,CAAC,GAAG,EAAE;wBACZ,IAAI,WAAW,CAAC,YAAY,KAAK,OAAO,EAAE,CAAC;4BACvC,OAAO,WAAW,CAAC,YAAY,CAAC;wBACpC,CAAC;oBACL,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;gBACnB,CAAC;YACL,CAAC,CACJ,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE;gBACjB,6CAA6C;gBAC7C,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;gBAC1D,IAAI,IAAI,EAAE,CAAC;oBACP,WAAW,CAAC,IAAI,GAAG,IAAI,CAAC;gBAC5B,CAAC;YACL,CAAC,CAAC,CAAC;QACP,CAAC;QAED,UAAU,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE;YAC1B,IAAI,YAAY,EAAE,CAAC;gBACf,IAAI,CAAC,WAAW,CAAC,YAAY,EAAE,UAAU,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;oBACtE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,8BAA8B,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,IAAA,uBAAgB,EAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBAC1F,CAAC,CAAC,CAAC;gBACH,IAAI,CAAC;oBACD,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC;oBACrC,OAAO,CAAC,YAAY,GAAG,YAAY,CAAC;gBAExC,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACX,MAAM,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC;wBAC/B,GAAG;wBACH,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;wBACrC,MAAM,EAAE,0BAAe,CAAC,OAAO;wBAC/B,YAAY;qBACf,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;wBACpB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,kCAAkC,EAAE,EAAE,GAAG,EAAE,IAAA,uBAAgB,EAAC,GAAG,CAAC,EAAE,CAAC,CAAC;oBACzF,CAAC,CAAC,CAAC;gBACP,CAAC;YACL,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,OAAO,cAAc,CAAC,IAAI,CAAC;QAE3B,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;QAC/D,MAAM,WAAW,GAAG,uBAAuB,CAAC,KAAK,CAAC,CAAC,IAAI,WAAW,CAAC,CAAC;QAEpE,IAAI,QAAQ,GAAG,KAAK,CAAC;QACrB,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;YACpB,QAAQ,GAAG,KAAK,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACpC,CAAC;QAED,IAAI,aAAiC,CAAC;QACtC,IAAI,kBAAkB,GAAG,CAAC,CAAC;QAC3B,IAAI,YAAY,KAAK,MAAM,EAAE,CAAC;YAC1B,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAC;YAC7C,kBAAkB,GAAG,CAAC,CAAC;QAC3B,CAAC;QAED,IAAI,OAAO,KAAK,KAAK,EAAE,CAAC;YACpB,kBAAkB,GAAG,CAAC,CAAC;QAC3B,CAAC;QAED,wCAAwC;QACxC,MAAM,YAAY,GAAG;YACjB,OAAO;YACP,QAAQ,EAAE,YAAY;YACtB,CAAC,EAAE,WAAW;YACd,GAAG,EAAE,QAAQ;YACb,EAAE;YACF,EAAE;YACF,QAAQ;YACR,IAAI;SACP,CAAC;QAEF,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAC5E,YAAY,EAAE,QAAQ,EAAE,cAAc,CAAC,OAAO,CACjD,CAAC;QACF,kBAAkB,IAAI,QAAQ,CAAC;QAE/B,aAAa,GAAG,YAAY,KAAK,WAAW,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC;QAExE,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;YAClB,MAAM,IAAI,+BAAqB,CAAC,yCAAyC,WAAW,EAAE,CAAC,CAAC;QAC5F,CAAC;QAED,IAAI,SAAS,CAAC,SAAS,IAAI,SAAS,CAAC,SAAS,GAAG,MAAM,EAAE,CAAC;YACtD,OAAO,SAAS,CAAC,SAAS,CAAC;QAC/B,CAAC;QAGD,IAAI,YAA+B,CAAC;QACpC,MAAM,iBAAiB,GAAG,mBAAmB,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC;QAClE,MAAM,cAAc,GAAU,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,iBAAiB,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC;QACvI,cAAc,CAAC,QAAQ,GAAG;YACtB,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC;YACrG,IAAI,aAAa,EAAE,CAAC;gBAChB,CAAC,GAAG,mBAAmB,aAAa,OAAO,CAAC,EAAE,CAAC;YACnD,CAAC;YACD,OAAO,CAAC,CAAC;QACb,CAAC,CAAC;QACF,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,QAAQ,CAAC,YAAY,CAAC;YAClD,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,cAAc,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EACrG,CAAC;YACC,KAAK,MAAM,CAAC,IAAI,cAAc,EAAE,CAAC;gBAC7B,CAAC,CAAC,OAAO,KAAK,EAAE,CAAC;YACrB,CAAC;QACL,CAAC;QACD,MAAM,wBAAwB,GAAG,OAAO,CAAC,UAAU,CAC/C,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,CACxD,CAAC;QAEF,IAAI,EAAE,CAAC;QAEP,IAAI,mBAAmB,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;YACrC,EAAE,GAAG,IAAA,uBAAgB,EAAC,cAAc,CAAC,CAAC;YACtC,MAAM,wBAAwB,CAAC;QACnC,CAAC;aAAM,CAAC;YACJ,EAAE,GAAG,IAAI,CAAC,kBAAkB,CAAC,cAAc,CAAC,WAAW,EAAE,cAAc,EAAE,SAAS,EAC9E,gCAAc,CAAC,IAAI,CAAC,EAAE,GAAG,cAAc,EAAE,cAAc,EAAE,cAAc,CAAC,cAAc,IAAI,IAAI,CAAC,oBAAoB,EAAE,CAAC,EACtH,KAAK,CACR,CAAC;QACN,CAAC;QAED,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC,mBAAmB,CAAC,EAAE,CAAC;YACjE,MAAM,SAAS,GAAG,IAAI,uDAAuB,EAAE,CAAC;YAChD,UAAU,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YAC7B,IAAI,CAAC;gBACD,IAAI,KAAK,EAAE,MAAM,QAAQ,IAAI,EAAE,EAAE,CAAC;oBAC9B,IAAI,CAAC,QAAQ,EAAE,CAAC;wBACZ,SAAS;oBACb,CAAC;oBACD,IAAI,UAAU,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;wBAC5B,MAAM;oBACV,CAAC;oBAED,YAAY,GAAG,IAAI,CAAC,kBAAkB,CAAC,QAAQ,EAAE,KAAK,EAAE,kBAAkB,EAAE,aAAa,CAAC,CAAC;oBAC3F,YAAY,GAAG,QAAQ,CAAC;oBAExB,IAAI,aAAa,EAAE,CAAC;wBAChB,SAAS,CAAC,KAAK,CAAC;4BACZ,KAAK,EAAE,MAAM;4BACb,IAAI,EAAE,EAAE,QAAQ,EAAE,aAAa,EAAE;yBACpC,CAAC,CAAC;oBACP,CAAC;oBAED,SAAS,CAAC,KAAK,CAAC;wBACZ,KAAK,EAAE,MAAM;wBACb,IAAI,EAAE,QAAQ;qBACjB,CAAC,CAAC;gBACP,CAAC;YACL,CAAC;YAAC,OAAO,GAAQ,EAAE,CAAC;gBAChB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,6CAA6C,WAAW,EAAE,EACxE,EAAE,GAAG,EAAE,IAAA,uBAAgB,EAAC,GAAG,CAAC,EAAE,CACjC,CAAC;gBACF,SAAS,CAAC,KAAK,CAAC;oBACZ,KAAK,EAAE,OAAO;oBACd,IAAI,EAAE,IAAA,uBAAgB,EAAC,GAAG,CAAC;iBAC9B,CAAC,CAAC;YACP,CAAC;YAED,SAAS,CAAC,GAAG,EAAE,CAAC;YAEhB,OAAO,SAAS,CAAC;QACrB,CAAC;QAED,IAAI,WAAW,GAAG,KAAK,CAAC;QACxB,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC,EAAE,CAAC;YAC9F,IAAI,gBAA2D,CAAC;YAChE,MAAM,mBAAmB,GAAG,GAAG,EAAE;gBAC7B,IAAI,gBAAgB,EAAE,CAAC;oBACnB,OAAO;gBACX,CAAC;gBACD,gBAAgB,GAAG,UAAU,CAAC,KAAK,IAAI,EAAE;oBACrC,IAAI,CAAC,YAAY,EAAE,CAAC;wBAChB,OAAO;oBACX,CAAC;oBACD,MAAM,wBAAwB,CAAC;oBAC/B,YAAY,GAAG,IAAI,CAAC,kBAAkB,CAAC,YAAY,EAAE,KAAK,EAAE,kBAAkB,EAAE,aAAa,CAAC,CAAC;oBAE/F,UAAU,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;oBAChC,WAAW,GAAG,IAAI,CAAC;gBACvB,CAAC,EAAE,CAAC,CAAC,cAAc,CAAC,OAAO,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,IAAI,CAAC,iBAAiB,CAAC,CAAC;YACzE,CAAC,CAAC;YAEF,IAAI,KAAK,EAAE,MAAM,QAAQ,IAAI,EAAE,EAAE,CAAC;gBAC9B,YAAY,GAAG,QAAQ,CAAC;gBACxB,IAAI,UAAU,CAAC,MAAM,CAAC,OAAO,IAAI,WAAW,EAAE,CAAC;oBAC3C,MAAM;gBACV,CAAC;gBACD,IAAI,gBAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;oBACjD,mBAAmB,EAAE,CAAC;gBAC1B,CAAC;gBACD,IAAI,CAAC,IAAI,CAAC,sBAAsB,CAAC,QAAQ,EAAE,KAAK,CAAC,EAAE,CAAC;oBAChD,SAAS;gBACb,CAAC;gBACD,IAAI,gBAAgB,EAAE,CAAC;oBACnB,YAAY,CAAC,gBAAgB,CAAC,CAAC;gBACnC,CAAC;gBACD,MAAM,wBAAwB,CAAC;gBAC/B,YAAY,GAAG,IAAI,CAAC,kBAAkB,CAAC,QAAQ,EAAE,KAAK,EAAE,kBAAkB,EAAE,aAAa,CAAC,CAAC;gBAE3F,OAAO,QAAQ,CAAC;YACpB,CAAC;YAED,IAAI,gBAAgB,EAAE,CAAC;gBACnB,YAAY,CAAC,gBAAgB,CAAC,CAAC;YACnC,CAAC;YAED,IAAI,CAAC,YAAY,EAAE,CAAC;gBAChB,MAAM,IAAI,+BAAqB,CAAC,kCAAkC,WAAW,EAAE,CAAC,CAAC;YACrF,CAAC;YAED,IAAI,CAAC,WAAW,EAAE,CAAC;gBACf,MAAM,wBAAwB,CAAC;gBAC/B,YAAY,GAAG,IAAI,CAAC,kBAAkB,CAAC,YAAY,EAAE,KAAK,EAAE,kBAAkB,EAAE,aAAa,CAAC,CAAC;YACnG,CAAC;YAED,OAAO,YAAY,CAAC;QACxB,CAAC;QAED,IAAI,gBAA2D,CAAC;QAChE,MAAM,mBAAmB,GAAG,GAAG,EAAE;YAC7B,IAAI,gBAAgB,EAAE,CAAC;gBACnB,OAAO;YACX,CAAC;YACD,gBAAgB,GAAG,UAAU,CAAC,KAAK,IAAI,EAAE;gBACrC,IAAI,CAAC,YAAY,EAAE,CAAC;oBAChB,OAAO;gBACX,CAAC;gBACD,MAAM,wBAAwB,CAAC;gBAC/B,YAAY,GAAG,IAAI,CAAC,kBAAkB,CAAC,YAAY,EAAE,KAAK,EAAE,kBAAkB,EAAE,aAAa,CAAC,CAAC;gBAE/F,UAAU,CAAC,MAAM,CAAC,IAAA,oCAA0B,EAAC,GAAG,YAAY,EAAE,EAAE,EAAE,WAAW,EAAE,YAAY,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;gBAChH,WAAW,GAAG,IAAI,CAAC;YACvB,CAAC,EAAE,CAAC,CAAC,cAAc,CAAC,OAAO,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,IAAI,CAAC,iBAAiB,CAAC,CAAC;QACzE,CAAC,CAAC;QAEF,IAAI,KAAK,EAAE,MAAM,QAAQ,IAAI,EAAE,EAAE,CAAC;YAC9B,YAAY,GAAG,QAAQ,CAAC;YACxB,IAAI,UAAU,CAAC,MAAM,CAAC,OAAO,IAAI,WAAW,EAAE,CAAC;gBAC3C,MAAM;YACV,CAAC;YACD,IAAI,gBAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBACjD,mBAAmB,EAAE,CAAC;YAC1B,CAAC;YAED,IAAI,CAAC,IAAI,CAAC,sBAAsB,CAAC,QAAQ,EAAE,KAAK,CAAC,EAAE,CAAC;gBAChD,SAAS;YACb,CAAC;YAED,IAAI,gBAAgB,EAAE,CAAC;gBACnB,YAAY,CAAC,gBAAgB,CAAC,CAAC;YACnC,CAAC;YACD,MAAM,wBAAwB,CAAC;YAC/B,YAAY,GAAG,IAAI,CAAC,kBAAkB,CAAC,QAAQ,EAAE,KAAK,EAAE,kBAAkB,EAAE,aAAa,CAAC,CAAC;YAE3F,OAAO,IAAA,oCAA0B,EAAC,GAAG,QAAQ,EAAE,EAAE,EAAE,WAAW,EAAE,YAAY,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QACpG,CAAC;QAED,IAAI,gBAAgB,EAAE,CAAC;YACnB,YAAY,CAAC,gBAAgB,CAAC,CAAC;QACnC,CAAC;QAED,IAAI,CAAC,YAAY,EAAE,CAAC;YAChB,MAAM,IAAI,+BAAqB,CAAC,kCAAkC,WAAW,EAAE,CAAC,CAAC;QACrF,CAAC;QAED,IAAI,CAAC,WAAW,EAAE,CAAC;YACf,MAAM,wBAAwB,CAAC;YAC/B,YAAY,GAAG,IAAI,CAAC,kBAAkB,CAAC,YAAY,EAAE,KAAK,EAAE,kBAAkB,EAAE,aAAa,CAAC,CAAC;QACnG,CAAC;QAED,OAAO,IAAA,oCAA0B,EAAC,GAAG,YAAY,EAAE,EAAE,EAAE,WAAW,EAAE,YAAY,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IACxG,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,kBAAkB,CACpB,MAA4F,EAC5F,cAAuB,KAAK,EAC5B,UAAmB,KAAK;QAExB,2BAA2B;QAC3B,MAAM,aAAa,GAAG,MAAM,CAAC,CAAC,CAAC;QAC/B,MAAM,WAAW,GAAG,sIAAsI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAE/K,mCAAmC;QACnC,IAAI,QAAQ,GAAG,CAAC,CAAC;QACjB,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;QACzE,IAAI,OAAO,CAAC,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;YACjC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC;QAClD,CAAC;QAED,IAAI,UAAU,GAAG,aAAa,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC5C,MAAM,UAAU,GAAG,WAAW,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAElG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,mBAAmB,aAAa,4BAA4B,CAAC,CAAC;QAE/E,IAAI,KAAK,GAAa,EAAE,CAAC;QACzB,mBAAmB;QACnB,MAAM,CAAC,GAAG,CAAC,CAAC;QAEZ,OAAO,QAAQ,GAAG,CAAC,EAAE,CAAC;YAClB,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,QAAQ,CAAC;YAC1D,KAAK,GAAG,WAAW,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,MAAM,GAAG,KAAK,CAAC,CAAC;YAC/F,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAC9B,IAAI,CAAC,KAAK,EAAE,CAAC;gBACT,MAAM;YACV,CAAC;YACD,QAAQ,IAAI,CAAC,CAAC;YACd,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,yCAAyC,KAAK,GAAG,CAAC,CAAC;YACpE,MAAM,cAAc,GAAG,EAAE,GAAG,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC;YAC/C,MAAM,eAAe,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,OAAO,EAAE,cAAc,EAAE,OAAO,CAAC,CAAC;YACzF,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC7B,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,KAAK,EAAE,cAAc,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC;YAC3E,CAAC;QACL,CAAC;QAED,IAAI,KAAK,CAAC,MAAM,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC;YACnC,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACnC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,yCAAyC,KAAK,GAAG,CAAC,CAAC;YACpE,MAAM,cAAc,GAAG,EAAE,GAAG,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC;YAC/C,QAAQ,IAAI,CAAC,CAAC;YACd,MAAM,eAAe,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,OAAO,EAAE,cAAc,EAAE,OAAO,CAAC,CAAC;YAEzF,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC7B,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;YACzD,CAAC;QACL,CAAC;QAED,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,CAAC;IACvD,CAAC;IAED,KAAK,CAAC,CAAC,kBAAkB,CACrB,IAAkF,EAClF,aAA+B,EAC/B,OAA+B,EAC/B,cAA+B,EAC/B,KAAc;QAEd,IAAI,CAAC,aAAa,EAAE,CAAC;YACjB,OAAO;QACX,CAAC;QACD,MAAM,IAAI,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,GAAI,CAAC,CAAC,CAAC;QACvD,MAAM,WAAW,GAAG,IAAI,OAAO,EAAE,CAAC;QAClC,IAAI,KAAK,EAAE,MAAM,QAAQ,IAAI,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,OAAO,EAAE,cAAc,CAAC,EAAE,CAAC;YACjF,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;gBACjC,IAAI,CAAC,CAAC,EAAE,CAAC;oBACL,OAAO,EAAE,CAAC;gBACd,CAAC;gBACD,IAAI,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;oBACrB,OAAO,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;gBAC9B,CAAC;gBACD,OAAO,IAAI,CAAC,OAAO,CAAC,6BAA6B,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE;oBAC/F,WAAW,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;oBAEtB,OAAO,CAAC,CAAC;gBACb,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;oBACb,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,iCAAiC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,EAAE,GAAG,EAAE,IAAA,uBAAgB,EAAC,GAAG,CAAC,EAAE,CAAC,CAAC;oBAEnG,OAAO,EAAE,CAAC;gBACd,CAAC,CAAC,CAAC;YACP,CAAC,CAAC,CAAC;YAEH,MAAM,WAAW,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,MAAM,CAAoB,CAAC;YACjE,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,WAAW,CAAC,OAAO,EAAE,EAAE,CAAC;gBACzC,IAAI,CAAC,EAAE,CAAC;oBACJ,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBACvC,CAAC;YACL,CAAC;YAED,MAAM,IAAI,CAAC,uBAAuB,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC;QAC7D,CAAC;IACL,CAAC;IAED,uBAAuB,CAAC,aAA8B,EAAE,KAAc;QAClE,MAAM,iBAAiB,GAAG,KAAK,IAAI,IAAI,CAAC,iBAAiB,CAAC;QAC1D,MAAM,CAAC,cAAc,EAAE,gBAAgB,CAAC,GAAG,gBAAC,CAAC,SAAS,CAAC,aAAa,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;QACpG,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,cAAc,CAAC,CAAC;QAE1C,MAAM,CAAC,GAAG,iBAAiB,GAAG,cAAc,CAAC,MAAM,CAAC;QACpD,KAAK,MAAM,CAAC,IAAI,gBAAgB,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACxD,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACrB,CAAC;QAED,MAAM,QAAQ,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,iBAAiB,CAAC,CAAC;QAE3F,MAAM,WAAW,GAAG,QAAQ,CAAC;QAE7B,WAAW,CAAC,QAAQ,GAAG,aAAa,CAAC,QAAQ,CAAC;QAE9C,OAAO,WAAW,CAAC;IACvB,CAAC;IAED,kBAAkB,CAAC,SAA0B,EAAE,GAAW,EAAE,MAAc,EAAE,aAAsB;QAC9F,IAAI,aAAa,GAAG,CAAC,CAAC;QACtB,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;YACxB,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAE3D,IAAI,CAAC,UAAU,EAAE,CAAC;gBACd,SAAS;YACb,CAAC;YAED,aAAa,IAAI,UAAU,CAAC;QAChC,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,EAAE,CAAC,GAAG,KAAK,GAAG,MAAM,CAAC;QAEpE,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC;QAEjD,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACtB,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;gBACxB,CAAC,CAAC,KAAK,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;YAClE,CAAC;QACL,CAAC;QAED,MAAM,QAAQ,GAAwB,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC;QACnE,IAAI,aAAa,EAAE,CAAC;YAChB,QAAQ,CAAC,QAAQ,GAAG,aAAa,CAAC;QACtC,CAAC;QAED,IAAA,oBAAU,EAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;QAEhC,OAAO,KAAK,CAAC;IACjB,CAAC;IAED,aAAa,CAAC,aAA4B;QACtC,OAAO,aAAa,CAAC,KAAK;YACtB,aAAa,CAAC,OAAO;YACrB,aAAa,CAAC,aAAa;YAC3B,aAAa,CAAC,WAAW;YACzB,aAAa,CAAC,IAAI;YAClB,aAAa,CAAC,IAAI,CAAC;IAC3B,CAAC;IAED,sBAAsB,CAAC,OAAwB,EAAE,iBAAiB,GAAG,IAAI,CAAC,iBAAiB;QACvF,OAAO,gBAAC,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,MAAM,IAAI,iBAAiB,CAAC;IACjG,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,MAAc;QAC3B,MAAM,GAAG,GAAG,uDAAuD,MAAM,EAAE,CAAC;QAE5E,IAAI,CAAC;YACD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;YAClC,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACf,OAAO,EAAE,CAAC;YACd,CAAC;YACD,MAAM,EAAE,GAAG,MAAM,QAAQ,CAAC,WAAW,EAAE,CAAC;YACxC,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAC/B,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;YACzC,OAAO,yBAAyB,MAAM,EAAE,CAAC;QAC7C,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YAClB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,qCAAqC,EAAE,EAAE,GAAG,EAAE,IAAA,uBAAgB,EAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAC1F,OAAO,EAAE,CAAC;QACd,CAAC;IACL,CAAC;IAED,CAAC,aAAa,CAAC,UAAmB,EAAE,OAAgB;QAChD,IAAI,UAAU,KAAK,MAAM,EAAE,CAAC;YACxB,MAAM,IAAI,CAAC,UAAU,CAAC;YACtB,MAAM,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC;YAC5D,MAAM,IAAI,CAAC,YAAY,CAAC;YAExB,OAAO;QACX,CAAC;QAED,IAAI,UAAU,KAAK,QAAQ,EAAE,CAAC;YAC1B,MAAM,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC;YAC5D,MAAM,IAAI,CAAC,YAAY,CAAC;YACxB,MAAM,IAAI,CAAC,YAAY,CAAC;YAExB,OAAO;QACX,CAAC;QAED,MAAM,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC;QAC5D,MAAM,IAAI,CAAC,YAAY,CAAC;QACxB,MAAM,IAAI,CAAC,YAAY,CAAC;IAC5B,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,OAAkC,EAAE,KAA0B,EAAE,OAAiB;QAChG,MAAM,WAAW,GAAG,IAAA,sBAAe,EAAC,EAAE,GAAG,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;QAC3D,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC;QAChC,OAAO,CAAC,cAAc,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;QAC1C,IAAI,KAAK,CAAC;QACV,IAAI,CAAC,OAAO,EAAE,CAAC;YACX,KAAK,GAAG,CAAC,MAAM,qBAAU,CAAC,kBAAkB,CACxC,qBAAU,CAAC,UAAU,CAAC,KAAK,CAAC,aAAa,EAAE,IAAI,EAAE,WAAW,CAAC;iBACxD,OAAO,CAAC,WAAW,EAAE,MAAM,CAAC;iBAC5B,KAAK,CAAC,CAAC,CAAC,CAChB,CAAC,CAAC,CAAC,CAAC,CAAC;YACN,IAAI,KAAK,EAAE,CAAC;gBACR,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;gBACnD,MAAM,KAAK,GAAG,KAAK,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC;gBAC3E,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,WAAW,sBAAsB,KAAK,CAAC,CAAC,yBAAyB,WAAW,KAAK,GAAG,QAAQ,EAAE;oBAC7I,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,EAAE,KAAK;iBACzC,CAAC,CAAC;gBAEH,IAAI,CAAC,KAAK,EAAE,CAAC;oBACT,OAAO,KAAK,CAAC,QAAe,CAAC;gBACjC,CAAC;YACL,CAAC;QACL,CAAC;QAED,IAAI,CAAC;YACD,IAAI,CAAoB,CAAC;YACzB,IAAI,SAAS,CAAC;YACd,SAAS,EACT,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,OAAO,CAAC,EAAE,CAAC;gBACzD,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;gBACtB,IAAI,CAAC;oBACD,QAAQ,OAAO,EAAE,CAAC;wBACd,KAAK,QAAQ,CAAC,CAAC,CAAC;4BACZ,CAAC,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,WAAW,EAAE,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;4BAC7D,MAAM;wBACV,CAAC;wBACD,KAAK,MAAM,CAAC,CAAC,CAAC;4BACV,CAAC,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;4BAC5D,MAAM;wBACV,CAAC;wBACD,KAAK,KAAK,CAAC;wBACX,OAAO,CAAC,CAAC,CAAC;4BACN,CAAC,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;4BAC3D,MAAM;wBACV,CAAC;oBACL,CAAC;oBACD,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC;oBAC3B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,eAAe,EAAE,OAAO,MAAM,CAAC,WAAW,CAAC,IAAI,IAAI,OAAO,GAAG,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC;oBAC5I,MAAM,SAAS,CAAC;gBACpB,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACX,SAAS,GAAG,GAAG,CAAC;oBAChB,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC;oBAC3B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,gBAAgB,OAAO,iBAAiB,MAAM,CAAC,WAAW,CAAC,IAAI,EAAE,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,GAAG,CAAC,CAAC;gBACzH,CAAC;YACL,CAAC;YAED,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;gBACZ,MAAM,OAAO,GAAG,IAAI,IAAI,EAAE,CAAC;gBAC3B,MAAM,MAAM,GAAG,qBAAU,CAAC,IAAI,CAAC;oBAC3B,KAAK;oBACL,WAAW;oBACX,QAAQ,EAAE,CAAC;oBACX,SAAS,EAAE,OAAO;oBAClB,QAAQ,EAAE,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,gBAAgB,CAAC;iBAChE,CAAC,CAAC;gBAEH,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACpC,CAAC;iBAAM,IAAI,SAAS,EAAE,CAAC;gBACnB,MAAM,SAAS,CAAC;YACpB,CAAC;YAED,OAAO,CAAqB,CAAC;QACjC,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAChB,IAAI,KAAK,EAAE,CAAC;gBACR,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,4FAA4F,EAAE,EAAE,GAAG,EAAE,IAAA,uBAAgB,EAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBAE/I,OAAO,KAAK,CAAC,QAAe,CAAC;YACjC,CAAC;YAED,MAAM,GAAG,CAAC;QACd,CAAC;IACL,CAAC;IAED,iBAAiB,CAAC,KAAqB;QACnC,MAAM,gBAAgB,GAAG;YACrB,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW;SACzE,CAAC;QACF,MAAM,MAAM,GAAG;YACX,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,GAAG,EAAE,KAAK,CAAC,IAAI;YACf,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,SAAS,CAAC;YAC1C,GAAG,gBAAC,CAAC,IAAI,CAAC,KAAK,EAAE,gBAAgB,CAAC;SACrC,CAAC;QAEF,OAAO,MAAM,CAAC;IAClB,CAAC;IAED,KAAK,CAAC,kBAAkB,CAAC,MAAqB;QAC1C,MAAM,cAAc,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;QAE/D,IAAI,cAAc,IAAI,MAAM,CAAC,GAAG,EAAE,CAAC;YAC/B,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAChC,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;QACtE,CAAC;QAED,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;IACrD,CAAC;CACJ,CAAA;AAjyBY,oCAAY;AAgFf;IArBL,IAAA,iBAAM,EAAC;QACJ,IAAI,EAAE,aAAa;QACnB,GAAG,EAAE;YACD,IAAI,EAAE;gBACF,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC;gBACvB,IAAI,EAAE,SAAS;aAClB;SACJ;QACD,IAAI,EAAE,CAAC,QAAQ,CAAC;QAChB,UAAU,EAAE,CAAC,MAAM,EAAE,uDAAuB,CAAC;KAChD,CAAC;IACD,IAAA,iBAAM,EAAC;QACJ,GAAG,EAAE;YACD,IAAI,EAAE;gBACF,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC;gBACvB,IAAI,EAAE,KAAK;aACd;SACJ;QACD,IAAI,EAAE,CAAC,QAAQ,CAAC;QAChB,UAAU,EAAE,CAAC,MAAM,EAAE,uDAAuB,EAAE,mBAAS,CAAC;KAC3D,CAAC;IAEG,WAAA,IAAA,qBAAU,GAAE,CAAA;IACZ,WAAA,IAAA,cAAG,GAAE,CAAA;IAIL,WAAA,IAAA,gBAAK,EAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,CAAA;IAE9D,WAAA,IAAA,gBAAK,EAAC,MAAM,EAAE,EAAE,IAAI,EAAE,IAAI,GAAG,CAAC,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAA;IAE3E,WAAA,IAAA,gBAAK,EAAC,UAAU,EAAE,EAAE,IAAI,EAAE,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAA;IAE3E,WAAA,IAAA,gBAAK,EAAC,KAAK,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,CAAA;IAE5D,WAAA,IAAA,gBAAK,EAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC,CAAA;IACxF,YAAA,IAAA,gBAAK,EAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,EAAE,CAAC,CAAA;IACjF,YAAA,IAAA,gBAAK,EAAC,UAAU,CAAC,CAAA;IACjB,YAAA,IAAA,gBAAK,EAAC,MAAM,CAAC,CAAA;IACb,YAAA,IAAA,gBAAK,EAAC,UAAU,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAA;IACnD,YAAA,IAAA,gBAAK,EAAC,GAAG,CAAC,CAAA;;yDAlBe,uBAAa,oBAAb,uBAAa,oDAC3B,kBAAO,oBAAP,kBAAO,gCACb,4CAAqB;QACX,gCAAc,sBACL,gDAAgC,oBAAhC,gDAAgC;;0CA8Y5D;uBAneQ,YAAY;IADxB,IAAA,oBAAS,GAAE;qCAsBoB,qBAAY,sBACR,6BAAgB,oBAAhB,6BAAgB,gCACrB,iCAAiB;QACrB,qBAAW;QACD,sCAAiB,sBACtB,yBAAyB,oBAAzB,yBAAyB,oDAC3B,uBAAuB,oBAAvB,uBAAuB,gCACzB,kCAAuB;GA5BtC,YAAY,CAiyBxB;AAED,MAAM,SAAS,GAAG;IACd,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE;IAChC,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE;IAClC,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE;IACnC,EAAE,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,WAAW,EAAE;IACvC,EAAE,GAAG,EAAE,aAAa,EAAE,KAAK,EAAE,aAAa,EAAE;IAC5C,EAAE,GAAG,EAAE,eAAe,EAAE,KAAK,EAAE,gBAAgB,EAAE;IACjD,EAAE,GAAG,EAAE,YAAY,EAAE,KAAK,EAAE,aAAa,EAAE;IAC3C,EAAE,GAAG,EAAE,aAAa,EAAE,KAAK,EAAE,cAAc,EAAE;IAC7C,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE;IAC9B,EAAE,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE;CACvC,CAAC;AAEF,MAAM,iBAAiB,GAAG;IACtB,QAAQ,CAAsB,CAAU;QACpC,MAAM,MAAM,GAAG,EAAE,CAAC;QAClB,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;YAC3B,MAAM,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;YACtC,IAAI,OAAO,CAAC,KAAK,WAAW,EAAE,CAAC;gBAC3B,IAAI,CAAC,KAAK,SAAS,EAAE,CAAC;oBAClB,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,MAAM,CAAC,EAAE,CAAC,CAAC;gBACzC,CAAC;qBAAM,CAAC;oBACJ,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,KAAK,KAAK,CAAC,EAAE,CAAC,CAAC;gBAClD,CAAC;YACL,CAAC;QACL,CAAC;QAED,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACf,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;QACrC,CAAC;QAED,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YACd,MAAM,kBAAkB,GAAG,CAAC,GAAG,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,SAAS,CAAC,CAAC;YAC9E,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC/C,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC/C,CAAC;YACD,IAAI,kBAAkB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAClC,kBAAkB,CAAC,IAAI,CAAC,gDAAgD,CAAC,CAAC;YAC9E,CAAC;YACD,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAC/C,CAAC;QACD,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACb,MAAM,iBAAiB,GAAG,CAAC,GAAG,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,gBAAgB,CAAC,CAAC;YACpF,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC5B,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;oBAC9B,iBAAiB,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBAC7C,CAAC;YACL,CAAC;iBAAM,CAAC;gBACJ,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;oBAC9C,iBAAiB,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBAC7C,CAAC;YACL,CAAC;YACD,IAAI,iBAAiB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACjC,iBAAiB,CAAC,IAAI,CAAC,uDAAuD,CAAC,CAAC;YACpF,CAAC;YACD,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAC9C,CAAC;QAED,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC;CACJ,CAAC"} \ No newline at end of file diff --git a/build/api/serp.js b/build/api/serp.js new file mode 100644 index 0000000000000000000000000000000000000000..035dc5d488ee6abbadbe6e144b2e7e641003bc0e --- /dev/null +++ b/build/api/serp.js @@ -0,0 +1,513 @@ +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var __param = (this && this.__param) || function (paramIndex, decorator) { + return function (target, key) { decorator(target, key, paramIndex); } +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +var _a, _b, _c, _d, _e; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.SerpHost = void 0; +const tsyringe_1 = require("tsyringe"); +const civ_rpc_1 = require("civkit/civ-rpc"); +const lang_1 = require("civkit/lang"); +const lodash_1 = __importDefault(require("lodash")); +const rate_limit_1 = require("../shared/services/rate-limit"); +const logger_1 = require("../services/logger"); +const async_context_1 = require("../services/async-context"); +const registry_1 = require("../services/registry"); +const transform_server_event_stream_1 = require("../lib/transform-server-event-stream"); +const jina_embeddings_auth_1 = require("../dto/jina-embeddings-auth"); +const errors_1 = require("../services/errors"); +const serper_search_1 = require("../shared/3rd-party/serper-search"); +const google_1 = require("../services/serp/google"); +const crawler_options_1 = require("../dto/crawler-options"); +const hash_1 = require("civkit/hash"); +const searched_1 = require("../db/searched"); +const serper_1 = require("../services/serp/serper"); +const lru_cache_1 = require("lru-cache"); +const api_roll_1 = require("../shared/db/api-roll"); +const internal_1 = require("../services/serp/internal"); +const WORLD_COUNTRY_CODES = Object.keys(serper_search_1.WORLD_COUNTRIES).map((x) => x.toLowerCase()); +const indexProto = { + toString: function () { + return (0, lodash_1.default)(this) + .toPairs() + .map(([k, v]) => k ? `[${lodash_1.default.upperFirst(lodash_1.default.lowerCase(k))}] ${v}` : '') + .value() + .join('\n') + '\n'; + } +}; +let SerpHost = class SerpHost extends civ_rpc_1.RPCHost { + async getIndex(ctx, auth) { + const indexObject = Object.create(indexProto); + Object.assign(indexObject, { + usage1: 'https://r.jina.ai/YOUR_URL', + usage2: 'https://s.jina.ai/YOUR_SEARCH_QUERY', + usage3: `${ctx.origin}/?q=YOUR_SEARCH_QUERY`, + homepage: 'https://jina.ai/reader', + }); + if (auth && auth.user) { + indexObject[''] = undefined; + indexObject.authenticatedAs = `${auth.user.user_id} (${auth.user.full_name})`; + indexObject.balanceLeft = auth.user.wallet.total_balance; + } + else { + indexObject.note = 'Authentication is required to use this endpoint. Please provide a valid API key via Authorization header.'; + } + return indexObject; + } + constructor(globalLogger, rateLimitControl, threadLocal, googleSerp, serperGoogle, serperBing, jinaSerp) { + super(...arguments); + this.globalLogger = globalLogger; + this.rateLimitControl = rateLimitControl; + this.threadLocal = threadLocal; + this.googleSerp = googleSerp; + this.serperGoogle = serperGoogle; + this.serperBing = serperBing; + this.jinaSerp = jinaSerp; + this.logger = this.globalLogger.child({ service: this.constructor.name }); + this.cacheRetentionMs = 1000 * 3600 * 24 * 7; + this.cacheValidMs = 1000 * 3600; + this.pageCacheToleranceMs = 1000 * 3600 * 24; + this.reasonableDelayMs = 15_000; + this.targetResultCount = 5; + this.highFreqKeyCache = new lru_cache_1.LRUCache({ + max: 256, + ttl: 60 * 60 * 1000, + updateAgeOnGet: false, + updateAgeOnHas: false, + }); + this.batchedCaches = []; + setInterval(() => { + const thisBatch = this.batchedCaches; + this.batchedCaches = []; + if (!thisBatch.length) { + return; + } + const batch = searched_1.SERPResult.DB.batch(); + for (const x of thisBatch) { + batch.set(searched_1.SERPResult.COLLECTION.doc(), x.degradeForFireStore()); + } + batch.commit() + .then(() => { + this.logger.debug(`Saved ${thisBatch.length} caches by batch`); + }) + .catch((err) => { + this.logger.warn(`Failed to cache search result in batch`, { err }); + }); + }, 1000 * 10 + Math.round(1000 * Math.random())).unref(); + } + async init() { + await this.dependencyReady(); + this.emit('ready'); + } + async search(rpcReflect, ctx, crawlerOptions, auth, variant, q, searchEngine, num, gl, _hl, location, page, fallback) { + const authToken = auth.bearerToken; + let highFreqKey; + if (authToken && this.highFreqKeyCache.has(authToken)) { + highFreqKey = this.highFreqKeyCache.get(authToken); + auth.user = highFreqKey.user; + auth.uid = highFreqKey.user?.user_id; + } + const uid = await auth.solveUID(); + if (!q) { + if (ctx.path === '/') { + const indexObject = await this.getIndex(ctx, auth); + if (!ctx.accepts('text/plain') && (ctx.accepts('text/json') || ctx.accepts('application/json'))) { + return indexObject; + } + return (0, civ_rpc_1.assignTransferProtocolMeta)(`${indexObject}`, { contentType: 'text/plain; charset=utf-8', envelope: null }); + } + throw new civ_rpc_1.ParamValidationError({ + path: 'q', + message: `Required but not provided` + }); + } + // Return content by default + const user = await auth.assertUser(); + if (!(user.wallet.total_balance > 0)) { + throw new errors_1.InsufficientBalanceError(`Account balance not enough to run this query, please recharge.`); + } + if (highFreqKey?.blockedUntil) { + const now = new Date(); + const blockedTimeRemaining = (highFreqKey.blockedUntil.valueOf() - now.valueOf()); + if (blockedTimeRemaining > 0) { + this.logger.warn(`Rate limit triggered for ${uid}, this request should have been blocked`); + // throw RateLimitTriggeredError.from({ + // message: `Per UID rate limit exceeded (async)`, + // retryAfter: Math.ceil(blockedTimeRemaining / 1000), + // }); + } + } + const PREMIUM_KEY_LIMIT = 400; + const rateLimitPolicy = auth.getRateLimits('SEARCH') || [ + parseInt(user.metadata?.speed_level) >= 2 ? + rate_limit_1.RateLimitDesc.from({ + occurrence: PREMIUM_KEY_LIMIT, + periodSeconds: 60 + }) : + rate_limit_1.RateLimitDesc.from({ + occurrence: 40, + periodSeconds: 60 + }) + ]; + const apiRollPromise = this.rateLimitControl.simpleRPCUidBasedLimit(rpcReflect, uid, ['SEARCH'], ...rateLimitPolicy); + if (!highFreqKey) { + // Normal path + await apiRollPromise; + if (rateLimitPolicy.some((x) => { + const rpm = x.occurrence / (x.periodSeconds / 60); + if (rpm >= PREMIUM_KEY_LIMIT) { + return true; + } + return false; + })) { + this.highFreqKeyCache.set(auth.bearerToken, { + user, + }); + } + } + else { + // High freq key path + apiRollPromise.then( + // Rate limit not triggered, make sure not blocking. + () => { + delete highFreqKey.blockedUntil; + }, + // Rate limit triggered + (err) => { + if (!(err instanceof rate_limit_1.RateLimitTriggeredError)) { + return; + } + const now = Date.now(); + let tgtDate; + if (err.retryAfterDate) { + tgtDate = err.retryAfterDate; + } + else if (err.retryAfter) { + tgtDate = new Date(now + err.retryAfter * 1000); + } + if (tgtDate) { + const dt = tgtDate.valueOf() - now; + highFreqKey.blockedUntil = tgtDate; + setTimeout(() => { + if (highFreqKey.blockedUntil === tgtDate) { + delete highFreqKey.blockedUntil; + } + }, dt).unref(); + } + }).finally(async () => { + // Always asynchronously update user(wallet); + const user = await auth.getBrief().catch(() => undefined); + if (user) { + highFreqKey.user = user; + } + }); + } + let chargeAmount = 0; + rpcReflect.finally(async () => { + if (chargeAmount) { + auth.reportUsage(chargeAmount, `reader-search`).catch((err) => { + this.logger.warn(`Unable to report usage for ${uid}`, { err: (0, lang_1.marshalErrorLike)(err) }); + }); + try { + const apiRoll = await apiRollPromise; + apiRoll.chargeAmount = chargeAmount; + } + catch (err) { + await this.rateLimitControl.record({ + uid, + tags: [rpcReflect.name.toUpperCase()], + status: api_roll_1.API_CALL_STATUS.SUCCESS, + chargeAmount, + }).save().catch((err) => { + this.logger.warn(`Failed to save rate limit record`, { err: (0, lang_1.marshalErrorLike)(err) }); + }); + } + } + }); + let chargeAmountScaler = 1; + if (searchEngine === 'bing') { + chargeAmountScaler = 3; + } + if (variant !== 'web') { + chargeAmountScaler = 5; + } + let realQuery = q; + let queryTerms = q.split(/\s+/g).filter((x) => !!x); + let results = await this.cachedSearch(variant, { + provider: searchEngine, + q, + num, + gl, + // hl, + location, + page, + }, crawlerOptions); + if (fallback && !results?.length && (!page || page === 1)) { + let tryTimes = 1; + const containsRTL = /[\u0600-\u06FF\u0750-\u077F\u08A0-\u08FF\uFB50-\uFDFF\uFE70-\uFEFF\u0590-\u05FF\uFB1D-\uFB4F\u0700-\u074F\u0780-\u07BF\u07C0-\u07FF]/.test(q); + const lastResort = (containsRTL ? queryTerms.slice(queryTerms.length - 2) : queryTerms.slice(0, 2)).join(' '); + const n = 4; + let terms = []; + while (tryTimes < n) { + const delta = Math.ceil(queryTerms.length / n) * tryTimes; + terms = containsRTL ? queryTerms.slice(delta) : queryTerms.slice(0, queryTerms.length - delta); + const query = terms.join(' '); + if (!query) { + break; + } + if (realQuery === query) { + continue; + } + tryTimes += 1; + realQuery = query; + this.logger.info(`Retrying search with fallback query: "${realQuery}"`); + results = await this.cachedSearch(variant, { + provider: searchEngine, + q: realQuery, + num, + gl, + // hl, + location, + }, crawlerOptions); + if (results?.length) { + break; + } + } + if (!results?.length && realQuery.length > lastResort.length) { + realQuery = lastResort; + this.logger.info(`Retrying search with fallback query: "${realQuery}"`); + tryTimes += 1; + results = await this.cachedSearch(variant, { + provider: searchEngine, + q: realQuery, + num, + gl, + // hl, + location, + }, crawlerOptions); + } + chargeAmountScaler *= tryTimes; + } + if (!results?.length) { + results = []; + } + const finalResults = results.map((x) => this.mapToFinalResults(x)); + await Promise.all(finalResults.map((x) => this.assignGeneralMixin(x))); + chargeAmount = this.assignChargeAmount(finalResults, chargeAmountScaler); + (0, civ_rpc_1.assignMeta)(finalResults, { + query: realQuery, + fallback: realQuery === q ? undefined : realQuery, + }); + return finalResults; + } + assignChargeAmount(items, scaler) { + const numCharge = Math.ceil(items.length / 10) * 10000 * scaler; + (0, civ_rpc_1.assignMeta)(items, { usage: { tokens: numCharge } }); + return numCharge; + } + async getFavicon(domain) { + const url = `https://www.google.com/s2/favicons?sz=32&domain_url=${domain}`; + try { + const response = await fetch(url); + if (!response.ok) { + return ''; + } + const ab = await response.arrayBuffer(); + const buffer = Buffer.from(ab); + const base64 = buffer.toString('base64'); + return `data:image/png;base64,${base64}`; + } + catch (error) { + this.logger.warn(`Failed to get favicon base64 string`, { err: (0, lang_1.marshalErrorLike)(error) }); + return ''; + } + } + async configure(opts) { + const crawlOpts = { + proxyUrl: opts.proxyUrl, + cookies: opts.setCookies, + overrideUserAgent: opts.userAgent, + timeoutMs: opts.timeout ? opts.timeout * 1000 : undefined, + locale: opts.locale, + referer: opts.referer, + viewport: opts.viewport, + proxyResources: (opts.proxyUrl || opts.proxy?.endsWith('+')) ? true : false, + allocProxy: opts.proxy?.endsWith('+') ? opts.proxy.slice(0, -1) : opts.proxy, + }; + if (opts.locale) { + crawlOpts.extraHeaders ??= {}; + crawlOpts.extraHeaders['Accept-Language'] = opts.locale; + } + return crawlOpts; + } + mapToFinalResults(input) { + const whitelistedProps = [ + 'imageUrl', 'imageWidth', 'imageHeight', 'source', 'date', 'siteLinks' + ]; + const result = { + title: input.title, + url: input.link, + description: Reflect.get(input, 'snippet'), + ...lodash_1.default.pick(input, whitelistedProps), + }; + return result; + } + *iterProviders(preference, variant) { + if (preference === 'bing') { + yield this.serperBing; + yield this.serperGoogle; + yield this.googleSerp; + return; + } + if (preference === 'google') { + yield this.googleSerp; + yield this.googleSerp; + yield this.serperGoogle; + return; + } + // yield variant === 'web' ? this.jinaSerp : this.serperGoogle; + yield this.serperGoogle; + yield this.serperGoogle; + yield this.googleSerp; + } + async cachedSearch(variant, query, opts) { + const queryDigest = (0, hash_1.objHashMd5B64Of)({ ...query, variant }); + const provider = query.provider; + Reflect.deleteProperty(query, 'provider'); + const noCache = opts.noCache; + let cache; + if (!noCache) { + cache = (await searched_1.SERPResult.fromFirestoreQuery(searched_1.SERPResult.COLLECTION.where('queryDigest', '==', queryDigest) + .orderBy('createdAt', 'desc') + .limit(1)))[0]; + if (cache) { + const age = Date.now() - cache.createdAt.valueOf(); + const stale = cache.createdAt.valueOf() < (Date.now() - this.cacheValidMs); + this.logger.info(`${stale ? 'Stale cache exists' : 'Cache hit'} for search query "${query.q}", normalized digest: ${queryDigest}, ${age}ms old`, { + query, digest: queryDigest, age, stale + }); + if (!stale) { + return cache.response; + } + } + } + const scrappingOptions = await this.configure(opts); + try { + let r; + let lastError; + outerLoop: for (const client of this.iterProviders(provider, variant)) { + const t0 = Date.now(); + try { + switch (variant) { + case 'images': { + r = await Reflect.apply(client.imageSearch, client, [query, scrappingOptions]); + break; + } + case 'news': { + r = await Reflect.apply(client.newsSearch, client, [query, scrappingOptions]); + break; + } + case 'web': + default: { + r = await Reflect.apply(client.webSearch, client, [query, scrappingOptions]); + break; + } + } + const dt = Date.now() - t0; + this.logger.info(`Search took ${dt}ms, ${client.constructor.name}(${variant})`, { searchDt: dt, variant, client: client.constructor.name }); + break outerLoop; + } + catch (err) { + lastError = err; + const dt = Date.now() - t0; + this.logger.warn(`Failed to do ${variant} search using ${client.constructor.name}`, { err, variant, searchDt: dt, }); + } + } + if (r?.length) { + const nowDate = new Date(); + const record = searched_1.SERPResult.from({ + query, + queryDigest, + response: r, + createdAt: nowDate, + expireAt: new Date(nowDate.valueOf() + this.cacheRetentionMs) + }); + this.batchedCaches.push(record); + } + else if (lastError) { + throw lastError; + } + return r; + } + catch (err) { + if (cache) { + this.logger.warn(`Failed to fetch search result, but a stale cache is available. falling back to stale cache`, { err: (0, lang_1.marshalErrorLike)(err) }); + return cache.response; + } + throw err; + } + } + async assignGeneralMixin(result) { + const collectFavicon = this.threadLocal.get('collect-favicon'); + if (collectFavicon && result.link) { + const url = new URL(result.link); + Reflect.set(result, 'favicon', await this.getFavicon(url.origin)); + } + } +}; +exports.SerpHost = SerpHost; +__decorate([ + (0, registry_1.Method)({ + name: 'searchIndex', + ext: { + http: { + action: ['get', 'post'], + path: '/' + } + }, + tags: ['search'], + returnType: [String, transform_server_event_stream_1.OutputServerEventStream, civ_rpc_1.RawString], + }), + (0, registry_1.Method)({ + ext: { + http: { + action: ['get', 'post'], + } + }, + tags: ['search'], + returnType: [String, transform_server_event_stream_1.OutputServerEventStream, civ_rpc_1.RawString], + }), + __param(0, (0, registry_1.RPCReflect)()), + __param(1, (0, registry_1.Ctx)()), + __param(4, (0, registry_1.Param)('type', { type: new Set(['web', 'images', 'news']), default: 'web' })), + __param(5, (0, registry_1.Param)('q')), + __param(6, (0, registry_1.Param)('provider', { type: new Set(['google', 'bing']) })), + __param(7, (0, registry_1.Param)('num', { validate: (v) => v >= 0 && v <= 20 })), + __param(8, (0, registry_1.Param)('gl', { validate: (v) => WORLD_COUNTRY_CODES.includes(v?.toLowerCase()) })), + __param(9, (0, registry_1.Param)('hl', { validate: (v) => serper_search_1.WORLD_LANGUAGES.some(l => l.code === v) })), + __param(10, (0, registry_1.Param)('location')), + __param(11, (0, registry_1.Param)('page')), + __param(12, (0, registry_1.Param)('fallback')), + __metadata("design:type", Function), + __metadata("design:paramtypes", [typeof (_d = typeof civ_rpc_1.RPCReflection !== "undefined" && civ_rpc_1.RPCReflection) === "function" ? _d : Object, typeof (_e = typeof registry_1.Context !== "undefined" && registry_1.Context) === "function" ? _e : Object, crawler_options_1.CrawlerOptions, + jina_embeddings_auth_1.JinaEmbeddingsAuthDTO, String, String, String, Number, String, String, String, Number, Boolean]), + __metadata("design:returntype", Promise) +], SerpHost.prototype, "search", null); +exports.SerpHost = SerpHost = __decorate([ + (0, tsyringe_1.singleton)(), + __metadata("design:paramtypes", [logger_1.GlobalLogger, typeof (_a = typeof rate_limit_1.RateLimitControl !== "undefined" && rate_limit_1.RateLimitControl) === "function" ? _a : Object, async_context_1.AsyncLocalContext, + google_1.GoogleSERP, typeof (_b = typeof serper_1.SerperGoogleSearchService !== "undefined" && serper_1.SerperGoogleSearchService) === "function" ? _b : Object, typeof (_c = typeof serper_1.SerperBingSearchService !== "undefined" && serper_1.SerperBingSearchService) === "function" ? _c : Object, internal_1.InternalJinaSerpService]) +], SerpHost); +//# sourceMappingURL=serp.js.map \ No newline at end of file diff --git a/build/api/serp.js.map b/build/api/serp.js.map new file mode 100644 index 0000000000000000000000000000000000000000..99cfd00fe919834f01ce8fcdcdd19bcff446c2bd --- /dev/null +++ b/build/api/serp.js.map @@ -0,0 +1 @@ +{"version":3,"file":"serp.js","sourceRoot":"","sources":["../../src/api/serp.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/build/cloud-functions/adaptive-crawler.js b/build/cloud-functions/adaptive-crawler.js new file mode 100644 index 0000000000000000000000000000000000000000..eb8fa52ae39e6a6fddd2896021bb2124d4a3485e --- /dev/null +++ b/build/cloud-functions/adaptive-crawler.js @@ -0,0 +1,510 @@ +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var __param = (this && this.__param) || function (paramIndex, decorator) { + return function (target, key) { decorator(target, key, paramIndex); } +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +var AdaptiveCrawlerHost_1; +var _a, _b, _c, _d, _e, _f; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.AdaptiveCrawlerHost = void 0; +const civkit_1 = require("civkit"); +const tsyringe_1 = require("tsyringe"); +const shared_1 = require("../shared"); +const jina_embeddings_auth_1 = require("../shared/dto/jina-embeddings-auth"); +const robots_parser_1 = __importDefault(require("robots-parser")); +const xmldom_1 = require("@xmldom/xmldom"); +const adaptive_crawler_options_1 = require("../dto/adaptive-crawler-options"); +const crawler_options_1 = require("../dto/crawler-options"); +const adaptive_crawl_task_1 = require("../db/adaptive-crawl-task"); +const functions_1 = require("firebase-admin/functions"); +const get_function_url_1 = require("../utils/get-function-url"); +const md5Hasher = new civkit_1.HashManager('md5', 'hex'); +const removeURLHash = (url) => { + try { + const o = new URL(url); + o.hash = ''; + return o.toString(); + } + catch (e) { + return url; + } +}; +let AdaptiveCrawlerHost = class AdaptiveCrawlerHost extends civkit_1.RPCHost { + static { AdaptiveCrawlerHost_1 = this; } + static { this.__singleCrawlQueueName = 'singleCrawlQueue'; } + constructor(globalLogger, firebaseObjectStorage) { + super(...arguments); + this.globalLogger = globalLogger; + this.firebaseObjectStorage = firebaseObjectStorage; + this.logger = this.globalLogger.child({ service: this.constructor.name }); + // Actual cache storage (gcp buckets) exists for 7 days, so here we need to select a time < 7 days. + this.cacheExpiry = 3 * 1000 * 60 * 60 * 24; + } + async init() { + await this.dependencyReady(); + this.emit('ready'); + } + async adaptiveCrawl(rpcReflect, ctx, auth, crawlerOptions, adaptiveCrawlerOptions) { + this.logger.debug({ + adaptiveCrawlerOptions, + crawlerOptions, + }); + const uid = await auth.solveUID(); + const { useSitemap, maxPages } = adaptiveCrawlerOptions; + let tmpUrl = ctx.req.url.slice(1)?.trim(); + if (!tmpUrl) { + tmpUrl = crawlerOptions.url?.trim() ?? ''; + } + const targetUrl = new URL(tmpUrl); + if (!targetUrl) { + const latestUser = uid ? await auth.assertUser() : undefined; + if (!ctx.req.accepts('text/plain') && (ctx.req.accepts('text/json') || ctx.req.accepts('application/json'))) { + return this.getIndex(latestUser); + } + return (0, civkit_1.assignTransferProtocolMeta)(`${this.getIndex(latestUser)}`, { contentType: 'text/plain', envelope: null }); + } + const meta = { + targetUrl: targetUrl.toString(), + useSitemap, + maxPages, + }; + const digest = md5Hasher.hash(JSON.stringify(meta)); + const shortDigest = Buffer.from(digest, 'hex').toString('base64url'); + const existing = await adaptive_crawl_task_1.AdaptiveCrawlTask.fromFirestore(shortDigest); + if (existing?.createdAt) { + if (existing.createdAt.getTime() > Date.now() - this.cacheExpiry) { + this.logger.info(`Cache hit for ${shortDigest}, created at ${existing.createdAt.toDateString()}`); + return { taskId: shortDigest }; + } + else { + this.logger.info(`Cache expired for ${shortDigest}, created at ${existing.createdAt.toDateString()}`); + } + } + await adaptive_crawl_task_1.AdaptiveCrawlTask.COLLECTION.doc(shortDigest).set({ + _id: shortDigest, + status: adaptive_crawl_task_1.AdaptiveCrawlTaskStatus.PENDING, + statusText: 'Pending', + meta, + createdAt: new Date(), + urls: [], + processed: {}, + failed: {}, + }); + let urls = []; + if (useSitemap) { + urls = await this.crawlUrlsFromSitemap(targetUrl, maxPages); + } + if (urls.length > 0) { + await adaptive_crawl_task_1.AdaptiveCrawlTask.COLLECTION.doc(shortDigest).update({ + status: adaptive_crawl_task_1.AdaptiveCrawlTaskStatus.PROCESSING, + statusText: `Processing 0/${urls.length}`, + urls, + }); + const promises = []; + for (const url of urls) { + promises.push((0, functions_1.getFunctions)().taskQueue(AdaptiveCrawlerHost_1.__singleCrawlQueueName).enqueue({ + shortDigest, url, token: auth.bearerToken, meta + }, { + dispatchDeadlineSeconds: 1800, + uri: await (0, get_function_url_1.getFunctionUrl)(AdaptiveCrawlerHost_1.__singleCrawlQueueName), + })); + } + ; + await Promise.all(promises); + } + else { + meta.useSitemap = false; + await adaptive_crawl_task_1.AdaptiveCrawlTask.COLLECTION.doc(shortDigest).update({ + urls: [targetUrl.toString()], + }); + await (0, functions_1.getFunctions)().taskQueue(AdaptiveCrawlerHost_1.__singleCrawlQueueName).enqueue({ + shortDigest, url: targetUrl.toString(), token: auth.bearerToken, meta + }, { + dispatchDeadlineSeconds: 1800, + uri: await (0, get_function_url_1.getFunctionUrl)(AdaptiveCrawlerHost_1.__singleCrawlQueueName), + }); + } + return { taskId: shortDigest }; + } + async adaptiveCrawlStatus(rpcReflect, ctx, auth, taskId, urls = []) { + if (!taskId) { + throw new civkit_1.ParamValidationError('taskId is required'); + } + const state = await adaptive_crawl_task_1.AdaptiveCrawlTask.fromFirestore(taskId); + if (!state) { + throw new civkit_1.AssertionFailureError('The task does not exist'); + } + if (state?.createdAt && state.createdAt.getTime() < Date.now() - this.cacheExpiry) { + throw new civkit_1.AssertionFailureError('The task has expired'); + } + if (urls.length) { + const promises = Object.entries(state?.processed ?? {}).map(async ([url, cachePath]) => { + if (urls.includes(url)) { + const raw = await this.firebaseObjectStorage.downloadFile(cachePath); + state.processed[url] = JSON.parse(raw.toString('utf-8')); + } + }); + await Promise.all(promises); + } + return state; + } + async singleCrawlQueue(shortDigest, url, token, meta) { + const error = { + reason: '' + }; + const state = await adaptive_crawl_task_1.AdaptiveCrawlTask.fromFirestore(shortDigest); + if (state?.status === adaptive_crawl_task_1.AdaptiveCrawlTaskStatus.COMPLETED) { + return; + } + try { + url = removeURLHash(url); + } + catch (e) { + error.reason = `Failed to parse url: ${url}`; + } + this.logger.debug(shortDigest, url, meta); + const cachePath = `adaptive-crawl-task/${shortDigest}/${md5Hasher.hash(url)}`; + if (!error.reason) { + const result = meta.useSitemap + ? await this.handleSingleCrawl(shortDigest, url, token, cachePath) + : await this.handleSingleCrawlRecursively(shortDigest, url, token, meta, cachePath); + if (!result) { + return; + } + error.reason = result.error.reason; + } + await adaptive_crawl_task_1.AdaptiveCrawlTask.DB.runTransaction(async (transaction) => { + const ref = adaptive_crawl_task_1.AdaptiveCrawlTask.COLLECTION.doc(shortDigest); + const state = await transaction.get(ref); + const data = state.data(); + if (error.reason) { + data.failed[url] = error; + } + else { + data.processed[url] = cachePath; + } + const status = Object.keys(data.processed).length + Object.keys(data.failed).length >= data.urls.length + ? adaptive_crawl_task_1.AdaptiveCrawlTaskStatus.COMPLETED : adaptive_crawl_task_1.AdaptiveCrawlTaskStatus.PROCESSING; + const statusText = Object.keys(data.processed).length + Object.keys(data.failed).length >= data.urls.length + ? `Completed ${Object.keys(data.processed).length} Succeeded, ${Object.keys(data.failed).length} Failed` + : `Processing ${Object.keys(data.processed).length + Object.keys(data.failed).length}/${data.urls.length}`; + const payload = { + status, + statusText, + processed: data.processed, + failed: data.failed, + }; + if (status === adaptive_crawl_task_1.AdaptiveCrawlTaskStatus.COMPLETED) { + payload.finishedAt = new Date(); + payload.duration = new Date().getTime() - data.createdAt.toDate().getTime(); + } + transaction.update(ref, payload); + }); + } + async handleSingleCrawl(shortDigest, url, token, cachePath) { + const error = { + reason: '' + }; + const response = await fetch('https://r.jina.ai', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + 'Authorization': `Bearer ${token}`, + 'Accept': 'application/json', + }, + body: JSON.stringify({ url }) + }); + if (!response.ok) { + error.reason = `Failed to crawl ${url}, ${response.statusText}`; + } + else { + const json = await response.json(); + await this.firebaseObjectStorage.saveFile(cachePath, Buffer.from(JSON.stringify(json), 'utf-8'), { + metadata: { + contentType: 'application/json', + } + }); + } + return { + error, + }; + } + async handleSingleCrawlRecursively(shortDigest, url, token, meta, cachePath) { + const error = { + reason: '' + }; + const response = await fetch('https://r.jina.ai', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + 'Authorization': `Bearer ${token}`, + 'Accept': 'application/json', + 'X-With-Links-Summary': 'true', + }, + body: JSON.stringify({ url }) + }); + if (!response.ok) { + error.reason = `Failed to crawl ${url}, ${response.statusText}`; + } + else { + const json = await response.json(); + await this.firebaseObjectStorage.saveFile(cachePath, Buffer.from(JSON.stringify(json), 'utf-8'), { + metadata: { + contentType: 'application/json', + } + }); + const title = json.data.title; + const description = json.data.description; + const links = json.data.links; + const relevantUrls = await this.getRelevantUrls(token, { title, description, links }); + this.logger.debug(`Total urls: ${Object.keys(links).length}, relevant urls: ${relevantUrls.length}`); + for (const url of relevantUrls) { + let abortContinue = false; + let abortBreak = false; + await adaptive_crawl_task_1.AdaptiveCrawlTask.DB.runTransaction(async (transaction) => { + const ref = adaptive_crawl_task_1.AdaptiveCrawlTask.COLLECTION.doc(shortDigest); + const state = await transaction.get(ref); + const data = state.data(); + if (data.urls.includes(url)) { + this.logger.debug('Recursive CONTINUE', data); + abortContinue = true; + return; + } + const urls = [ + ...data.urls, + url + ]; + if (urls.length > meta.maxPages || data.status === adaptive_crawl_task_1.AdaptiveCrawlTaskStatus.COMPLETED) { + this.logger.debug('Recursive BREAK', data); + abortBreak = true; + return; + } + transaction.update(ref, { urls }); + }); + if (abortContinue) { + continue; + } + if (abortBreak) { + break; + } + await (0, functions_1.getFunctions)().taskQueue(AdaptiveCrawlerHost_1.__singleCrawlQueueName).enqueue({ + shortDigest, url, token, meta + }, { + dispatchDeadlineSeconds: 1800, + uri: await (0, get_function_url_1.getFunctionUrl)(AdaptiveCrawlerHost_1.__singleCrawlQueueName), + }); + } + ; + } + return { + error, + }; + } + async getRelevantUrls(token, { title, description, links }) { + const invalidSuffix = [ + '.zip', + '.docx', + '.pptx', + '.xlsx', + ]; + const validLinks = Object.entries(links) + .map(([title, link]) => link) + .filter(link => link.startsWith('http') && !invalidSuffix.some(suffix => link.endsWith(suffix))); + let query = ''; + if (!description) { + query += title; + } + else { + query += `TITLE: ${title}; DESCRIPTION: ${description}`; + } + const data = { + model: 'jina-reranker-v2-base-multilingual', + query, + top_n: 15, + documents: validLinks, + }; + const response = await fetch('https://api.jina.ai/v1/rerank', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + 'Authorization': `Bearer ${token}` + }, + body: JSON.stringify(data) + }); + const json = (await response.json()); + const highestRelevanceScore = json.results[0]?.relevance_score ?? 0; + return json.results.filter(r => r.relevance_score > Math.max(highestRelevanceScore * 0.6, 0.1)).map(r => removeURLHash(r.document.text)); + } + getIndex(user) { + // TODO: 需要更新使用方式 + // const indexObject: Record = Object.create(indexProto); + // Object.assign(indexObject, { + // usage1: 'https://r.jina.ai/YOUR_URL', + // usage2: 'https://s.jina.ai/YOUR_SEARCH_QUERY', + // homepage: 'https://jina.ai/reader', + // sourceCode: 'https://github.com/jina-ai/reader', + // }); + // if (user) { + // indexObject[''] = undefined; + // indexObject.authenticatedAs = `${user.user_id} (${user.full_name})`; + // indexObject.balanceLeft = user.wallet.total_balance; + // } + // return indexObject; + } + async crawlUrlsFromSitemap(url, maxPages) { + const sitemapsFromRobotsTxt = await this.getSitemapsFromRobotsTxt(url); + const initialSitemaps = []; + if (sitemapsFromRobotsTxt === null) { + initialSitemaps.push(`${url.origin}/sitemap.xml`); + } + else { + initialSitemaps.push(...sitemapsFromRobotsTxt); + } + const allUrls = new Set(); + const processedSitemaps = new Set(); + const fetchSitemapUrls = async (sitemapUrl) => { + sitemapUrl = sitemapUrl.trim(); + if (processedSitemaps.has(sitemapUrl)) { + return; + } + processedSitemaps.add(sitemapUrl); + try { + const response = await fetch(sitemapUrl); + const sitemapContent = await response.text(); + const parser = new xmldom_1.DOMParser(); + const xmlDoc = parser.parseFromString(sitemapContent, 'text/xml'); + // handle normal sitemap + const urlElements = xmlDoc.getElementsByTagName('url'); + for (let i = 0; i < urlElements.length; i++) { + const locElement = urlElements[i].getElementsByTagName('loc')[0]; + if (locElement) { + const loc = locElement.textContent?.trim() || ''; + if (loc.startsWith(url.origin) && !loc.endsWith('.xml')) { + allUrls.add(removeURLHash(loc)); + } + if (allUrls.size >= maxPages) { + return; + } + } + } + // handle sitemap index + const sitemapElements = xmlDoc.getElementsByTagName('sitemap'); + for (let i = 0; i < sitemapElements.length; i++) { + const locElement = sitemapElements[i].getElementsByTagName('loc')[0]; + if (locElement) { + await fetchSitemapUrls(locElement.textContent?.trim() || ''); + if (allUrls.size >= maxPages) { + return; + } + } + } + } + catch (error) { + this.logger.error(`Error fetching sitemap ${sitemapUrl}:`, error); + } + }; + for (const sitemapUrl of initialSitemaps) { + await fetchSitemapUrls(sitemapUrl); + if (allUrls.size >= maxPages) { + break; + } + } + const urlsToProcess = Array.from(allUrls).slice(0, maxPages); + return urlsToProcess; + } + async getSitemapsFromRobotsTxt(url) { + const hostname = url.origin; + const robotsUrl = `${hostname}/robots.txt`; + const response = await fetch(robotsUrl); + if (response.status === 404) { + return null; + } + const robotsTxt = await response.text(); + if (robotsTxt.length) { + const robot = (0, robots_parser_1.default)(robotsUrl, robotsTxt); + return robot.getSitemaps(); + } + return null; + } +}; +exports.AdaptiveCrawlerHost = AdaptiveCrawlerHost; +__decorate([ + (0, shared_1.CloudHTTPv2)({ + runtime: { + memory: '1GiB', + timeoutSeconds: 300, + concurrency: 22, + }, + tags: ['Crawler'], + httpMethod: ['post', 'get'], + returnType: [String], + }), + __param(0, (0, shared_1.RPCReflect)()), + __param(1, (0, shared_1.Ctx)()), + __metadata("design:type", Function), + __metadata("design:paramtypes", [typeof (_c = typeof civkit_1.RPCReflection !== "undefined" && civkit_1.RPCReflection) === "function" ? _c : Object, Object, typeof (_d = typeof jina_embeddings_auth_1.JinaEmbeddingsAuthDTO !== "undefined" && jina_embeddings_auth_1.JinaEmbeddingsAuthDTO) === "function" ? _d : Object, crawler_options_1.CrawlerOptions, + adaptive_crawler_options_1.AdaptiveCrawlerOptions]), + __metadata("design:returntype", Promise) +], AdaptiveCrawlerHost.prototype, "adaptiveCrawl", null); +__decorate([ + (0, shared_1.CloudHTTPv2)({ + runtime: { + memory: '1GiB', + timeoutSeconds: 300, + concurrency: 22, + }, + tags: ['Crawler'], + httpMethod: ['post', 'get'], + returnType: adaptive_crawl_task_1.AdaptiveCrawlTask, + }), + __param(0, (0, shared_1.RPCReflect)()), + __param(1, (0, shared_1.Ctx)()), + __param(3, (0, shared_1.Param)('taskId')), + __param(4, (0, shared_1.Param)('urls')), + __metadata("design:type", Function), + __metadata("design:paramtypes", [typeof (_e = typeof civkit_1.RPCReflection !== "undefined" && civkit_1.RPCReflection) === "function" ? _e : Object, Object, typeof (_f = typeof jina_embeddings_auth_1.JinaEmbeddingsAuthDTO !== "undefined" && jina_embeddings_auth_1.JinaEmbeddingsAuthDTO) === "function" ? _f : Object, String, Array]), + __metadata("design:returntype", Promise) +], AdaptiveCrawlerHost.prototype, "adaptiveCrawlStatus", null); +__decorate([ + (0, shared_1.CloudTaskV2)({ + name: AdaptiveCrawlerHost.__singleCrawlQueueName, + runtime: { + cpu: 1, + memory: '1GiB', + timeoutSeconds: 3600, + concurrency: 2, + maxInstances: 200, + retryConfig: { + maxAttempts: 3, + minBackoffSeconds: 60, + }, + rateLimits: { + maxConcurrentDispatches: 150, + maxDispatchesPerSecond: 5, + }, + } + }), + __param(0, (0, shared_1.Param)('shortDigest')), + __param(1, (0, shared_1.Param)('url')), + __param(2, (0, shared_1.Param)('token')), + __param(3, (0, shared_1.Param)('meta')), + __metadata("design:type", Function), + __metadata("design:paramtypes", [String, String, String, Object]), + __metadata("design:returntype", Promise) +], AdaptiveCrawlerHost.prototype, "singleCrawlQueue", null); +exports.AdaptiveCrawlerHost = AdaptiveCrawlerHost = AdaptiveCrawlerHost_1 = __decorate([ + (0, tsyringe_1.singleton)(), + __metadata("design:paramtypes", [typeof (_a = typeof shared_1.Logger !== "undefined" && shared_1.Logger) === "function" ? _a : Object, typeof (_b = typeof shared_1.FirebaseStorageBucketControl !== "undefined" && shared_1.FirebaseStorageBucketControl) === "function" ? _b : Object]) +], AdaptiveCrawlerHost); +//# sourceMappingURL=adaptive-crawler.js.map \ No newline at end of file diff --git a/build/cloud-functions/adaptive-crawler.js.map b/build/cloud-functions/adaptive-crawler.js.map new file mode 100644 index 0000000000000000000000000000000000000000..861d024b9e2f6a56607fa3e28858f8eb6118c191 --- /dev/null +++ b/build/cloud-functions/adaptive-crawler.js.map @@ -0,0 +1 @@ +{"version":3,"file":"adaptive-crawler.js","sourceRoot":"","sources":["../../src/cloud-functions/adaptive-crawler.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/build/cloud-functions/data-crunching.js b/build/cloud-functions/data-crunching.js new file mode 100644 index 0000000000000000000000000000000000000000..537b80fa4a0244857dc06e60447d805e750f389a --- /dev/null +++ b/build/cloud-functions/data-crunching.js @@ -0,0 +1,260 @@ +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var __param = (this && this.__param) || function (paramIndex, decorator) { + return function (target, key) { decorator(target, key, paramIndex); } +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +var _a, _b, _c; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.DataCrunchingHost = void 0; +const civkit_1 = require("civkit"); +const tsyringe_1 = require("tsyringe"); +const shared_1 = require("../shared"); +const lodash_1 = __importDefault(require("lodash")); +const crawler_1 = require("../api/crawler"); +const crawled_1 = require("../db/crawled"); +const dayjs_1 = __importDefault(require("dayjs")); +const fs_1 = require("fs"); +const promises_1 = require("fs/promises"); +const zlib_1 = require("zlib"); +const functions_1 = require("firebase-admin/functions"); +const snapshot_formatter_1 = require("../services/snapshot-formatter"); +const get_function_url_1 = require("../utils/get-function-url"); +dayjs_1.default.extend(require('dayjs/plugin/utc')); +let DataCrunchingHost = class DataCrunchingHost extends civkit_1.RPCHost { + constructor(globalLogger, crawler, snapshotFormatter, tempFileManager, firebaseObjectStorage) { + super(...lodash_1.default.without(arguments, crawler)); + this.globalLogger = globalLogger; + this.crawler = crawler; + this.snapshotFormatter = snapshotFormatter; + this.tempFileManager = tempFileManager; + this.firebaseObjectStorage = firebaseObjectStorage; + this.logger = this.globalLogger.child({ service: this.constructor.name }); + this.pageCacheCrunchingPrefix = 'crunched-pages'; + this.pageCacheCrunchingBatchSize = 5000; + this.pageCacheCrunchingTMinus = 6 * 24 * 60 * 60 * 1000; + this.rev = 7; + } + async init() { + await this.dependencyReady(); + this.emit('ready'); + } + // @CloudTaskV2({ + // runtime: { + // cpu: 2, + // memory: '4GiB', + // timeoutSeconds: 3600, + // concurrency: 2, + // maxInstances: 200, + // retryConfig: { + // maxAttempts: 3, + // minBackoffSeconds: 60, + // }, + // rateLimits: { + // maxConcurrentDispatches: 150, + // maxDispatchesPerSecond: 2, + // }, + // }, + // tags: ['DataCrunching'], + // }) + async crunchPageCacheWorker(date, offset) { + this.logger.info(`Crunching page cache @${date}+${offset}...`); + for await (const { fileName, records } of this.iterPageCacheRecords(date, offset)) { + this.logger.info(`Crunching ${fileName}...`); + const fileOnDrive = await this.crunchCacheRecords(records); + const fstream = (0, fs_1.createReadStream)(fileOnDrive.path); + const gzipStream = (0, zlib_1.createGzip)(); + fstream.pipe(gzipStream, { end: true }); + await this.firebaseObjectStorage.bucket.file(fileName).save(gzipStream, { + contentType: 'application/jsonl+gzip', + }); + } + this.logger.info(`Crunching page cache @${date}+${offset} done.`); + return true; + } + // @CloudScheduleV2('2 0 * * *', { + // name: 'crunchPageCacheEveryday', + // runtime: { + // cpu: 2, + // memory: '4GiB', + // timeoutSeconds: 1800, + // timeZone: 'UTC', + // retryCount: 3, + // minBackoffSeconds: 60, + // }, + // tags: ['DataCrunching'], + // }) + async dispatchPageCacheCrunching() { + for await (const { fileName, date, offset } of this.iterPageCacheChunks()) { + this.logger.info(`Dispatching ${fileName}...`); + // sse.write({ data: `Dispatching ${fileName}...` }); + await (0, functions_1.getFunctions)().taskQueue('crunchPageCacheWorker').enqueue({ date, offset }, { + dispatchDeadlineSeconds: 1800, + uri: await (0, get_function_url_1.getFunctionUrl)('crunchPageCacheWorker'), + }); + } + return true; + } + // @CloudHTTPv2({ + // runtime: { + // cpu: 2, + // memory: '4GiB', + // timeoutSeconds: 3600, + // concurrency: 2, + // maxInstances: 200, + // }, + // tags: ['DataCrunching'], + // }) + // async dispatchPageCacheCrunching( + // @RPCReflect() rpcReflect: RPCReflection + // ) { + // const sse = new OutputServerEventStream({ highWaterMark: 4096 }); + // rpcReflect.return(sse); + // rpcReflect.catch((err) => { + // sse.end({ data: `Error: ${err.message}` }); + // }); + // for await (const { fileName, date, offset } of this.iterPageCacheChunks()) { + // this.logger.info(`Dispatching ${fileName}...`); + // sse.write({ data: `Dispatching ${fileName}...` }); + // await getFunctions().taskQueue('crunchPageCacheWorker').enqueue({ date, offset }, { + // dispatchDeadlineSeconds: 1800, + // uri: await getFunctionUrl('crunchPageCacheWorker'), + // }); + // } + // sse.end({ data: 'done' }); + // return true; + // } + async *iterPageCacheRecords(date, inputOffset) { + const startOfToday = (0, dayjs_1.default)().utc().startOf('day'); + const startingPoint = (0, dayjs_1.default)().utc().subtract(this.pageCacheCrunchingTMinus, 'ms').startOf('day'); + let theDay = startingPoint; + if (date) { + theDay = (0, dayjs_1.default)(date).utc().startOf('day'); + } + let counter = 0; + if (inputOffset) { + counter = parseInt(inputOffset, 10); + } + while (theDay.isBefore(startOfToday)) { + const fileName = `${this.pageCacheCrunchingPrefix}/r${this.rev}/${theDay.format('YYYY-MM-DD')}/${counter}.jsonl.gz`; + const offset = counter; + counter += this.pageCacheCrunchingBatchSize; + const fileExists = (await this.firebaseObjectStorage.bucket.file(fileName).exists())[0]; + if (fileExists) { + continue; + } + const records = await crawled_1.Crawled.fromFirestoreQuery(crawled_1.Crawled.COLLECTION + .where('createdAt', '>=', theDay.toDate()) + .where('createdAt', '<', theDay.add(1, 'day').toDate()) + .orderBy('createdAt', 'asc') + .offset(offset) + .limit(this.pageCacheCrunchingBatchSize)); + this.logger.info(`Found ${records.length} records for ${theDay.format('YYYY-MM-DD')} at offset ${offset}`, { fileName, counter }); + if (!records.length) { + if (date) { + break; + } + theDay = theDay.add(1, 'day'); + counter = 0; + continue; + } + yield { fileName, records }; + if (offset) { + break; + } + } + } + async *iterPageCacheChunks() { + const startOfToday = (0, dayjs_1.default)().utc().startOf('day'); + const startingPoint = (0, dayjs_1.default)().utc().subtract(this.pageCacheCrunchingTMinus, 'ms').startOf('day'); + let theDay = startingPoint; + let counter = 0; + while (theDay.isBefore(startOfToday)) { + const fileName = `${this.pageCacheCrunchingPrefix}/r${this.rev}/${theDay.format('YYYY-MM-DD')}/${counter}.jsonl.gz`; + const offset = counter; + counter += this.pageCacheCrunchingBatchSize; + const fileExists = (await this.firebaseObjectStorage.bucket.file(fileName).exists())[0]; + if (fileExists) { + continue; + } + const nRecords = (await crawled_1.Crawled.COLLECTION + .where('createdAt', '>=', theDay.toDate()) + .where('createdAt', '<', theDay.add(1, 'day').toDate()) + .orderBy('createdAt', 'asc') + .offset(offset) + .limit(this.pageCacheCrunchingBatchSize) + .count().get()).data().count; + this.logger.info(`Found ${nRecords} records for ${theDay.format('YYYY-MM-DD')} at offset ${offset}`, { fileName, counter }); + if (nRecords < this.pageCacheCrunchingBatchSize) { + theDay = theDay.add(1, 'day'); + counter = 0; + } + if (nRecords) { + yield { fileName, date: theDay.toISOString(), offset }; + } + } + } + async crunchCacheRecords(records) { + const throttle = new civkit_1.PromiseThrottle(30); + const localFilePath = this.tempFileManager.alloc(); + let nextDrainDeferred = (0, civkit_1.Defer)(); + nextDrainDeferred.resolve(); + for (const record of records) { + await throttle.acquire(); + this.firebaseObjectStorage.downloadFile(`snapshots/${record._id}`) + .then(async (snapshotTxt) => { + try { + const snapshot = JSON.parse(snapshotTxt.toString('utf-8')); + let formatted = await this.snapshotFormatter.formatSnapshot('default', snapshot); + if (!formatted.content) { + formatted = await this.snapshotFormatter.formatSnapshot('markdown', snapshot); + } + await nextDrainDeferred.promise; + await (0, promises_1.appendFile)(localFilePath, JSON.stringify({ + url: snapshot.href, + title: snapshot.title || '', + html: snapshot.html || '', + text: snapshot.text || '', + content: formatted.content || '', + }) + '\n', { encoding: 'utf-8' }); + } + catch (err) { + this.logger.warn(`Failed to parse snapshot for ${record._id}`, { err }); + } + }) + .finally(() => { + throttle.release(); + }); + } + await throttle.nextDrain(); + const ro = { + path: localFilePath + }; + this.tempFileManager.bindPathTo(ro, localFilePath); + return ro; + } +}; +exports.DataCrunchingHost = DataCrunchingHost; +__decorate([ + __param(0, (0, shared_1.Param)('date')), + __param(1, (0, shared_1.Param)('offset', { default: 0 })), + __metadata("design:type", Function), + __metadata("design:paramtypes", [String, Number]), + __metadata("design:returntype", Promise) +], DataCrunchingHost.prototype, "crunchPageCacheWorker", null); +exports.DataCrunchingHost = DataCrunchingHost = __decorate([ + (0, tsyringe_1.singleton)(), + __metadata("design:paramtypes", [typeof (_a = typeof shared_1.Logger !== "undefined" && shared_1.Logger) === "function" ? _a : Object, crawler_1.CrawlerHost, + snapshot_formatter_1.SnapshotFormatter, typeof (_b = typeof shared_1.TempFileManager !== "undefined" && shared_1.TempFileManager) === "function" ? _b : Object, typeof (_c = typeof shared_1.FirebaseStorageBucketControl !== "undefined" && shared_1.FirebaseStorageBucketControl) === "function" ? _c : Object]) +], DataCrunchingHost); +//# sourceMappingURL=data-crunching.js.map \ No newline at end of file diff --git a/build/cloud-functions/data-crunching.js.map b/build/cloud-functions/data-crunching.js.map new file mode 100644 index 0000000000000000000000000000000000000000..4c6a6a84beae8237d4d122e71717381bab30b9f8 --- /dev/null +++ b/build/cloud-functions/data-crunching.js.map @@ -0,0 +1 @@ +{"version":3,"file":"data-crunching.js","sourceRoot":"","sources":["../../src/cloud-functions/data-crunching.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/build/db/adaptive-crawl-task.js b/build/db/adaptive-crawl-task.js new file mode 100644 index 0000000000000000000000000000000000000000..986c795d66d7beb7d20816443cbc5d43ec8ae222 --- /dev/null +++ b/build/db/adaptive-crawl-task.js @@ -0,0 +1,93 @@ +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var AdaptiveCrawlTask_1; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.AdaptiveCrawlTask = exports.AdaptiveCrawlTaskStatus = void 0; +const civkit_1 = require("civkit"); +const firestore_1 = require("../shared/lib/firestore"); +var AdaptiveCrawlTaskStatus; +(function (AdaptiveCrawlTaskStatus) { + AdaptiveCrawlTaskStatus["PENDING"] = "pending"; + AdaptiveCrawlTaskStatus["PROCESSING"] = "processing"; + AdaptiveCrawlTaskStatus["COMPLETED"] = "completed"; + AdaptiveCrawlTaskStatus["FAILED"] = "failed"; +})(AdaptiveCrawlTaskStatus || (exports.AdaptiveCrawlTaskStatus = AdaptiveCrawlTaskStatus = {})); +let AdaptiveCrawlTask = class AdaptiveCrawlTask extends firestore_1.FirestoreRecord { + static { AdaptiveCrawlTask_1 = this; } + static { this.collectionName = 'adaptiveCrawlTasks'; } + static { this.patchedFields = [ + 'meta', + ]; } + static from(input) { + for (const field of this.patchedFields) { + if (typeof input[field] === 'string') { + input[field] = (0, civkit_1.parseJSONText)(input[field]); + } + } + return super.from(input); + } + degradeForFireStore() { + const copy = { ...this }; + for (const field of this.constructor.patchedFields) { + if (typeof copy[field] === 'object') { + copy[field] = JSON.stringify(copy[field]); + } + } + return copy; + } +}; +exports.AdaptiveCrawlTask = AdaptiveCrawlTask; +__decorate([ + (0, civkit_1.Prop)({ + required: true + }), + __metadata("design:type", String) +], AdaptiveCrawlTask.prototype, "status", void 0); +__decorate([ + (0, civkit_1.Prop)({ + required: true + }), + __metadata("design:type", String) +], AdaptiveCrawlTask.prototype, "statusText", void 0); +__decorate([ + (0, civkit_1.Prop)(), + __metadata("design:type", Object) +], AdaptiveCrawlTask.prototype, "meta", void 0); +__decorate([ + (0, civkit_1.Prop)(), + __metadata("design:type", Array) +], AdaptiveCrawlTask.prototype, "urls", void 0); +__decorate([ + (0, civkit_1.Prop)(), + __metadata("design:type", Object) +], AdaptiveCrawlTask.prototype, "processed", void 0); +__decorate([ + (0, civkit_1.Prop)(), + __metadata("design:type", Object) +], AdaptiveCrawlTask.prototype, "failed", void 0); +__decorate([ + (0, civkit_1.Prop)(), + __metadata("design:type", Date) +], AdaptiveCrawlTask.prototype, "createdAt", void 0); +__decorate([ + (0, civkit_1.Prop)(), + __metadata("design:type", Date) +], AdaptiveCrawlTask.prototype, "finishedAt", void 0); +__decorate([ + (0, civkit_1.Prop)(), + __metadata("design:type", Number) +], AdaptiveCrawlTask.prototype, "duration", void 0); +exports.AdaptiveCrawlTask = AdaptiveCrawlTask = AdaptiveCrawlTask_1 = __decorate([ + (0, civkit_1.Also)({ + dictOf: Object + }) +], AdaptiveCrawlTask); +//# sourceMappingURL=adaptive-crawl-task.js.map \ No newline at end of file diff --git a/build/db/adaptive-crawl-task.js.map b/build/db/adaptive-crawl-task.js.map new file mode 100644 index 0000000000000000000000000000000000000000..f237b1b6c71d3984b261fc81df59542d0f7ace6e --- /dev/null +++ b/build/db/adaptive-crawl-task.js.map @@ -0,0 +1 @@ +{"version":3,"file":"adaptive-crawl-task.js","sourceRoot":"","sources":["../../src/db/adaptive-crawl-task.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAAA,mCAAmD;AACnD,uDAA0D;AAG1D,IAAY,uBAKX;AALD,WAAY,uBAAuB;IAC/B,8CAAmB,CAAA;IACnB,oDAAyB,CAAA;IACzB,kDAAuB,CAAA;IACvB,4CAAiB,CAAA;AACrB,CAAC,EALW,uBAAuB,uCAAvB,uBAAuB,QAKlC;AAKM,IAAM,iBAAiB,GAAvB,MAAM,iBAAkB,SAAQ,2BAAe;;aAClC,mBAAc,GAAG,oBAAoB,AAAvB,CAAwB;aA2C/C,kBAAa,GAAG;QACnB,MAAM;KACT,AAFmB,CAElB;IAEF,MAAM,CAAU,IAAI,CAAC,KAAU;QAC3B,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACrC,IAAI,OAAO,KAAK,CAAC,KAAK,CAAC,KAAK,QAAQ,EAAE,CAAC;gBACnC,KAAK,CAAC,KAAK,CAAC,GAAG,IAAA,sBAAa,EAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;YAC/C,CAAC;QACL,CAAC;QAED,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAsB,CAAC;IAClD,CAAC;IAEQ,mBAAmB;QACxB,MAAM,IAAI,GAAQ,EAAE,GAAG,IAAI,EAAE,CAAC;QAE9B,KAAK,MAAM,KAAK,IAAK,IAAI,CAAC,WAAwC,CAAC,aAAa,EAAE,CAAC;YAC/E,IAAI,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,QAAQ,EAAE,CAAC;gBAClC,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAQ,CAAC;YACrD,CAAC;QACL,CAAC;QAED,OAAO,IAAI,CAAC;IAChB,CAAC;;AApEQ,8CAAiB;AAQ1B;IAHC,IAAA,aAAI,EAAC;QACF,QAAQ,EAAE,IAAI;KACjB,CAAC;;iDAC+B;AAKjC;IAHC,IAAA,aAAI,EAAC;QACF,QAAQ,EAAE,IAAI;KACjB,CAAC;;qDACkB;AAGpB;IADC,IAAA,aAAI,GAAE;;+CAKL;AAGF;IADC,IAAA,aAAI,GAAE;;+CACS;AAGhB;IADC,IAAA,aAAI,GAAE;;oDAGL;AAGF;IADC,IAAA,aAAI,GAAE;;iDAGL;AAGF;IADC,IAAA,aAAI,GAAE;8BACK,IAAI;oDAAC;AAGjB;IADC,IAAA,aAAI,GAAE;8BACM,IAAI;qDAAC;AAGlB;IADC,IAAA,aAAI,GAAE;;mDACW;4BA1CT,iBAAiB;IAH7B,IAAA,aAAI,EAAC;QACF,MAAM,EAAE,MAAM;KACjB,CAAC;GACW,iBAAiB,CAuE7B"} \ No newline at end of file diff --git a/build/db/crawled.js b/build/db/crawled.js new file mode 100644 index 0000000000000000000000000000000000000000..88ce6626003bd004479f9c8f5a815192d1a8afff --- /dev/null +++ b/build/db/crawled.js @@ -0,0 +1,86 @@ +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var Crawled_1; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Crawled = void 0; +const civkit_1 = require("civkit"); +const firestore_1 = require("../shared/lib/firestore"); +let Crawled = class Crawled extends firestore_1.FirestoreRecord { + static { Crawled_1 = this; } + static { this.collectionName = 'crawled'; } + static { this.patchedFields = [ + 'snapshot' + ]; } + static from(input) { + for (const field of this.patchedFields) { + if (typeof input[field] === 'string') { + input[field] = (0, civkit_1.parseJSONText)(input[field]); + } + } + return super.from(input); + } + degradeForFireStore() { + const copy = { ...this }; + for (const field of this.constructor.patchedFields) { + if (typeof copy[field] === 'object') { + copy[field] = JSON.stringify(copy[field]); + } + } + return copy; + } +}; +exports.Crawled = Crawled; +__decorate([ + (0, civkit_1.Prop)({ + required: true + }), + __metadata("design:type", String) +], Crawled.prototype, "url", void 0); +__decorate([ + (0, civkit_1.Prop)({ + required: true + }), + __metadata("design:type", String) +], Crawled.prototype, "urlPathDigest", void 0); +__decorate([ + (0, civkit_1.Prop)(), + __metadata("design:type", Boolean) +], Crawled.prototype, "htmlSignificantlyModifiedByJs", void 0); +__decorate([ + (0, civkit_1.Prop)(), + __metadata("design:type", Object) +], Crawled.prototype, "snapshot", void 0); +__decorate([ + (0, civkit_1.Prop)(), + __metadata("design:type", Boolean) +], Crawled.prototype, "screenshotAvailable", void 0); +__decorate([ + (0, civkit_1.Prop)(), + __metadata("design:type", Boolean) +], Crawled.prototype, "pageshotAvailable", void 0); +__decorate([ + (0, civkit_1.Prop)(), + __metadata("design:type", Boolean) +], Crawled.prototype, "snapshotAvailable", void 0); +__decorate([ + (0, civkit_1.Prop)(), + __metadata("design:type", Date) +], Crawled.prototype, "createdAt", void 0); +__decorate([ + (0, civkit_1.Prop)(), + __metadata("design:type", Date) +], Crawled.prototype, "expireAt", void 0); +exports.Crawled = Crawled = Crawled_1 = __decorate([ + (0, civkit_1.Also)({ + dictOf: Object + }) +], Crawled); +//# sourceMappingURL=crawled.js.map \ No newline at end of file diff --git a/build/db/crawled.js.map b/build/db/crawled.js.map new file mode 100644 index 0000000000000000000000000000000000000000..b6a3f16af7352cbd6c34abbc61cc0d00e79c7f4e --- /dev/null +++ b/build/db/crawled.js.map @@ -0,0 +1 @@ +{"version":3,"file":"crawled.js","sourceRoot":"","sources":["../../src/db/crawled.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAAA,mCAAmD;AACnD,uDAA0D;AAOnD,IAAM,OAAO,GAAb,MAAM,OAAQ,SAAQ,2BAAe;;aACxB,mBAAc,GAAG,SAAS,AAAZ,CAAa;aAmCpC,kBAAa,GAAG;QACnB,UAAU;KACb,AAFmB,CAElB;IAEF,MAAM,CAAU,IAAI,CAAC,KAAU;QAC3B,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACrC,IAAI,OAAO,KAAK,CAAC,KAAK,CAAC,KAAK,QAAQ,EAAE,CAAC;gBACnC,KAAK,CAAC,KAAK,CAAC,GAAG,IAAA,sBAAa,EAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;YAC/C,CAAC;QACL,CAAC;QAED,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAY,CAAC;IACxC,CAAC;IAEQ,mBAAmB;QACxB,MAAM,IAAI,GAAQ,EAAE,GAAG,IAAI,EAAE,CAAC;QAE9B,KAAK,MAAM,KAAK,IAAK,IAAI,CAAC,WAA8B,CAAC,aAAa,EAAE,CAAC;YACrE,IAAI,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,QAAQ,EAAE,CAAC;gBAClC,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAQ,CAAC;YACrD,CAAC;QACL,CAAC;QAED,OAAO,IAAI,CAAC;IAChB,CAAC;;AA5DQ,0BAAO;AAQhB;IAHC,IAAA,aAAI,EAAC;QACF,QAAQ,EAAE,IAAI;KACjB,CAAC;;oCACW;AAKb;IAHC,IAAA,aAAI,EAAC;QACF,QAAQ,EAAE,IAAI;KACjB,CAAC;;8CACqB;AAGvB;IADC,IAAA,aAAI,GAAE;;8DACiC;AAGxC;IADC,IAAA,aAAI,GAAE;;yCAC2D;AAGlE;IADC,IAAA,aAAI,GAAE;;oDACuB;AAG9B;IADC,IAAA,aAAI,GAAE;;kDACqB;AAG5B;IADC,IAAA,aAAI,GAAE;;kDACqB;AAG5B;IADC,IAAA,aAAI,GAAE;8BACK,IAAI;0CAAC;AAGjB;IADC,IAAA,aAAI,GAAE;8BACI,IAAI;yCAAC;kBAlCP,OAAO;IAHnB,IAAA,aAAI,EAAC;QACF,MAAM,EAAE,MAAM;KACjB,CAAC;GACW,OAAO,CA+DnB"} \ No newline at end of file diff --git a/build/db/domain-blockade.js b/build/db/domain-blockade.js new file mode 100644 index 0000000000000000000000000000000000000000..e2c2baf8b320106f6beb5bef0fdc86ff67402bc7 --- /dev/null +++ b/build/db/domain-blockade.js @@ -0,0 +1,46 @@ +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.DomainBlockade = void 0; +const civkit_1 = require("civkit"); +const firestore_1 = require("../shared/lib/firestore"); +let DomainBlockade = class DomainBlockade extends firestore_1.FirestoreRecord { + static { this.collectionName = 'domainBlockades'; } +}; +exports.DomainBlockade = DomainBlockade; +__decorate([ + (0, civkit_1.Prop)({ + required: true + }), + __metadata("design:type", String) +], DomainBlockade.prototype, "domain", void 0); +__decorate([ + (0, civkit_1.Prop)({ required: true }), + __metadata("design:type", String) +], DomainBlockade.prototype, "triggerReason", void 0); +__decorate([ + (0, civkit_1.Prop)(), + __metadata("design:type", String) +], DomainBlockade.prototype, "triggerUrl", void 0); +__decorate([ + (0, civkit_1.Prop)(), + __metadata("design:type", Date) +], DomainBlockade.prototype, "createdAt", void 0); +__decorate([ + (0, civkit_1.Prop)(), + __metadata("design:type", Date) +], DomainBlockade.prototype, "expireAt", void 0); +exports.DomainBlockade = DomainBlockade = __decorate([ + (0, civkit_1.Also)({ + dictOf: Object + }) +], DomainBlockade); +//# sourceMappingURL=domain-blockade.js.map \ No newline at end of file diff --git a/build/db/domain-blockade.js.map b/build/db/domain-blockade.js.map new file mode 100644 index 0000000000000000000000000000000000000000..b3d78196a22b1e42ca5ce29af42cceef0e599da6 --- /dev/null +++ b/build/db/domain-blockade.js.map @@ -0,0 +1 @@ +{"version":3,"file":"domain-blockade.js","sourceRoot":"","sources":["../../src/db/domain-blockade.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,mCAAoC;AACpC,uDAA0D;AAKnD,IAAM,cAAc,GAApB,MAAM,cAAe,SAAQ,2BAAe;aAC/B,mBAAc,GAAG,iBAAiB,AAApB,CAAqB;;AAD1C,wCAAc;AAQvB;IAHC,IAAA,aAAI,EAAC;QACF,QAAQ,EAAE,IAAI;KACjB,CAAC;;8CACc;AAGhB;IADC,IAAA,aAAI,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;qDACF;AAGvB;IADC,IAAA,aAAI,GAAE;;kDACa;AAGpB;IADC,IAAA,aAAI,GAAE;8BACK,IAAI;iDAAC;AAGjB;IADC,IAAA,aAAI,GAAE;8BACI,IAAI;gDAAC;yBApBP,cAAc;IAH1B,IAAA,aAAI,EAAC;QACF,MAAM,EAAE,MAAM;KACjB,CAAC;GACW,cAAc,CAuB1B"} \ No newline at end of file diff --git a/build/db/domain-profile.js b/build/db/domain-profile.js new file mode 100644 index 0000000000000000000000000000000000000000..3faeacba1ca6110e73ccc2d6e6ac128ef2b4844a --- /dev/null +++ b/build/db/domain-profile.js @@ -0,0 +1,47 @@ +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.DomainProfile = void 0; +const civkit_1 = require("civkit"); +const firestore_1 = require("../shared/lib/firestore"); +const crawler_options_1 = require("../dto/crawler-options"); +let DomainProfile = class DomainProfile extends firestore_1.FirestoreRecord { + static { this.collectionName = 'domainProfiles'; } +}; +exports.DomainProfile = DomainProfile; +__decorate([ + (0, civkit_1.Prop)({ + required: true + }), + __metadata("design:type", String) +], DomainProfile.prototype, "path", void 0); +__decorate([ + (0, civkit_1.Prop)(), + __metadata("design:type", String) +], DomainProfile.prototype, "triggerUrl", void 0); +__decorate([ + (0, civkit_1.Prop)({ required: true, type: crawler_options_1.ENGINE_TYPE }), + __metadata("design:type", String) +], DomainProfile.prototype, "engine", void 0); +__decorate([ + (0, civkit_1.Prop)(), + __metadata("design:type", Date) +], DomainProfile.prototype, "createdAt", void 0); +__decorate([ + (0, civkit_1.Prop)(), + __metadata("design:type", Date) +], DomainProfile.prototype, "expireAt", void 0); +exports.DomainProfile = DomainProfile = __decorate([ + (0, civkit_1.Also)({ + dictOf: Object + }) +], DomainProfile); +//# sourceMappingURL=domain-profile.js.map \ No newline at end of file diff --git a/build/db/domain-profile.js.map b/build/db/domain-profile.js.map new file mode 100644 index 0000000000000000000000000000000000000000..2fc71df633deed0caa6814610712eb137f55c764 --- /dev/null +++ b/build/db/domain-profile.js.map @@ -0,0 +1 @@ +{"version":3,"file":"domain-profile.js","sourceRoot":"","sources":["../../src/db/domain-profile.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,mCAAoC;AACpC,uDAA0D;AAC1D,4DAAqD;AAK9C,IAAM,aAAa,GAAnB,MAAM,aAAc,SAAQ,2BAAe;aAC9B,mBAAc,GAAG,gBAAgB,AAAnB,CAAoB;;AADzC,sCAAa;AAQtB;IAHC,IAAA,aAAI,EAAC;QACF,QAAQ,EAAE,IAAI;KACjB,CAAC;;2CACY;AAGd;IADC,IAAA,aAAI,GAAE;;iDACa;AAGpB;IADC,IAAA,aAAI,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,6BAAW,EAAE,CAAC;;6CAC5B;AAGhB;IADC,IAAA,aAAI,GAAE;8BACK,IAAI;gDAAC;AAGjB;IADC,IAAA,aAAI,GAAE;8BACI,IAAI;+CAAC;wBApBP,aAAa;IAHzB,IAAA,aAAI,EAAC;QACF,MAAM,EAAE,MAAM;KACjB,CAAC;GACW,aAAa,CAuBzB"} \ No newline at end of file diff --git a/build/db/img-alt.js b/build/db/img-alt.js new file mode 100644 index 0000000000000000000000000000000000000000..30d1d66fef8971db6684577282cc35a2eaba8ca5 --- /dev/null +++ b/build/db/img-alt.js @@ -0,0 +1,60 @@ +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ImgAlt = void 0; +const civkit_1 = require("civkit"); +const firestore_1 = require("../shared/lib/firestore"); +let ImgAlt = class ImgAlt extends firestore_1.FirestoreRecord { + static { this.collectionName = 'imgAlts'; } +}; +exports.ImgAlt = ImgAlt; +__decorate([ + (0, civkit_1.Prop)({ + required: true + }), + __metadata("design:type", String) +], ImgAlt.prototype, "src", void 0); +__decorate([ + (0, civkit_1.Prop)({ + required: true + }), + __metadata("design:type", String) +], ImgAlt.prototype, "urlDigest", void 0); +__decorate([ + (0, civkit_1.Prop)(), + __metadata("design:type", Number) +], ImgAlt.prototype, "width", void 0); +__decorate([ + (0, civkit_1.Prop)(), + __metadata("design:type", Number) +], ImgAlt.prototype, "height", void 0); +__decorate([ + (0, civkit_1.Prop)(), + __metadata("design:type", String) +], ImgAlt.prototype, "generatedAlt", void 0); +__decorate([ + (0, civkit_1.Prop)(), + __metadata("design:type", String) +], ImgAlt.prototype, "originalAlt", void 0); +__decorate([ + (0, civkit_1.Prop)(), + __metadata("design:type", Date) +], ImgAlt.prototype, "createdAt", void 0); +__decorate([ + (0, civkit_1.Prop)(), + __metadata("design:type", Date) +], ImgAlt.prototype, "expireAt", void 0); +exports.ImgAlt = ImgAlt = __decorate([ + (0, civkit_1.Also)({ + dictOf: Object + }) +], ImgAlt); +//# sourceMappingURL=img-alt.js.map \ No newline at end of file diff --git a/build/db/img-alt.js.map b/build/db/img-alt.js.map new file mode 100644 index 0000000000000000000000000000000000000000..324aad8ac76732ae76836204c64a3d3b5626d7bc --- /dev/null +++ b/build/db/img-alt.js.map @@ -0,0 +1 @@ +{"version":3,"file":"img-alt.js","sourceRoot":"","sources":["../../src/db/img-alt.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,mCAAoC;AACpC,uDAA0D;AAMnD,IAAM,MAAM,GAAZ,MAAM,MAAO,SAAQ,2BAAe;aACvB,mBAAc,GAAG,SAAS,AAAZ,CAAa;;AADlC,wBAAM;AAQf;IAHC,IAAA,aAAI,EAAC;QACF,QAAQ,EAAE,IAAI;KACjB,CAAC;;mCACW;AAKb;IAHC,IAAA,aAAI,EAAC;QACF,QAAQ,EAAE,IAAI;KACjB,CAAC;;yCACiB;AAGnB;IADC,IAAA,aAAI,GAAE;;qCACQ;AAGf;IADC,IAAA,aAAI,GAAE;;sCACS;AAGhB;IADC,IAAA,aAAI,GAAE;;4CACe;AAGtB;IADC,IAAA,aAAI,GAAE;;2CACc;AAGrB;IADC,IAAA,aAAI,GAAE;8BACK,IAAI;yCAAC;AAGjB;IADC,IAAA,aAAI,GAAE;8BACI,IAAI;wCAAC;iBA/BP,MAAM;IAHlB,IAAA,aAAI,EAAC;QACF,MAAM,EAAE,MAAM;KACjB,CAAC;GACW,MAAM,CAkClB"} \ No newline at end of file diff --git a/build/db/pdf.js b/build/db/pdf.js new file mode 100644 index 0000000000000000000000000000000000000000..8d2ca95066382d3778b885c6fdf28fa7ddc8988b --- /dev/null +++ b/build/db/pdf.js @@ -0,0 +1,78 @@ +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var PDFContent_1; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.PDFContent = void 0; +const civkit_1 = require("civkit"); +const firestore_1 = require("../shared/lib/firestore"); +let PDFContent = class PDFContent extends firestore_1.FirestoreRecord { + static { PDFContent_1 = this; } + static { this.collectionName = 'pdfs'; } + static { this.patchedFields = [ + 'meta' + ]; } + static from(input) { + for (const field of this.patchedFields) { + if (typeof input[field] === 'string') { + input[field] = (0, civkit_1.parseJSONText)(input[field]); + } + } + return super.from(input); + } + degradeForFireStore() { + const copy = { ...this }; + for (const field of this.constructor.patchedFields) { + if (typeof copy[field] === 'object') { + copy[field] = JSON.stringify(copy[field]); + } + } + return copy; + } +}; +exports.PDFContent = PDFContent; +__decorate([ + (0, civkit_1.Prop)({ + required: true + }), + __metadata("design:type", String) +], PDFContent.prototype, "src", void 0); +__decorate([ + (0, civkit_1.Prop)({ + required: true + }), + __metadata("design:type", String) +], PDFContent.prototype, "urlDigest", void 0); +__decorate([ + (0, civkit_1.Prop)(), + __metadata("design:type", Object) +], PDFContent.prototype, "meta", void 0); +__decorate([ + (0, civkit_1.Prop)(), + __metadata("design:type", String) +], PDFContent.prototype, "text", void 0); +__decorate([ + (0, civkit_1.Prop)(), + __metadata("design:type", String) +], PDFContent.prototype, "content", void 0); +__decorate([ + (0, civkit_1.Prop)(), + __metadata("design:type", Date) +], PDFContent.prototype, "createdAt", void 0); +__decorate([ + (0, civkit_1.Prop)(), + __metadata("design:type", Date) +], PDFContent.prototype, "expireAt", void 0); +exports.PDFContent = PDFContent = PDFContent_1 = __decorate([ + (0, civkit_1.Also)({ + dictOf: Object + }) +], PDFContent); +//# sourceMappingURL=pdf.js.map \ No newline at end of file diff --git a/build/db/pdf.js.map b/build/db/pdf.js.map new file mode 100644 index 0000000000000000000000000000000000000000..7f6e282fde7705e8104dcfd57af75ebac8148e47 --- /dev/null +++ b/build/db/pdf.js.map @@ -0,0 +1 @@ +{"version":3,"file":"pdf.js","sourceRoot":"","sources":["../../src/db/pdf.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAAA,mCAAmD;AACnD,uDAA0D;AAMnD,IAAM,UAAU,GAAhB,MAAM,UAAW,SAAQ,2BAAe;;aAC3B,mBAAc,GAAG,MAAM,AAAT,CAAU;aA6BjC,kBAAa,GAAG;QACnB,MAAM;KACT,AAFmB,CAElB;IAEF,MAAM,CAAU,IAAI,CAAC,KAAU;QAC3B,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACrC,IAAI,OAAO,KAAK,CAAC,KAAK,CAAC,KAAK,QAAQ,EAAE,CAAC;gBACnC,KAAK,CAAC,KAAK,CAAC,GAAG,IAAA,sBAAa,EAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;YAC/C,CAAC;QACL,CAAC;QAED,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAe,CAAC;IAC3C,CAAC;IAEQ,mBAAmB;QACxB,MAAM,IAAI,GAAQ,EAAE,GAAG,IAAI,EAAE,CAAC;QAE9B,KAAK,MAAM,KAAK,IAAK,IAAI,CAAC,WAAiC,CAAC,aAAa,EAAE,CAAC;YACxE,IAAI,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,QAAQ,EAAE,CAAC;gBAClC,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAQ,CAAC;YACrD,CAAC;QACL,CAAC;QAED,OAAO,IAAI,CAAC;IAChB,CAAC;;AAtDQ,gCAAU;AAQnB;IAHC,IAAA,aAAI,EAAC;QACF,QAAQ,EAAE,IAAI;KACjB,CAAC;;uCACW;AAKb;IAHC,IAAA,aAAI,EAAC;QACF,QAAQ,EAAE,IAAI;KACjB,CAAC;;6CACiB;AAGnB;IADC,IAAA,aAAI,GAAE;;wCACsB;AAG7B;IADC,IAAA,aAAI,GAAE;;wCACO;AAGd;IADC,IAAA,aAAI,GAAE;;2CACU;AAGjB;IADC,IAAA,aAAI,GAAE;8BACK,IAAI;6CAAC;AAGjB;IADC,IAAA,aAAI,GAAE;8BACI,IAAI;4CAAC;qBA5BP,UAAU;IAHtB,IAAA,aAAI,EAAC;QACF,MAAM,EAAE,MAAM;KACjB,CAAC;GACW,UAAU,CAyDtB"} \ No newline at end of file diff --git a/build/db/searched.js b/build/db/searched.js new file mode 100644 index 0000000000000000000000000000000000000000..fde36163a74b3c3d66fa4d7ba1bd448c64e6f75e --- /dev/null +++ b/build/db/searched.js @@ -0,0 +1,79 @@ +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var SearchResult_1; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.SERPResult = exports.SerperSearchResult = exports.SearchResult = void 0; +const civkit_1 = require("civkit"); +const firestore_1 = require("../shared/lib/firestore"); +let SearchResult = class SearchResult extends firestore_1.FirestoreRecord { + static { SearchResult_1 = this; } + static { this.collectionName = 'searchResults'; } + static { this.patchedFields = [ + 'query', + 'response', + ]; } + static from(input) { + for (const field of this.patchedFields) { + if (typeof input[field] === 'string') { + input[field] = (0, civkit_1.parseJSONText)(input[field]); + } + } + return super.from(input); + } + degradeForFireStore() { + const copy = { ...this }; + for (const field of this.constructor.patchedFields) { + if (typeof copy[field] === 'object') { + copy[field] = JSON.stringify(copy[field]); + } + } + return copy; + } +}; +exports.SearchResult = SearchResult; +__decorate([ + (0, civkit_1.Prop)({ + required: true + }), + __metadata("design:type", Object) +], SearchResult.prototype, "query", void 0); +__decorate([ + (0, civkit_1.Prop)({ + required: true + }), + __metadata("design:type", String) +], SearchResult.prototype, "queryDigest", void 0); +__decorate([ + (0, civkit_1.Prop)(), + __metadata("design:type", Object) +], SearchResult.prototype, "response", void 0); +__decorate([ + (0, civkit_1.Prop)(), + __metadata("design:type", Date) +], SearchResult.prototype, "createdAt", void 0); +__decorate([ + (0, civkit_1.Prop)(), + __metadata("design:type", Date) +], SearchResult.prototype, "expireAt", void 0); +exports.SearchResult = SearchResult = SearchResult_1 = __decorate([ + (0, civkit_1.Also)({ + dictOf: Object + }) +], SearchResult); +class SerperSearchResult extends SearchResult { + static { this.collectionName = 'serperSearchResults'; } +} +exports.SerperSearchResult = SerperSearchResult; +class SERPResult extends SearchResult { + static { this.collectionName = 'SERPResults'; } +} +exports.SERPResult = SERPResult; +//# sourceMappingURL=searched.js.map \ No newline at end of file diff --git a/build/db/searched.js.map b/build/db/searched.js.map new file mode 100644 index 0000000000000000000000000000000000000000..2ffa25cf16abe9162a2a04cbb7fd8d764228404e --- /dev/null +++ b/build/db/searched.js.map @@ -0,0 +1 @@ +{"version":3,"file":"searched.js","sourceRoot":"","sources":["../../src/db/searched.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAAA,mCAAmD;AACnD,uDAA0D;AAMnD,IAAM,YAAY,GAAlB,MAAM,YAAa,SAAQ,2BAAe;;aAC7B,mBAAc,GAAG,eAAe,AAAlB,CAAmB;aAyB1C,kBAAa,GAAG;QACnB,OAAO;QACP,UAAU;KACb,AAHmB,CAGlB;IAEF,MAAM,CAAU,IAAI,CAAC,KAAU;QAC3B,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACrC,IAAI,OAAO,KAAK,CAAC,KAAK,CAAC,KAAK,QAAQ,EAAE,CAAC;gBACnC,KAAK,CAAC,KAAK,CAAC,GAAG,IAAA,sBAAa,EAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;YAC/C,CAAC;QACL,CAAC;QAED,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAiB,CAAC;IAC7C,CAAC;IAEQ,mBAAmB;QACxB,MAAM,IAAI,GAAQ,EAAE,GAAG,IAAI,EAAE,CAAC;QAE9B,KAAK,MAAM,KAAK,IAAK,IAAI,CAAC,WAAmC,CAAC,aAAa,EAAE,CAAC;YAC1E,IAAI,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,QAAQ,EAAE,CAAC;gBAClC,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAQ,CAAC;YACrD,CAAC;QACL,CAAC;QAED,OAAO,IAAI,CAAC;IAChB,CAAC;;AAnDQ,oCAAY;AAQrB;IAHC,IAAA,aAAI,EAAC;QACF,QAAQ,EAAE,IAAI;KACjB,CAAC;;2CACU;AAKZ;IAHC,IAAA,aAAI,EAAC;QACF,QAAQ,EAAE,IAAI;KACjB,CAAC;;iDACmB;AAGrB;IADC,IAAA,aAAI,GAAE;;8CACQ;AAGf;IADC,IAAA,aAAI,GAAE;8BACK,IAAI;+CAAC;AAGjB;IADC,IAAA,aAAI,GAAE;8BACI,IAAI;8CAAC;uBAtBP,YAAY;IAHxB,IAAA,aAAI,EAAC;QACF,MAAM,EAAE,MAAM;KACjB,CAAC;GACW,YAAY,CAoDxB;AAED,MAAa,kBAAmB,SAAQ,YAAY;aAChC,mBAAc,GAAG,qBAAqB,CAAC;;AAD3D,gDAEC;AAED,MAAa,UAAW,SAAQ,YAAY;aACxB,mBAAc,GAAG,aAAa,CAAC;;AADnD,gCAEC"} \ No newline at end of file diff --git a/build/dto/adaptive-crawler-options.js b/build/dto/adaptive-crawler-options.js new file mode 100644 index 0000000000000000000000000000000000000000..d9c09ad34a5f23ceac95d0e0a61415f0b84c0fa0 --- /dev/null +++ b/build/dto/adaptive-crawler-options.js @@ -0,0 +1,70 @@ +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.AdaptiveCrawlerOptions = void 0; +const civkit_1 = require("civkit"); +let AdaptiveCrawlerOptions = class AdaptiveCrawlerOptions extends civkit_1.AutoCastable { + static from(input) { + const instance = super.from(input); + const ctx = Reflect.get(input, civkit_1.RPC_CALL_ENVIRONMENT); + let maxPages = parseInt(ctx?.req.get('x-max-pages') || ''); + if (!isNaN(maxPages) && maxPages > 0) { + instance.maxPages = maxPages <= 100 ? maxPages : 100; + } + const useSitemap = ctx?.req.get('x-use-sitemap'); + if (useSitemap !== undefined) { + instance.useSitemap = Boolean(useSitemap); + } + return instance; + } +}; +exports.AdaptiveCrawlerOptions = AdaptiveCrawlerOptions; +__decorate([ + (0, civkit_1.Prop)({ + default: true, + desc: 'Use sitemap to crawl the website.', + }), + __metadata("design:type", Boolean) +], AdaptiveCrawlerOptions.prototype, "useSitemap", void 0); +__decorate([ + (0, civkit_1.Prop)({ + default: 10, + desc: 'Max number of pages to crawl.', + validate: (v) => v >= 1 && v <= 100, + }), + __metadata("design:type", Number) +], AdaptiveCrawlerOptions.prototype, "maxPages", void 0); +exports.AdaptiveCrawlerOptions = AdaptiveCrawlerOptions = __decorate([ + (0, civkit_1.Also)({ + openapi: { + operation: { + parameters: { + 'X-Use-Sitemap': { + description: 'Use sitemap to crawl the website.', + in: 'header', + schema: { type: 'string' } + }, + 'X-Max-Depth': { + description: 'Max deep level to crawl.', + in: 'header', + schema: { type: 'string' } + }, + 'X-Max-Pages': { + description: 'Max number of pages to crawl.', + in: 'header', + schema: { type: 'string' } + }, + } + } + } + }) +], AdaptiveCrawlerOptions); +//# sourceMappingURL=adaptive-crawler-options.js.map \ No newline at end of file diff --git a/build/dto/adaptive-crawler-options.js.map b/build/dto/adaptive-crawler-options.js.map new file mode 100644 index 0000000000000000000000000000000000000000..10a0e65e023504a7e722f311ae60107d08f60ea4 --- /dev/null +++ b/build/dto/adaptive-crawler-options.js.map @@ -0,0 +1 @@ +{"version":3,"file":"adaptive-crawler-options.js","sourceRoot":"","sources":["../../src/dto/adaptive-crawler-options.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,mCAAwE;AA2BjE,IAAM,sBAAsB,GAA5B,MAAM,sBAAuB,SAAQ,qBAAY;IAcpD,MAAM,CAAU,IAAI,CAAC,KAAU;QAC3B,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAA2B,CAAC;QAC7D,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,6BAAoB,CAGtC,CAAC;QAEd,IAAI,QAAQ,GAAG,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC,CAAC;QAC3D,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC;YACnC,QAAQ,CAAC,QAAQ,GAAG,QAAQ,IAAI,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC;QACzD,CAAC;QAED,MAAM,UAAU,GAAG,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;QACjD,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;YAC3B,QAAQ,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;QAC9C,CAAC;QAED,OAAO,QAAQ,CAAC;IACpB,CAAC;CACJ,CAAA;AAjCY,wDAAsB;AAK/B;IAJC,IAAA,aAAI,EAAC;QACF,OAAO,EAAE,IAAI;QACb,IAAI,EAAE,mCAAmC;KAC5C,CAAC;;0DACmB;AAOrB;IALC,IAAA,aAAI,EAAC;QACF,OAAO,EAAE,EAAE;QACX,IAAI,EAAE,+BAA+B;QACrC,QAAQ,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG;KAC9C,CAAC;;wDACgB;iCAZT,sBAAsB;IAvBlC,IAAA,aAAI,EAAC;QACF,OAAO,EAAE;YACL,SAAS,EAAE;gBACP,UAAU,EAAE;oBACR,eAAe,EAAE;wBACb,WAAW,EAAE,mCAAmC;wBAChD,EAAE,EAAE,QAAQ;wBACZ,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;qBAC7B;oBACD,aAAa,EAAE;wBACX,WAAW,EAAE,0BAA0B;wBACvC,EAAE,EAAE,QAAQ;wBACZ,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;qBAC7B;oBACD,aAAa,EAAE;wBACX,WAAW,EAAE,+BAA+B;wBAC5C,EAAE,EAAE,QAAQ;wBACZ,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;qBAC7B;iBACJ;aACJ;SACJ;KACJ,CAAC;GACW,sBAAsB,CAiClC"} \ No newline at end of file diff --git a/build/dto/crawler-options.js b/build/dto/crawler-options.js new file mode 100644 index 0000000000000000000000000000000000000000..725d49e40da697f2b148feb7fdb1f08031bca69c --- /dev/null +++ b/build/dto/crawler-options.js @@ -0,0 +1,753 @@ +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var _a; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.CrawlerOptionsHeaderOnly = exports.CrawlerOptions = exports.BASE_URL_MODES = exports.IMAGE_RETENTION_MODES = exports.RESPOND_TIMING = exports.ENGINE_TYPE = exports.CONTENT_FORMAT = void 0; +const civ_rpc_1 = require("civkit/civ-rpc"); +const fancy_file_1 = require("civkit/fancy-file"); +const set_cookie_parser_1 = require("set-cookie-parser"); +const turndown_tweakable_options_1 = require("./turndown-tweakable-options"); +var CONTENT_FORMAT; +(function (CONTENT_FORMAT) { + CONTENT_FORMAT["CONTENT"] = "content"; + CONTENT_FORMAT["MARKDOWN"] = "markdown"; + CONTENT_FORMAT["HTML"] = "html"; + CONTENT_FORMAT["TEXT"] = "text"; + CONTENT_FORMAT["PAGESHOT"] = "pageshot"; + CONTENT_FORMAT["SCREENSHOT"] = "screenshot"; + CONTENT_FORMAT["VLM"] = "vlm"; + CONTENT_FORMAT["READER_LM"] = "readerlm-v2"; +})(CONTENT_FORMAT || (exports.CONTENT_FORMAT = CONTENT_FORMAT = {})); +var ENGINE_TYPE; +(function (ENGINE_TYPE) { + ENGINE_TYPE["AUTO"] = "auto"; + ENGINE_TYPE["BROWSER"] = "browser"; + ENGINE_TYPE["CURL"] = "curl"; + ENGINE_TYPE["CF_BROWSER_RENDERING"] = "cf-browser-rendering"; +})(ENGINE_TYPE || (exports.ENGINE_TYPE = ENGINE_TYPE = {})); +var RESPOND_TIMING; +(function (RESPOND_TIMING) { + RESPOND_TIMING["HTML"] = "html"; + RESPOND_TIMING["VISIBLE_CONTENT"] = "visible-content"; + RESPOND_TIMING["MUTATION_IDLE"] = "mutation-idle"; + RESPOND_TIMING["RESOURCE_IDLE"] = "resource-idle"; + RESPOND_TIMING["MEDIA_IDLE"] = "media-idle"; + RESPOND_TIMING["NETWORK_IDLE"] = "network-idle"; +})(RESPOND_TIMING || (exports.RESPOND_TIMING = RESPOND_TIMING = {})); +const CONTENT_FORMAT_VALUES = new Set(Object.values(CONTENT_FORMAT)); +exports.IMAGE_RETENTION_MODES = ['none', 'all', 'alt', 'all_p', 'alt_p']; +const IMAGE_RETENTION_MODE_VALUES = new Set(exports.IMAGE_RETENTION_MODES); +exports.BASE_URL_MODES = ['initial', 'final']; +const BASE_URL_MODE_VALUES = new Set(exports.BASE_URL_MODES); +class Viewport extends civ_rpc_1.AutoCastable { +} +__decorate([ + (0, civ_rpc_1.Prop)({ + default: 1024 + }), + __metadata("design:type", Number) +], Viewport.prototype, "width", void 0); +__decorate([ + (0, civ_rpc_1.Prop)({ + default: 1024 + }), + __metadata("design:type", Number) +], Viewport.prototype, "height", void 0); +__decorate([ + (0, civ_rpc_1.Prop)(), + __metadata("design:type", Number) +], Viewport.prototype, "deviceScaleFactor", void 0); +__decorate([ + (0, civ_rpc_1.Prop)(), + __metadata("design:type", Boolean) +], Viewport.prototype, "isMobile", void 0); +__decorate([ + (0, civ_rpc_1.Prop)(), + __metadata("design:type", Boolean) +], Viewport.prototype, "isLandscape", void 0); +__decorate([ + (0, civ_rpc_1.Prop)(), + __metadata("design:type", Boolean) +], Viewport.prototype, "hasTouch", void 0); +let CrawlerOptions = class CrawlerOptions extends civ_rpc_1.AutoCastable { + static from(input) { + const instance = super.from(input); + const ctx = Reflect.get(input, civ_rpc_1.RPC_CALL_ENVIRONMENT); + const customMode = ctx?.get('x-respond-with') || ctx?.get('x-return-format'); + if (customMode) { + instance.respondWith = customMode; + } + if (instance.respondWith) { + instance.respondWith = instance.respondWith.toLowerCase(); + } + if (instance.respondWith?.includes('lm')) { + if (instance.respondWith.includes('content') || instance.respondWith.includes('markdown')) { + throw new civ_rpc_1.ParamValidationError({ + path: 'respondWith', + message: `LM formats conflicts with content/markdown.`, + }); + } + } + const locale = ctx?.get('x-locale'); + if (locale) { + instance.locale = locale; + } + const referer = ctx?.get('x-referer'); + if (referer) { + instance.referer = referer; + } + const withGeneratedAlt = ctx?.get('x-with-generated-alt'); + if (withGeneratedAlt) { + instance.withGeneratedAlt = Boolean(withGeneratedAlt); + } + const withLinksSummary = ctx?.get('x-with-links-summary'); + if (withLinksSummary) { + if (withLinksSummary === 'all') { + instance.withLinksSummary = withLinksSummary; + } + else { + instance.withLinksSummary = Boolean(withLinksSummary); + } + } + const withImagesSummary = ctx?.get('x-with-images-summary'); + if (withImagesSummary) { + instance.withImagesSummary = Boolean(withImagesSummary); + } + const retainImages = ctx?.get('x-retain-images'); + if (retainImages && IMAGE_RETENTION_MODE_VALUES.has(retainImages)) { + instance.retainImages = retainImages; + } + if (instance.withGeneratedAlt) { + instance.retainImages = 'all_p'; + } + const noCache = ctx?.get('x-no-cache'); + if (noCache) { + instance.noCache = Boolean(noCache); + } + if (instance.noCache && instance.cacheTolerance === undefined) { + instance.cacheTolerance = 0; + } + let cacheTolerance = parseInt(ctx?.get('x-cache-tolerance') || ''); + if (!isNaN(cacheTolerance)) { + instance.cacheTolerance = cacheTolerance; + } + const noGfm = ctx?.get('x-no-gfm'); + if (noGfm) { + instance.noGfm = noGfm === 'table' ? noGfm : Boolean(noGfm); + } + let timeoutSeconds = parseInt(ctx?.get('x-timeout') || ''); + if (!isNaN(timeoutSeconds) && timeoutSeconds > 0) { + instance.timeout = timeoutSeconds <= 180 ? timeoutSeconds : 180; + } + else if (ctx?.get('x-timeout')) { + instance.timeout = null; + } + const removeSelector = ctx?.get('x-remove-selector')?.split(', ').filter(Boolean); + instance.removeSelector ??= removeSelector?.length ? removeSelector : undefined; + const targetSelector = ctx?.get('x-target-selector')?.split(', ').filter(Boolean); + instance.targetSelector ??= targetSelector?.length ? targetSelector : undefined; + const waitForSelector = ctx?.get('x-wait-for-selector')?.split(', ').filter(Boolean); + instance.waitForSelector ??= (waitForSelector?.length ? waitForSelector : undefined) || instance.targetSelector; + const overrideUserAgent = ctx?.get('x-user-agent') || undefined; + instance.userAgent ??= overrideUserAgent; + const engine = ctx?.get('x-engine'); + if (engine) { + instance.engine = engine; + } + if (instance.engine) { + instance.engine = instance.engine.toLowerCase(); + } + if (instance.engine === 'vlm') { + instance.engine = ENGINE_TYPE.BROWSER; + instance.respondWith = CONTENT_FORMAT.VLM; + } + else if (instance.engine === 'readerlm-v2') { + instance.engine = ENGINE_TYPE.AUTO; + instance.respondWith = CONTENT_FORMAT.READER_LM; + } + const keepImgDataUrl = ctx?.get('x-keep-img-data-url'); + if (keepImgDataUrl) { + instance.keepImgDataUrl = Boolean(keepImgDataUrl); + } + const withIframe = ctx?.get('x-with-iframe'); + if (withIframe) { + instance.withIframe = withIframe.toLowerCase() === 'quoted' ? 'quoted' : Boolean(withIframe); + } + if (instance.withIframe) { + instance.timeout ??= null; + } + const withShadowDom = ctx?.get('x-with-shadow-dom'); + if (withShadowDom) { + instance.withShadowDom = Boolean(withShadowDom); + } + if (instance.withShadowDom) { + instance.timeout ??= null; + } + const cookies = []; + const setCookieHeaders = (ctx?.get('x-set-cookie')?.split(', ') || instance.setCookies).filter(Boolean); + if (Array.isArray(setCookieHeaders)) { + for (const setCookie of setCookieHeaders) { + cookies.push({ + ...(0, set_cookie_parser_1.parseString)(setCookie, { decodeValues: true }), + }); + } + } + else if (setCookieHeaders && typeof setCookieHeaders === 'string') { + cookies.push({ + ...(0, set_cookie_parser_1.parseString)(setCookieHeaders, { decodeValues: true }), + }); + } + instance.setCookies = cookies; + const proxyUrl = ctx?.get('x-proxy-url'); + instance.proxyUrl ??= proxyUrl || undefined; + const proxy = ctx?.get('x-proxy'); + instance.proxy ??= proxy || undefined; + const robotsTxt = ctx?.get('x-robots-txt'); + instance.robotsTxt ??= robotsTxt || undefined; + const tokenBudget = ctx?.get('x-token-budget'); + instance.tokenBudget ??= parseInt(tokenBudget || '') || undefined; + const baseMode = ctx?.get('x-base'); + if (baseMode) { + instance.base = baseMode; + } + const dnt = ctx?.get('dnt'); + instance.doNotTrack ??= (parseInt(dnt || '') || null); + const respondTiming = ctx?.get('x-respond-timing'); + if (respondTiming) { + instance.respondTiming ??= respondTiming; + } + if (instance.cacheTolerance) { + instance.cacheTolerance = instance.cacheTolerance * 1000; + } + if (ctx) { + instance.markdown ??= turndown_tweakable_options_1.TurnDownTweakableOptions.fromCtx(ctx); + } + return instance; + } + get presumedRespondTiming() { + if (this.respondTiming) { + return this.respondTiming; + } + if (this.timeout && this.timeout >= 20) { + return RESPOND_TIMING.NETWORK_IDLE; + } + if (this.respondWith.includes('shot') || this.respondWith.includes('vlm')) { + return RESPOND_TIMING.MEDIA_IDLE; + } + return RESPOND_TIMING.RESOURCE_IDLE; + } + isSnapshotAcceptableForEarlyResponse(snapshot) { + if (this.waitForSelector?.length) { + return false; + } + const presumedTiming = this.presumedRespondTiming; + if (presumedTiming === RESPOND_TIMING.MEDIA_IDLE && snapshot.lastMediaResourceLoaded && snapshot.lastMutationIdle) { + const now = Date.now(); + if ((Math.max(snapshot.lastMediaResourceLoaded, snapshot.lastContentResourceLoaded || 0) + 500) < now) { + return true; + } + } + if ((this.respondWith.includes('vlm') || this.respondWith.includes('pageshot')) && !snapshot.pageshot) { + return false; + } + if ((this.respondWith.includes('vlm') || this.respondWith.includes('screenshot')) && !snapshot.screenshot) { + return false; + } + if (presumedTiming === RESPOND_TIMING.RESOURCE_IDLE && snapshot.lastContentResourceLoaded && snapshot.lastMutationIdle) { + const now = Date.now(); + if ((snapshot.lastContentResourceLoaded + 500) < now) { + return true; + } + } + if (this.injectFrameScript?.length || this.injectPageScript?.length) { + return false; + } + if (presumedTiming === RESPOND_TIMING.VISIBLE_CONTENT && snapshot.parsed?.content) { + return true; + } + if (presumedTiming === RESPOND_TIMING.HTML && snapshot.html) { + return true; + } + if (presumedTiming === RESPOND_TIMING.NETWORK_IDLE) { + return false; + } + if (presumedTiming === RESPOND_TIMING.MUTATION_IDLE && snapshot.lastMutationIdle) { + return true; + } + if (this.respondWith.includes('lm')) { + return false; + } + if (this.withIframe) { + return false; + } + return !snapshot.isIntermediate; + } + isCacheQueryApplicable() { + if (this.noCache) { + return false; + } + if (this.cacheTolerance === 0) { + return false; + } + if (this.setCookies?.length) { + return false; + } + if (this.injectFrameScript?.length || this.injectPageScript?.length) { + return false; + } + if (this.viewport) { + return false; + } + return true; + } + isRequestingCompoundContentFormat() { + return !CONTENT_FORMAT_VALUES.has(this.respondWith); + } + browserIsNotRequired() { + if (this.respondTiming && ![RESPOND_TIMING.HTML, RESPOND_TIMING.VISIBLE_CONTENT].includes(this.respondTiming)) { + return false; + } + if (this.respondWith.includes(CONTENT_FORMAT.PAGESHOT) || this.respondWith.includes(CONTENT_FORMAT.SCREENSHOT)) { + return false; + } + if (this.injectFrameScript?.length || this.injectPageScript?.length) { + return false; + } + if (this.waitForSelector?.length) { + return false; + } + if (this.withIframe || this.withShadowDom) { + return false; + } + if (this.viewport) { + return false; + } + if (this.pdf) { + return false; + } + if (this.html) { + return false; + } + return true; + } +}; +exports.CrawlerOptions = CrawlerOptions; +__decorate([ + (0, civ_rpc_1.Prop)(), + __metadata("design:type", String) +], CrawlerOptions.prototype, "url", void 0); +__decorate([ + (0, civ_rpc_1.Prop)(), + __metadata("design:type", String) +], CrawlerOptions.prototype, "html", void 0); +__decorate([ + (0, civ_rpc_1.Prop)({ + type: BASE_URL_MODE_VALUES, + default: 'initial', + }), + __metadata("design:type", Object) +], CrawlerOptions.prototype, "base", void 0); +__decorate([ + (0, civ_rpc_1.Prop)({ + desc: 'Base64 encoded PDF.', + type: [fancy_file_1.FancyFile, String] + }), + __metadata("design:type", Object) +], CrawlerOptions.prototype, "pdf", void 0); +__decorate([ + (0, civ_rpc_1.Prop)({ + default: CONTENT_FORMAT.CONTENT, + type: [CONTENT_FORMAT, String] + }), + __metadata("design:type", String) +], CrawlerOptions.prototype, "respondWith", void 0); +__decorate([ + (0, civ_rpc_1.Prop)({ + default: false, + }), + __metadata("design:type", Boolean) +], CrawlerOptions.prototype, "withGeneratedAlt", void 0); +__decorate([ + (0, civ_rpc_1.Prop)({ default: 'all', type: IMAGE_RETENTION_MODE_VALUES }), + __metadata("design:type", Object) +], CrawlerOptions.prototype, "retainImages", void 0); +__decorate([ + (0, civ_rpc_1.Prop)({ + default: false, + }), + __metadata("design:type", Object) +], CrawlerOptions.prototype, "withLinksSummary", void 0); +__decorate([ + (0, civ_rpc_1.Prop)({ + default: false, + }), + __metadata("design:type", Boolean) +], CrawlerOptions.prototype, "withImagesSummary", void 0); +__decorate([ + (0, civ_rpc_1.Prop)({ + default: false, + }), + __metadata("design:type", Boolean) +], CrawlerOptions.prototype, "noCache", void 0); +__decorate([ + (0, civ_rpc_1.Prop)({ + default: false, + }), + __metadata("design:type", Object) +], CrawlerOptions.prototype, "noGfm", void 0); +__decorate([ + (0, civ_rpc_1.Prop)(), + __metadata("design:type", Number) +], CrawlerOptions.prototype, "cacheTolerance", void 0); +__decorate([ + (0, civ_rpc_1.Prop)({ arrayOf: String }), + __metadata("design:type", Object) +], CrawlerOptions.prototype, "targetSelector", void 0); +__decorate([ + (0, civ_rpc_1.Prop)({ arrayOf: String }), + __metadata("design:type", Object) +], CrawlerOptions.prototype, "waitForSelector", void 0); +__decorate([ + (0, civ_rpc_1.Prop)({ arrayOf: String }), + __metadata("design:type", Object) +], CrawlerOptions.prototype, "removeSelector", void 0); +__decorate([ + (0, civ_rpc_1.Prop)({ + default: false, + }), + __metadata("design:type", Boolean) +], CrawlerOptions.prototype, "keepImgDataUrl", void 0); +__decorate([ + (0, civ_rpc_1.Prop)({ + default: false, + type: [String, Boolean] + }), + __metadata("design:type", Object) +], CrawlerOptions.prototype, "withIframe", void 0); +__decorate([ + (0, civ_rpc_1.Prop)({ + default: false, + }), + __metadata("design:type", Boolean) +], CrawlerOptions.prototype, "withShadowDom", void 0); +__decorate([ + (0, civ_rpc_1.Prop)({ + arrayOf: String, + }), + __metadata("design:type", Array) +], CrawlerOptions.prototype, "setCookies", void 0); +__decorate([ + (0, civ_rpc_1.Prop)(), + __metadata("design:type", String) +], CrawlerOptions.prototype, "proxyUrl", void 0); +__decorate([ + (0, civ_rpc_1.Prop)(), + __metadata("design:type", String) +], CrawlerOptions.prototype, "proxy", void 0); +__decorate([ + (0, civ_rpc_1.Prop)(), + __metadata("design:type", String) +], CrawlerOptions.prototype, "userAgent", void 0); +__decorate([ + (0, civ_rpc_1.Prop)(), + __metadata("design:type", String) +], CrawlerOptions.prototype, "engine", void 0); +__decorate([ + (0, civ_rpc_1.Prop)({ + arrayOf: String, + }), + __metadata("design:type", Array) +], CrawlerOptions.prototype, "injectPageScript", void 0); +__decorate([ + (0, civ_rpc_1.Prop)({ + arrayOf: String, + }), + __metadata("design:type", Array) +], CrawlerOptions.prototype, "injectFrameScript", void 0); +__decorate([ + (0, civ_rpc_1.Prop)({ + validate: (v) => v > 0 && v <= 180, + type: Number, + nullable: true, + }), + __metadata("design:type", Object) +], CrawlerOptions.prototype, "timeout", void 0); +__decorate([ + (0, civ_rpc_1.Prop)(), + __metadata("design:type", String) +], CrawlerOptions.prototype, "locale", void 0); +__decorate([ + (0, civ_rpc_1.Prop)(), + __metadata("design:type", String) +], CrawlerOptions.prototype, "referer", void 0); +__decorate([ + (0, civ_rpc_1.Prop)(), + __metadata("design:type", Number) +], CrawlerOptions.prototype, "tokenBudget", void 0); +__decorate([ + (0, civ_rpc_1.Prop)(), + __metadata("design:type", Viewport) +], CrawlerOptions.prototype, "viewport", void 0); +__decorate([ + (0, civ_rpc_1.Prop)(), + __metadata("design:type", String) +], CrawlerOptions.prototype, "instruction", void 0); +__decorate([ + (0, civ_rpc_1.Prop)(), + __metadata("design:type", Object) +], CrawlerOptions.prototype, "jsonSchema", void 0); +__decorate([ + (0, civ_rpc_1.Prop)(), + __metadata("design:type", String) +], CrawlerOptions.prototype, "robotsTxt", void 0); +__decorate([ + (0, civ_rpc_1.Prop)(), + __metadata("design:type", Object) +], CrawlerOptions.prototype, "doNotTrack", void 0); +__decorate([ + (0, civ_rpc_1.Prop)(), + __metadata("design:type", turndown_tweakable_options_1.TurnDownTweakableOptions) +], CrawlerOptions.prototype, "markdown", void 0); +__decorate([ + (0, civ_rpc_1.Prop)({ + type: RESPOND_TIMING, + }), + __metadata("design:type", String) +], CrawlerOptions.prototype, "respondTiming", void 0); +exports.CrawlerOptions = CrawlerOptions = __decorate([ + (0, civ_rpc_1.Also)({ + openapi: { + operation: { + parameters: { + 'Accept': { + description: `Specifies your preference for the response format.\n\n` + + `Supported formats: \n` + + `- text/event-stream\n` + + `- application/json or text/json\n` + + `- text/plain`, + in: 'header', + schema: { type: 'string' } + }, + 'X-Cache-Tolerance': { + description: `Sets internal cache tolerance in seconds if this header is specified with a integer.`, + in: 'header', + schema: { type: 'string' } + }, + 'X-No-Cache': { + description: `Ignores internal cache if this header is specified with a value.\n\nEquivalent to X-Cache-Tolerance: 0`, + in: 'header', + schema: { type: 'string' } + }, + 'X-Respond-With': { + description: `Specifies the (non-default) form of the crawled data you prefer.\n\n` + + `Supported formats: \n` + + `- markdown\n` + + `- html\n` + + `- text\n` + + `- pageshot\n` + + `- screenshot\n` + + `- content\n` + + `- any combination of the above\n` + + `- readerlm-v2\n` + + `- vlm\n\n` + + `Default: content\n`, + in: 'header', + schema: { type: 'string' } + }, + 'X-Wait-For-Selector': { + description: `Specifies a CSS selector to wait for the appearance of such an element before returning.\n\n` + + 'Example: `X-Wait-For-Selector: .content-block`\n', + in: 'header', + schema: { type: 'string' } + }, + 'X-Target-Selector': { + description: `Specifies a CSS selector for return target instead of the full html.\n\n` + + 'Implies `X-Wait-For-Selector: (same selector)`', + in: 'header', + schema: { type: 'string' } + }, + 'X-Remove-Selector': { + description: `Specifies a CSS selector to remove elements from the full html.\n\n` + + 'Example `X-Remove-Selector: nav`', + in: 'header', + schema: { type: 'string' } + }, + 'X-Keep-Img-Data-Url': { + description: `Keep data-url as it instead of transforming them to object-url. (Only applicable when targeting markdown format)\n\n` + + 'Example `X-Keep-Img-Data-Url: true`', + in: 'header', + schema: { type: 'string' } + }, + 'X-Proxy-Url': { + description: `Specifies your custom proxy if you prefer to use one.\n\n` + + `Supported protocols: \n` + + `- http\n` + + `- https\n` + + `- socks4\n` + + `- socks5\n\n` + + `For authentication, https://user:pass@host:port`, + in: 'header', + schema: { type: 'string' } + }, + 'X-Proxy': { + description: `Use a proxy server provided by us.\n\nOptionally specify two-letter country code.`, + in: 'header', + schema: { type: 'string' } + }, + 'X-Robots-Txt': { + description: `Load and conform to the respective robot.txt on the target origin.\n\nOptionally specify a bot UA to check against.\n\n`, + in: 'header', + schema: { type: 'string' } + }, + 'DNT': { + description: `When set to 1, prevent the result of this request to be cached in the system.\n\n`, + in: 'header', + schema: { type: 'string' } + }, + 'X-Set-Cookie': { + description: `Sets cookie(s) to the headless browser for your request. \n\n` + + `Syntax is the same with standard Set-Cookie`, + in: 'header', + schema: { type: 'string' } + }, + 'X-With-Generated-Alt': { + description: `Enable automatic alt-text generating for images without an meaningful alt-text.\n\n` + + `Note: Does not work when \`X-Respond-With\` is specified`, + in: 'header', + schema: { type: 'string' } + }, + 'X-With-Images-Summary': { + description: `Enable dedicated summary section for images on the page.`, + in: 'header', + schema: { type: 'string' } + }, + 'X-With-links-Summary': { + description: `Enable dedicated summary section for hyper links on the page.`, + in: 'header', + schema: { type: 'string' } + }, + 'X-Retain-Images': { + description: `Image retention modes.\n\n` + + `Supported modes: \n` + + `- all: all images\n` + + `- none: no images\n` + + `- alt: only alt text\n` + + `- all_p: all images and with generated alt text\n` + + `- alt_p: only alt text and with generated alt\n\n`, + in: 'header', + schema: { type: 'string' } + }, + 'X-With-Iframe': { + description: `Enable filling iframe contents into main. (violates standards)`, + in: 'header', + schema: { type: 'string' } + }, + 'X-With-Shadow-Dom': { + description: `Enable filling shadow dom contents into main. (violates standards)`, + in: 'header', + schema: { type: 'string' } + }, + 'X-User-Agent': { + description: `Override User-Agent.`, + in: 'header', + schema: { type: 'string' } + }, + 'X-Timeout': { + description: `Specify timeout in seconds. Max 180.`, + in: 'header', + schema: { type: 'string' } + }, + 'X-Locale': { + description: 'Specify browser locale for the page.', + in: 'header', + schema: { type: 'string' } + }, + 'X-Referer': { + description: 'Specify referer for the page.', + in: 'header', + schema: { type: 'string' } + }, + 'X-Token-Budget': { + description: 'Specify a budget in tokens.\n\nIf the resulting token cost exceeds the budget, the request is rejected.', + in: 'header', + schema: { type: 'string' } + }, + 'X-Respond-Timing': { + description: `Explicitly specify the respond timing. One of the following:\n\n` + + `- html: directly return unrendered HTML\n` + + `- visible-content: return immediately when any content becomes available\n` + + `- mutation-idle: wait for DOM mutations to settle and remain unchanged for at least 0.2s\n` + + `- resource-idle: wait for no additional resources that would affect page logic and content has SUCCEEDED loading in 0.5s\n` + + `- media-idle: wait for no additional resources, including media resources, has SUCCEEDED loading in 0.5s\n` + + `- network-idle: wait for full load of webpage, also known as networkidle0.\n\n`, + in: 'header', + schema: { type: 'string' } + }, + 'X-Engine': { + description: 'Specify the engine to use for crawling.\n\nSupported: browser, direct, cf-browser-rendering', + in: 'header', + schema: { type: 'string' } + }, + 'X-Base': { + description: 'Select base modes of relative URLs.\n\nSupported: initial, final', + in: 'header', + schema: { type: 'string' } + }, + 'X-Md-Heading-Style': { + description: 'Heading style of the generated markdown.\n\nThis is an option passed through to [Turndown](https://github.com/mixmark-io/turndown?tab=readme-ov-file#options).\n\nSupported: setext, atx', + in: 'header', + schema: { type: 'string' } + }, + 'X-Md-Hr': { + description: 'Hr text of the generated markdown.\n\nThis is an option passed through to [Turndown](https://github.com/mixmark-io/turndown?tab=readme-ov-file#options).', + in: 'header', + schema: { type: 'string' } + }, + 'X-Md-Bullet-List-Marker': { + description: 'Bullet list marker of the generated markdown.\n\nThis is an option passed through to [Turndown](https://github.com/mixmark-io/turndown?tab=readme-ov-file#options).\n\nSupported: -, +, *', + in: 'header', + schema: { type: 'string' } + }, + 'X-Md-Em-Delimiter': { + description: 'Em delimiter of the generated markdown.\n\nThis is an option passed through to [Turndown](https://github.com/mixmark-io/turndown?tab=readme-ov-file#options).\n\nSupported: _, *', + in: 'header', + schema: { type: 'string' } + }, + 'X-Md-Strong-Delimiter': { + description: 'Strong delimiter of the generated markdown.\n\nThis is an option passed through to [Turndown](https://github.com/mixmark-io/turndown?tab=readme-ov-file#options).\n\nSupported: **, __', + in: 'header', + schema: { type: 'string' } + }, + 'X-Md-Link-Style': { + description: 'Link style of the generated markdown.\n\nThis is an option passed through to [Turndown](https://github.com/mixmark-io/turndown?tab=readme-ov-file#options).\n\nSupported: inlined, referenced, discarded', + in: 'header', + schema: { type: 'string' } + }, + 'X-Md-Link-Reference-Style': { + description: 'Link reference style of the generated markdown.\n\nThis is an option passed through to [Turndown](https://github.com/mixmark-io/turndown?tab=readme-ov-file#options).\n\nSupported: full, collapsed, shortcut, discarded', + in: 'header', + schema: { type: 'string' } + }, + } + } + } + }) +], CrawlerOptions); +class CrawlerOptionsHeaderOnly extends CrawlerOptions { + static from(input) { + const instance = super.from({ + [civ_rpc_1.RPC_CALL_ENVIRONMENT]: Reflect.get(input, civ_rpc_1.RPC_CALL_ENVIRONMENT), + }); + return instance; + } +} +exports.CrawlerOptionsHeaderOnly = CrawlerOptionsHeaderOnly; +//# sourceMappingURL=crawler-options.js.map \ No newline at end of file diff --git a/build/dto/crawler-options.js.map b/build/dto/crawler-options.js.map new file mode 100644 index 0000000000000000000000000000000000000000..e52932763a9704f1f03981e6de52dfe62c739ad9 --- /dev/null +++ b/build/dto/crawler-options.js.map @@ -0,0 +1 @@ +{"version":3,"file":"crawler-options.js","sourceRoot":"","sources":["../../src/dto/crawler-options.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/build/dto/jina-embeddings-auth.js b/build/dto/jina-embeddings-auth.js new file mode 100644 index 0000000000000000000000000000000000000000..763a829ae8786c0fbd700ce8abac8a76bda494aa --- /dev/null +++ b/build/dto/jina-embeddings-auth.js @@ -0,0 +1,237 @@ +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.JinaEmbeddingsAuthDTO = void 0; +const civ_rpc_1 = require("civkit/civ-rpc"); +const escape_1 = require("civkit/escape"); +const lang_1 = require("civkit/lang"); +const logger_1 = __importDefault(require("../services/logger")); +const registry_1 = require("../services/registry"); +const async_context_1 = require("../services/async-context"); +const secrets_1 = __importDefault(require("../shared/services/secrets")); +const jina_embeddings_1 = require("../shared/3rd-party/jina-embeddings"); +const jina_embeddings_token_account_1 = require("../shared/db/jina-embeddings-token-account"); +const errors_1 = require("../services/errors"); +const authDtoLogger = logger_1.default.child({ service: 'JinaAuthDTO' }); +const THE_VERY_SAME_JINA_EMBEDDINGS_CLIENT = new jina_embeddings_1.JinaEmbeddingsDashboardHTTP(secrets_1.default.JINA_EMBEDDINGS_DASHBOARD_API_KEY); +let JinaEmbeddingsAuthDTO = class JinaEmbeddingsAuthDTO extends civ_rpc_1.AutoCastable { + constructor() { + super(...arguments); + this.jinaEmbeddingsDashboard = THE_VERY_SAME_JINA_EMBEDDINGS_CLIENT; + } + static from(input) { + const instance = super.from(input); + const ctx = input[civ_rpc_1.RPC_CALL_ENVIRONMENT]; + if (ctx) { + const authorization = ctx.get('authorization'); + if (authorization) { + const authToken = authorization.split(' ')[1] || authorization; + instance.bearerToken = authToken; + } + } + if (!instance.bearerToken && input._token) { + instance.bearerToken = input._token; + } + return instance; + } + async getBrief(ignoreCache) { + if (!this.bearerToken) { + throw new civ_rpc_1.AuthenticationRequiredError({ + message: 'Jina API key is required to authenticate. Please get one from https://jina.ai' + }); + } + let firestoreDegradation = false; + let account; + try { + account = await jina_embeddings_token_account_1.JinaEmbeddingsTokenAccount.fromFirestore(this.bearerToken); + } + catch (err) { + // FireStore would not accept any string as input and may throw if not happy with it + firestoreDegradation = true; + logger_1.default.warn(`Firestore issue`, { err }); + } + const age = account?.lastSyncedAt ? Date.now() - account.lastSyncedAt.valueOf() : Infinity; + const jitter = Math.ceil(Math.random() * 30 * 1000); + if (account && !ignoreCache) { + if ((age < (180_000 - jitter)) && (account.wallet?.total_balance > 0)) { + this.user = account; + this.uid = this.user?.user_id; + return account; + } + } + if (firestoreDegradation) { + logger_1.default.debug(`Using remote UC cached user`); + let r; + try { + r = await this.jinaEmbeddingsDashboard.authorization(this.bearerToken); + } + catch (err) { + if (err?.status === 401) { + throw new civ_rpc_1.AuthenticationFailedError({ + message: 'Invalid API key, please get a new one from https://jina.ai' + }); + } + logger_1.default.warn(`Failed load remote cached user: ${err}`, { err }); + throw new civ_rpc_1.DownstreamServiceError(`Failed to authenticate: ${err}`); + } + const brief = r?.data; + const draftAccount = jina_embeddings_token_account_1.JinaEmbeddingsTokenAccount.from({ + ...account, ...brief, _id: this.bearerToken, + lastSyncedAt: new Date() + }); + this.user = draftAccount; + this.uid = this.user?.user_id; + return draftAccount; + } + try { + // TODO: go back using validateToken after performance issue fixed + const r = ((account?.wallet?.total_balance || 0) > 0) ? + await this.jinaEmbeddingsDashboard.authorization(this.bearerToken) : + await this.jinaEmbeddingsDashboard.validateToken(this.bearerToken); + const brief = r.data; + const draftAccount = jina_embeddings_token_account_1.JinaEmbeddingsTokenAccount.from({ + ...account, ...brief, _id: this.bearerToken, + lastSyncedAt: new Date() + }); + await jina_embeddings_token_account_1.JinaEmbeddingsTokenAccount.save(draftAccount.degradeForFireStore(), undefined, { merge: true }); + this.user = draftAccount; + this.uid = this.user?.user_id; + return draftAccount; + } + catch (err) { + authDtoLogger.warn(`Failed to get user brief: ${err}`, { err: (0, lang_1.marshalErrorLike)(err) }); + if (err?.status === 401) { + throw new civ_rpc_1.AuthenticationFailedError({ + message: 'Invalid API key, please get a new one from https://jina.ai' + }); + } + if (account) { + this.user = account; + this.uid = this.user?.user_id; + return account; + } + throw new civ_rpc_1.DownstreamServiceError(`Failed to authenticate: ${err}`); + } + } + async reportUsage(tokenCount, mdl, endpoint = '/encode') { + const user = await this.assertUser(); + const uid = user.user_id; + user.wallet.total_balance -= tokenCount; + return this.jinaEmbeddingsDashboard.reportUsage(this.bearerToken, { + model_name: mdl, + api_endpoint: endpoint, + consumer: { + id: uid, + user_id: uid, + }, + usage: { + total_tokens: tokenCount + }, + labels: { + model_name: mdl + } + }).then((r) => { + jina_embeddings_token_account_1.JinaEmbeddingsTokenAccount.COLLECTION.doc(this.bearerToken) + .update({ 'wallet.total_balance': jina_embeddings_token_account_1.JinaEmbeddingsTokenAccount.OPS.increment(-tokenCount) }) + .catch((err) => { + authDtoLogger.warn(`Failed to update cache for ${uid}: ${err}`, { err: (0, lang_1.marshalErrorLike)(err) }); + }); + return r; + }).catch((err) => { + user.wallet.total_balance += tokenCount; + authDtoLogger.warn(`Failed to report usage for ${uid}: ${err}`, { err: (0, lang_1.marshalErrorLike)(err) }); + }); + } + async solveUID() { + if (this.uid) { + this.ctxMgr.set('uid', this.uid); + return this.uid; + } + if (this.bearerToken) { + await this.getBrief(); + this.ctxMgr.set('uid', this.uid); + return this.uid; + } + return undefined; + } + async assertUID() { + const uid = await this.solveUID(); + if (!uid) { + throw new civ_rpc_1.AuthenticationRequiredError('Authentication failed'); + } + return uid; + } + async assertUser() { + if (this.user) { + return this.user; + } + await this.getBrief(); + return this.user; + } + async assertTier(n, feature) { + let user; + try { + user = await this.assertUser(); + } + catch (err) { + if (err instanceof civ_rpc_1.AuthenticationRequiredError) { + throw new civ_rpc_1.AuthenticationRequiredError({ + message: `Authentication is required to use this feature${feature ? ` (${feature})` : ''}. Please provide a valid API key.` + }); + } + throw err; + } + const tier = parseInt(user.metadata?.speed_level); + if (isNaN(tier) || tier < n) { + throw new errors_1.TierFeatureConstraintError({ + message: `Your current plan does not support this feature${feature ? ` (${feature})` : ''}. Please upgrade your plan.` + }); + } + return true; + } + getRateLimits(...tags) { + const descs = tags.map((x) => this.user?.customRateLimits?.[x] || []).flat().filter((x) => x.isEffective()); + if (descs.length) { + return descs; + } + return undefined; + } +}; +exports.JinaEmbeddingsAuthDTO = JinaEmbeddingsAuthDTO; +__decorate([ + (0, registry_1.InjectProperty)(async_context_1.AsyncLocalContext), + __metadata("design:type", async_context_1.AsyncLocalContext) +], JinaEmbeddingsAuthDTO.prototype, "ctxMgr", void 0); +exports.JinaEmbeddingsAuthDTO = JinaEmbeddingsAuthDTO = __decorate([ + (0, civ_rpc_1.Also)({ + openapi: { + operation: { + parameters: { + 'Authorization': { + description: (0, escape_1.htmlEscape) `Jina Token for authentication.\n\n` + + (0, escape_1.htmlEscape) `- Member of \n\n` + + `- Authorization: Bearer {YOUR_JINA_TOKEN}`, + in: 'header', + schema: { + anyOf: [ + { type: 'string', format: 'token' } + ] + } + } + } + } + } + }) +], JinaEmbeddingsAuthDTO); +//# sourceMappingURL=jina-embeddings-auth.js.map \ No newline at end of file diff --git a/build/dto/jina-embeddings-auth.js.map b/build/dto/jina-embeddings-auth.js.map new file mode 100644 index 0000000000000000000000000000000000000000..d070d544fd5c5d28dbf7e949c7dffbe0bc613936 --- /dev/null +++ b/build/dto/jina-embeddings-auth.js.map @@ -0,0 +1 @@ +{"version":3,"file":"jina-embeddings-auth.js","sourceRoot":"","sources":["../../src/dto/jina-embeddings-auth.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/build/dto/turndown-tweakable-options.js b/build/dto/turndown-tweakable-options.js new file mode 100644 index 0000000000000000000000000000000000000000..c4038ffbd7badec5b2d203e940916bc30871d542 --- /dev/null +++ b/build/dto/turndown-tweakable-options.js @@ -0,0 +1,81 @@ +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.TurnDownTweakableOptions = void 0; +const civ_rpc_1 = require("civkit/civ-rpc"); +const lodash_1 = __importDefault(require("lodash")); +class TurnDownTweakableOptions extends civ_rpc_1.AutoCastable { + static fromCtx(ctx, prefix = 'x-md-') { + const draft = {}; + for (const [k, v] of Object.entries(ctx.headers)) { + if (k.startsWith(prefix)) { + const prop = k.slice(prefix.length); + const sk = lodash_1.default.camelCase(prop); + draft[sk] = v; + } + } + return this.from(draft); + } +} +exports.TurnDownTweakableOptions = TurnDownTweakableOptions; +__decorate([ + (0, civ_rpc_1.Prop)({ + desc: 'Turndown options > headingStyle', + type: new Set(['setext', 'atx']), + }), + __metadata("design:type", String) +], TurnDownTweakableOptions.prototype, "headingStyle", void 0); +__decorate([ + (0, civ_rpc_1.Prop)({ + desc: 'Turndown options > hr', + validate: (v) => v.length > 0 && v.length <= 128 + }), + __metadata("design:type", String) +], TurnDownTweakableOptions.prototype, "hr", void 0); +__decorate([ + (0, civ_rpc_1.Prop)({ + desc: 'Turndown options > bulletListMarker', + type: new Set(['-', '+', '*']), + }), + __metadata("design:type", String) +], TurnDownTweakableOptions.prototype, "bulletListMarker", void 0); +__decorate([ + (0, civ_rpc_1.Prop)({ + desc: 'Turndown options > emDelimiter', + type: new Set(['_', '*']), + }), + __metadata("design:type", String) +], TurnDownTweakableOptions.prototype, "emDelimiter", void 0); +__decorate([ + (0, civ_rpc_1.Prop)({ + desc: 'Turndown options > strongDelimiter', + type: new Set(['__', '**']), + }), + __metadata("design:type", String) +], TurnDownTweakableOptions.prototype, "strongDelimiter", void 0); +__decorate([ + (0, civ_rpc_1.Prop)({ + desc: 'Turndown options > linkStyle', + type: new Set(['inlined', 'referenced', 'discarded']), + }), + __metadata("design:type", String) +], TurnDownTweakableOptions.prototype, "linkStyle", void 0); +__decorate([ + (0, civ_rpc_1.Prop)({ + desc: 'Turndown options > linkReferenceStyle', + type: new Set(['full', 'collapsed', 'shortcut', 'discarded']), + }), + __metadata("design:type", String) +], TurnDownTweakableOptions.prototype, "linkReferenceStyle", void 0); +//# sourceMappingURL=turndown-tweakable-options.js.map \ No newline at end of file diff --git a/build/dto/turndown-tweakable-options.js.map b/build/dto/turndown-tweakable-options.js.map new file mode 100644 index 0000000000000000000000000000000000000000..e4d2b65d0d210d11da4c061c8d6159b3f9a77be3 --- /dev/null +++ b/build/dto/turndown-tweakable-options.js.map @@ -0,0 +1 @@ +{"version":3,"file":"turndown-tweakable-options.js","sourceRoot":"","sources":["../../src/dto/turndown-tweakable-options.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,4CAAoD;AAEpD,oDAAuB;AAGvB,MAAa,wBAAyB,SAAQ,sBAAY;IA2CtD,MAAM,CAAC,OAAO,CAAC,GAAY,EAAE,MAAM,GAAE,OAAO;QACxC,MAAM,KAAK,GAA2B,EAAE,CAAC;QACzC,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;YAC/C,IAAI,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;gBACvB,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;gBACpC,MAAM,EAAE,GAAG,gBAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;gBAC7B,KAAK,CAAC,EAAE,CAAC,GAAG,CAAW,CAAC;YAC5B,CAAC;QACL,CAAC;QAED,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC5B,CAAC;CACJ;AAvDD,4DAuDC;AAlDG;IAJC,IAAA,cAAI,EAAC;QACF,IAAI,EAAE,iCAAiC;QACvC,IAAI,EAAE,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;KACnC,CAAC;;8DAC8B;AAMhC;IAJC,IAAA,cAAI,EAAC;QACF,IAAI,EAAE,uBAAuB;QAC7B,QAAQ,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,CAAC,MAAM,IAAI,GAAG;KAC3D,CAAC;;oDACU;AAMZ;IAJC,IAAA,cAAI,EAAC;QACF,IAAI,EAAE,qCAAqC;QAC3C,IAAI,EAAE,IAAI,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;KACjC,CAAC;;kEACiC;AAMnC;IAJC,IAAA,cAAI,EAAC;QACF,IAAI,EAAE,gCAAgC;QACtC,IAAI,EAAE,IAAI,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;KAC5B,CAAC;;6DACsB;AAMxB;IAJC,IAAA,cAAI,EAAC;QACF,IAAI,EAAE,oCAAoC;QAC1C,IAAI,EAAE,IAAI,GAAG,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;KAC9B,CAAC;;iEAC4B;AAM9B;IAJC,IAAA,cAAI,EAAC;QACF,IAAI,EAAE,8BAA8B;QACpC,IAAI,EAAE,IAAI,GAAG,CAAC,CAAC,SAAS,EAAE,YAAY,EAAE,WAAW,CAAC,CAAC;KACxD,CAAC;;2DACiD;AAMnD;IAJC,IAAA,cAAI,EAAC;QACF,IAAI,EAAE,uCAAuC;QAC7C,IAAI,EAAE,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC;KAChE,CAAC;;oEACmE"} \ No newline at end of file diff --git a/build/lib/transform-server-event-stream.js b/build/lib/transform-server-event-stream.js new file mode 100644 index 0000000000000000000000000000000000000000..3b43b0dfc535ab3202d2e1aab1b3868c0bd1cd7f --- /dev/null +++ b/build/lib/transform-server-event-stream.js @@ -0,0 +1,151 @@ +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var _a; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.OutputServerEventStream = exports.InputServerEventStream = void 0; +const civkit_1 = require("civkit"); +const stream_1 = require("stream"); +class InputServerEventStream extends stream_1.Transform { + constructor(options) { + super({ + ...options, + readableObjectMode: true + }); + this.cache = []; + } + decodeRoutine() { + if (!this.cache.length) { + return; + } + const vecs = this.cache.join('').split(/\r?\n\r?\n/); + this.cache.length = 0; + const lastVec = vecs.pop(); + if (lastVec) { + this.cache.push(lastVec); + } + for (const x of vecs) { + const lines = x.split(/\r?\n/); + const event = {}; + for (const l of lines) { + const columnPos = l.indexOf(':'); + if (columnPos <= 0) { + continue; + } + const key = l.substring(0, columnPos); + const rawValue = l.substring(columnPos + 1); + const value = rawValue.startsWith(' ') ? rawValue.slice(1) : rawValue; + if (key === 'data') { + if (event.data) { + event.data += value || '\n'; + } + else if (event.data === '') { + event.data += '\n'; + event.data += value || '\n'; + } + else { + event.data = value; + } + } + else if (key === 'retry') { + event.retry = parseInt(value, 10); + } + else { + Reflect.set(event, key, value); + } + } + if (event.data) { + const parsed = (0, civkit_1.parseJSONText)(event.data); + if (parsed && typeof parsed === 'object') { + event.data = parsed; + } + } + if (Object.keys(event).length) { + this.push(event); + } + } + } + _transform(chunk, encoding, callback) { + if (chunk === null) { + this.push(null); + } + this.cache.push(chunk.toString()); + this.decodeRoutine(); + callback(); + } + _final(callback) { + this.decodeRoutine(); + callback(); + } +} +exports.InputServerEventStream = InputServerEventStream; +let OutputServerEventStream = class OutputServerEventStream extends stream_1.Transform { + constructor(options) { + super({ + ...options, writableObjectMode: true, encoding: 'utf-8' + }); + this.n = 0; + } + encodeRoutine(chunk) { + if (typeof chunk === 'object') { + const lines = []; + if (chunk.event) { + lines.push(`event: ${chunk.event}`); + } + if (chunk.data) { + if (typeof chunk.data === 'string') { + for (const x of chunk.data.split(/\r?\n/)) { + lines.push(`data: ${x}`); + } + } + else { + lines.push(`data: ${JSON.stringify(chunk.data)}`); + } + } + if (chunk.id) { + lines.push(`id: ${chunk.id}`); + } + if (chunk.retry) { + lines.push(`retry: ${chunk.retry}`); + } + if (!lines.length) { + lines.push(`data: ${JSON.stringify(chunk)}`); + } + this.push(lines.join('\n')); + this.push('\n\n'); + this.n++; + return; + } + else if (typeof chunk === 'string') { + const lines = []; + for (const x of chunk.split(/\r?\n/)) { + lines.push(`data: ${x}`); + } + this.push(lines.join('\n')); + this.push('\n\n'); + this.n++; + } + } + _transform(chunk, encoding, callback) { + if (chunk === null) { + this.push(null); + } + this.encodeRoutine(chunk); + callback(); + } +}; +exports.OutputServerEventStream = OutputServerEventStream; +exports.OutputServerEventStream = OutputServerEventStream = __decorate([ + (0, civkit_1.TPM)({ + contentType: 'text/event-stream', + }), + __metadata("design:paramtypes", [typeof (_a = typeof stream_1.TransformOptions !== "undefined" && stream_1.TransformOptions) === "function" ? _a : Object]) +], OutputServerEventStream); +//# sourceMappingURL=transform-server-event-stream.js.map \ No newline at end of file diff --git a/build/lib/transform-server-event-stream.js.map b/build/lib/transform-server-event-stream.js.map new file mode 100644 index 0000000000000000000000000000000000000000..7d70eb64a5afcf9d183c49b0b04cf5121d70d4f2 --- /dev/null +++ b/build/lib/transform-server-event-stream.js.map @@ -0,0 +1 @@ +{"version":3,"file":"transform-server-event-stream.js","sourceRoot":"","sources":["../../src/lib/transform-server-event-stream.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/build/services/alt-text.js b/build/services/alt-text.js new file mode 100644 index 0000000000000000000000000000000000000000..ac88931a4471fe4f1fde0544730346425de68e76 --- /dev/null +++ b/build/services/alt-text.js @@ -0,0 +1,131 @@ +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var _a; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.AltTextService = void 0; +const civkit_1 = require("civkit"); +const tsyringe_1 = require("tsyringe"); +const logger_1 = require("./logger"); +const canvas_1 = require("./canvas"); +const common_iminterrogate_1 = require("../shared/services/common-iminterrogate"); +const img_alt_1 = require("../db/img-alt"); +const async_context_1 = require("./async-context"); +const md5Hasher = new civkit_1.HashManager('md5', 'hex'); +let AltTextService = class AltTextService extends civkit_1.AsyncService { + constructor(globalLogger, imageInterrogator, canvasService, asyncLocalContext) { + super(...arguments); + this.globalLogger = globalLogger; + this.imageInterrogator = imageInterrogator; + this.canvasService = canvasService; + this.asyncLocalContext = asyncLocalContext; + this.altsToIgnore = 'image,img,photo,picture,pic,alt,figure,fig'.split(','); + this.logger = this.globalLogger.child({ service: this.constructor.name }); + } + async init() { + await this.dependencyReady(); + this.emit('ready'); + } + async caption(url) { + try { + const img = await this.canvasService.loadImage(url); + const contentTypeHint = Reflect.get(img, 'contentType'); + if (Math.min(img.naturalHeight, img.naturalWidth) <= 1) { + return `A ${img.naturalWidth}x${img.naturalHeight} image, likely be a tacker probe`; + } + if (Math.min(img.naturalHeight, img.naturalWidth) < 64) { + return `A ${img.naturalWidth}x${img.naturalHeight} small image, likely a logo, icon or avatar`; + } + const resized = this.canvasService.fitImageToSquareBox(img, 1024); + const exported = await this.canvasService.canvasToBuffer(resized, 'image/png'); + const svgHint = contentTypeHint.includes('svg') ? `Beware this image is a SVG rendered on a gray background, the gray background is not part of the image.\n\n` : ''; + const svgSystemHint = contentTypeHint.includes('svg') ? ` Sometimes the system renders SVG on a gray background. When this happens, you must not include the gray background in the description.` : ''; + const r = await this.imageInterrogator.interrogate('vertex-gemini-2.0-flash', { + image: exported, + prompt: `${svgHint}Give a concise image caption descriptive sentence in third person. Start directly with the description.`, + system: `You are BLIP2, an image caption model. You will generate Alt Text (in web pages) for any image for a11y purposes. You must not start with "This image is sth...", instead, start direly with "sth..."${svgSystemHint}`, + }); + return r.replaceAll(/[\n\"]|(\.\s*$)/g, '').trim(); + } + catch (err) { + throw new civkit_1.AssertionFailureError({ message: `Could not generate alt text for url ${url}`, cause: err }); + } + } + async getAltText(imgBrief) { + if (!imgBrief.src) { + return undefined; + } + if (imgBrief.alt && !this.altsToIgnore.includes(imgBrief.alt.trim().toLowerCase())) { + return imgBrief.alt; + } + const digest = md5Hasher.hash(imgBrief.src); + const shortDigest = Buffer.from(digest, 'hex').toString('base64url'); + let dims = []; + do { + if (imgBrief.loaded) { + if (imgBrief.naturalWidth && imgBrief.naturalHeight) { + if (Math.min(imgBrief.naturalWidth, imgBrief.naturalHeight) < 64) { + dims = [imgBrief.naturalWidth, imgBrief.naturalHeight]; + break; + } + } + } + if (imgBrief.width && imgBrief.height) { + if (Math.min(imgBrief.width, imgBrief.height) < 64) { + dims = [imgBrief.width, imgBrief.height]; + break; + } + } + } while (false); + if (Math.min(...dims) <= 1) { + return `A ${dims[0]}x${dims[1]} image, likely be a tacker probe`; + } + if (Math.min(...dims) < 64) { + return `A ${dims[0]}x${dims[1]} small image, likely a logo, icon or avatar`; + } + const existing = await img_alt_1.ImgAlt.fromFirestore(shortDigest); + if (existing) { + return existing.generatedAlt || existing.originalAlt || ''; + } + let generatedCaption = ''; + try { + generatedCaption = await this.caption(imgBrief.src); + } + catch (err) { + this.logger.warn(`Unable to generate alt text for ${imgBrief.src}`, { err }); + } + if (this.asyncLocalContext.ctx.DNT) { + // Don't cache alt text if DNT is set + return generatedCaption; + } + // Don't try again until the next day + const expireMixin = generatedCaption ? {} : { expireAt: new Date(Date.now() + 1000 * 3600 * 24) }; + await img_alt_1.ImgAlt.COLLECTION.doc(shortDigest).set({ + _id: shortDigest, + src: imgBrief.src || '', + width: imgBrief.naturalWidth || 0, + height: imgBrief.naturalHeight || 0, + urlDigest: digest, + originalAlt: imgBrief.alt || '', + generatedAlt: generatedCaption || '', + createdAt: new Date(), + ...expireMixin + }, { merge: true }); + return generatedCaption; + } +}; +exports.AltTextService = AltTextService; +exports.AltTextService = AltTextService = __decorate([ + (0, tsyringe_1.singleton)(), + __metadata("design:paramtypes", [logger_1.GlobalLogger, typeof (_a = typeof common_iminterrogate_1.ImageInterrogationManager !== "undefined" && common_iminterrogate_1.ImageInterrogationManager) === "function" ? _a : Object, canvas_1.CanvasService, + async_context_1.AsyncLocalContext]) +], AltTextService); +; +//# sourceMappingURL=alt-text.js.map \ No newline at end of file diff --git a/build/services/alt-text.js.map b/build/services/alt-text.js.map new file mode 100644 index 0000000000000000000000000000000000000000..54bd16819d7276dec3c73163e853929806023c00 --- /dev/null +++ b/build/services/alt-text.js.map @@ -0,0 +1 @@ +{"version":3,"file":"alt-text.js","sourceRoot":"","sources":["../../src/services/alt-text.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/build/services/async-context.js b/build/services/async-context.js new file mode 100644 index 0000000000000000000000000000000000000000..39235d860a26e97b04812245ff663b3ddf172b88 --- /dev/null +++ b/build/services/async-context.js @@ -0,0 +1,21 @@ +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.AsyncLocalContext = void 0; +const async_context_1 = require("civkit/async-context"); +const tsyringe_1 = require("tsyringe"); +let AsyncLocalContext = class AsyncLocalContext extends async_context_1.GlobalAsyncContext { +}; +exports.AsyncLocalContext = AsyncLocalContext; +exports.AsyncLocalContext = AsyncLocalContext = __decorate([ + (0, tsyringe_1.singleton)() +], AsyncLocalContext); +const instance = tsyringe_1.container.resolve(AsyncLocalContext); +Reflect.set(process, 'asyncLocalContext', instance); +exports.default = instance; +//# sourceMappingURL=async-context.js.map \ No newline at end of file diff --git a/build/services/async-context.js.map b/build/services/async-context.js.map new file mode 100644 index 0000000000000000000000000000000000000000..163fff761b3cd340bd85b26f7562f507324b0c3b --- /dev/null +++ b/build/services/async-context.js.map @@ -0,0 +1 @@ +{"version":3,"file":"async-context.js","sourceRoot":"","sources":["../../src/services/async-context.ts"],"names":[],"mappings":";;;;;;;;;AAAA,wDAA0D;AAC1D,uCAAgD;AAGzC,IAAM,iBAAiB,GAAvB,MAAM,iBAAkB,SAAQ,kCAAkB;CAAI,CAAA;AAAhD,8CAAiB;4BAAjB,iBAAiB;IAD7B,IAAA,oBAAS,GAAE;GACC,iBAAiB,CAA+B;AAE7D,MAAM,QAAQ,GAAG,oBAAS,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;AACtD,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,mBAAmB,EAAE,QAAQ,CAAC,CAAC;AAEpD,kBAAe,QAAQ,CAAC"} \ No newline at end of file diff --git a/build/services/blackhole-detector.js b/build/services/blackhole-detector.js new file mode 100644 index 0000000000000000000000000000000000000000..d9bdd10be853295c7c354d6374f6bd5dec4a7070 --- /dev/null +++ b/build/services/blackhole-detector.js @@ -0,0 +1,80 @@ +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.BlackHoleDetector = void 0; +const tsyringe_1 = require("tsyringe"); +const async_service_1 = require("civkit/async-service"); +const logger_1 = require("./logger"); +const timeout_1 = require("civkit/timeout"); +let BlackHoleDetector = class BlackHoleDetector extends async_service_1.AsyncService { + constructor(globalLogger) { + super(...arguments); + this.globalLogger = globalLogger; + this.logger = this.globalLogger.child({ service: this.constructor.name }); + this.maxDelay = 1000 * 30; + this.concurrentRequests = 0; + this.strikes = 0; + if (process.env.NODE_ENV?.startsWith('prod')) { + setInterval(() => { + this.routine(); + }, 1000 * 30).unref(); + } + } + async init() { + await this.dependencyReady(); + this.logger.debug('BlackHoleDetector started'); + this.emit('ready'); + } + async routine() { + // We give routine a 3s grace period for potentially paused CPU to spin up and process some requests + await (0, timeout_1.delay)(3000); + const now = Date.now(); + const lastWorked = this.lastWorkedTs; + if (!lastWorked) { + return; + } + const dt = (now - lastWorked); + if (this.concurrentRequests > 1 && + this.lastIncomingRequestTs && lastWorked && + this.lastIncomingRequestTs >= lastWorked && + (dt > (this.maxDelay * (this.strikes + 1)))) { + this.logger.warn(`BlackHole detected, last worked: ${Math.ceil(dt / 1000)}s ago, concurrentRequests: ${this.concurrentRequests}`); + this.strikes += 1; + } + if (this.strikes >= 3) { + this.logger.error(`BlackHole detected for ${this.strikes} strikes, last worked: ${Math.ceil(dt / 1000)}s ago, concurrentRequests: ${this.concurrentRequests}`); + process.nextTick(() => { + this.emit('error', new Error(`BlackHole detected for ${this.strikes} strikes, last worked: ${Math.ceil(dt / 1000)}s ago, concurrentRequests: ${this.concurrentRequests}`)); + // process.exit(1); + }); + } + } + incomingRequest() { + this.lastIncomingRequestTs = Date.now(); + this.lastWorkedTs ??= Date.now(); + this.concurrentRequests++; + } + doneWithRequest() { + this.concurrentRequests--; + this.lastDoneRequestTs = Date.now(); + } + itWorked() { + this.lastWorkedTs = Date.now(); + this.strikes = 0; + } +}; +exports.BlackHoleDetector = BlackHoleDetector; +exports.BlackHoleDetector = BlackHoleDetector = __decorate([ + (0, tsyringe_1.singleton)(), + __metadata("design:paramtypes", [logger_1.GlobalLogger]) +], BlackHoleDetector); +; +//# sourceMappingURL=blackhole-detector.js.map \ No newline at end of file diff --git a/build/services/blackhole-detector.js.map b/build/services/blackhole-detector.js.map new file mode 100644 index 0000000000000000000000000000000000000000..d54252f58da5fde1e275ddc7ad94bcf401965d60 --- /dev/null +++ b/build/services/blackhole-detector.js.map @@ -0,0 +1 @@ +{"version":3,"file":"blackhole-detector.js","sourceRoot":"","sources":["../../src/services/blackhole-detector.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/build/services/brave-search.js b/build/services/brave-search.js new file mode 100644 index 0000000000000000000000000000000000000000..44949759488d9e84a973a8d48bcb20a6d6b804c7 --- /dev/null +++ b/build/services/brave-search.js @@ -0,0 +1,186 @@ +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.BraveSearchExplicitOperatorsDto = exports.BraveSearchService = void 0; +const civkit_1 = require("civkit"); +const tsyringe_1 = require("tsyringe"); +const logger_1 = require("./logger"); +const secrets_1 = require("../shared/services/secrets"); +const brave_search_1 = require("../shared/3rd-party/brave-search"); +const geoip_1 = require("./geoip"); +const async_context_1 = require("./async-context"); +const blackhole_detector_1 = require("./blackhole-detector"); +let BraveSearchService = class BraveSearchService extends civkit_1.AsyncService { + constructor(globalLogger, secretExposer, geoipControl, threadLocal, blackHoleDetector) { + super(...arguments); + this.globalLogger = globalLogger; + this.secretExposer = secretExposer; + this.geoipControl = geoipControl; + this.threadLocal = threadLocal; + this.blackHoleDetector = blackHoleDetector; + this.logger = this.globalLogger.child({ service: this.constructor.name }); + } + async init() { + await this.dependencyReady(); + this.emit('ready'); + this.braveSearchHTTP = new brave_search_1.BraveSearchHTTP(this.secretExposer.BRAVE_SEARCH_API_KEY); + } + async webSearch(query) { + const ip = this.threadLocal.get('ip'); + const extraHeaders = {}; + if (ip) { + const geoip = await this.geoipControl.lookupCity(ip, geoip_1.GEOIP_SUPPORTED_LANGUAGES.EN); + if (geoip?.city) { + extraHeaders['X-Loc-City'] = encodeURIComponent(geoip.city); + } + if (geoip?.country) { + extraHeaders['X-Loc-Country'] = geoip.country.code; + } + if (geoip?.timezone) { + extraHeaders['X-Loc-Timezone'] = geoip.timezone; + } + if (geoip?.coordinates) { + extraHeaders['X-Loc-Lat'] = `${geoip.coordinates[0]}`; + extraHeaders['X-Loc-Long'] = `${geoip.coordinates[1]}`; + } + if (geoip?.subdivisions?.length) { + extraHeaders['X-Loc-State'] = encodeURIComponent(`${geoip.subdivisions[0].code}`); + extraHeaders['X-Loc-State-Name'] = encodeURIComponent(`${geoip.subdivisions[0].name}`); + } + } + if (this.threadLocal.get('userAgent')) { + extraHeaders['User-Agent'] = this.threadLocal.get('userAgent'); + } + const encoded = { ...query }; + if (encoded.q) { + encoded.q = (Buffer.from(encoded.q).toString('ascii') === encoded.q) ? encoded.q : encodeURIComponent(encoded.q); + } + let maxTries = 11; + while (maxTries--) { + try { + const r = await this.braveSearchHTTP.webSearch(encoded, { headers: extraHeaders }); + this.blackHoleDetector.itWorked(); + return r.parsed; + } + catch (err) { + this.logger.error(`Web search failed: ${err?.message}`, { err: (0, civkit_1.marshalErrorLike)(err) }); + if (err?.status === 429) { + await (0, civkit_1.delay)(500 + 1000 * Math.random()); + continue; + } + throw new civkit_1.DownstreamServiceFailureError({ message: `Search failed` }); + } + } + throw new civkit_1.DownstreamServiceFailureError({ message: `Search failed` }); + } +}; +exports.BraveSearchService = BraveSearchService; +exports.BraveSearchService = BraveSearchService = __decorate([ + (0, tsyringe_1.singleton)(), + __metadata("design:paramtypes", [logger_1.GlobalLogger, + secrets_1.SecretExposer, + geoip_1.GeoIPService, + async_context_1.AsyncLocalContext, + blackhole_detector_1.BlackHoleDetector]) +], BraveSearchService); +class BraveSearchExplicitOperatorsDto extends civkit_1.AutoCastable { + addTo(searchTerm) { + const chunks = []; + for (const [key, value] of Object.entries(this)) { + if (value) { + const values = Array.isArray(value) ? value : [value]; + const textValue = values.map((v) => `${key}:${v}`).join(' OR '); + if (textValue) { + chunks.push(textValue); + } + } + } + const opPart = chunks.length > 1 ? chunks.map((x) => `(${x})`).join(' AND ') : chunks; + if (opPart.length) { + return [searchTerm, opPart].join(' '); + } + return searchTerm; + } + static from(input) { + const instance = super.from(input); + const ctx = Reflect.get(input, civkit_1.RPC_CALL_ENVIRONMENT); + const params = ['ext', 'filetype', 'inbody', 'intitle', 'inpage', 'lang', 'loc', 'site']; + for (const p of params) { + const customValue = ctx?.req.get(`x-${p}`) || ctx?.req.get(`${p}`); + if (!customValue) { + continue; + } + const filtered = customValue.split(', ').filter(Boolean); + if (filtered.length) { + Reflect.set(instance, p, filtered); + } + } + return instance; + } +} +exports.BraveSearchExplicitOperatorsDto = BraveSearchExplicitOperatorsDto; +__decorate([ + (0, civkit_1.Prop)({ + arrayOf: String, + desc: `Returns web pages with a specific file extension. Example: to find the Honda GX120 Owner’s manual in PDF, type “Honda GX120 ownners manual ext:pdf”.` + }), + __metadata("design:type", Object) +], BraveSearchExplicitOperatorsDto.prototype, "ext", void 0); +__decorate([ + (0, civkit_1.Prop)({ + arrayOf: String, + desc: `Returns web pages created in the specified file type. Example: to find a web page created in PDF format about the evaluation of age-related cognitive changes, type “evaluation of age cognitive changes filetype:pdf”.` + }), + __metadata("design:type", Object) +], BraveSearchExplicitOperatorsDto.prototype, "filetype", void 0); +__decorate([ + (0, civkit_1.Prop)({ + arrayOf: String, + desc: `Returns web pages containing the specified term in the body of the page. Example: to find information about the Nvidia GeForce GTX 1080 Ti, making sure the page contains the keywords “founders edition” in the body, type “nvidia 1080 ti inbody:“founders edition””.` + }), + __metadata("design:type", Object) +], BraveSearchExplicitOperatorsDto.prototype, "inbody", void 0); +__decorate([ + (0, civkit_1.Prop)({ + arrayOf: String, + desc: `Returns webpages containing the specified term in the title of the page. Example: to find pages about SEO conferences making sure the results contain 2023 in the title, type “seo conference intitle:2023”.` + }), + __metadata("design:type", Object) +], BraveSearchExplicitOperatorsDto.prototype, "intitle", void 0); +__decorate([ + (0, civkit_1.Prop)({ + arrayOf: String, + desc: `Returns webpages containing the specified term either in the title or in the body of the page. Example: to find pages about the 2024 Oscars containing the keywords “best costume design” in the page, type “oscars 2024 inpage:“best costume design””.` + }), + __metadata("design:type", Object) +], BraveSearchExplicitOperatorsDto.prototype, "inpage", void 0); +__decorate([ + (0, civkit_1.Prop)({ + arrayOf: String, + desc: `Returns web pages written in the specified language. The language code must be in the ISO 639-1 two-letter code format. Example: to find information on visas only in Spanish, type “visas lang:es”.` + }), + __metadata("design:type", Object) +], BraveSearchExplicitOperatorsDto.prototype, "lang", void 0); +__decorate([ + (0, civkit_1.Prop)({ + arrayOf: String, + desc: `Returns web pages written in the specified language. The language code must be in the ISO 639-1 two-letter code format. Example: to find information on visas only in Spanish, type “visas lang:es”.` + }), + __metadata("design:type", Object) +], BraveSearchExplicitOperatorsDto.prototype, "loc", void 0); +__decorate([ + (0, civkit_1.Prop)({ + arrayOf: String, + desc: `Returns web pages coming only from a specific web site. Example: to find information about Goggles only on Brave pages, type “goggles site:brave.com”.` + }), + __metadata("design:type", Object) +], BraveSearchExplicitOperatorsDto.prototype, "site", void 0); +//# sourceMappingURL=brave-search.js.map \ No newline at end of file diff --git a/build/services/brave-search.js.map b/build/services/brave-search.js.map new file mode 100644 index 0000000000000000000000000000000000000000..201ef9613d81c0b94576393210a18886c37ec868 --- /dev/null +++ b/build/services/brave-search.js.map @@ -0,0 +1 @@ +{"version":3,"file":"brave-search.js","sourceRoot":"","sources":["../../src/services/brave-search.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/build/services/canvas.js b/build/services/canvas.js new file mode 100644 index 0000000000000000000000000000000000000000..e900223f3b1fa7934544919283f1ad5c94af744f --- /dev/null +++ b/build/services/canvas.js @@ -0,0 +1,183 @@ +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.CanvasService = void 0; +const tsyringe_1 = require("tsyringe"); +const civkit_1 = require("civkit"); +const promises_1 = require("fs/promises"); +const logger_1 = require("./logger"); +const temp_file_1 = require("./temp-file"); +const worker_threads_1 = require("worker_threads"); +const path_1 = __importDefault(require("path")); +const threaded_1 = require("./threaded"); +const downloadFile = async (uri) => { + const resp = await fetch(uri); + if (!(resp.ok && resp.body)) { + throw new Error(`Unexpected response ${resp.statusText}`); + } + const contentLength = parseInt(resp.headers.get('content-length') || '0'); + if (contentLength > 1024 * 1024 * 100) { + throw new Error('File too large'); + } + const buff = await resp.arrayBuffer(); + return { buff, contentType: resp.headers.get('content-type') }; +}; +let CanvasService = class CanvasService extends civkit_1.AsyncService { + constructor(temp, globalLogger) { + super(...arguments); + this.temp = temp; + this.globalLogger = globalLogger; + this.logger = this.globalLogger.child({ service: this.constructor.name }); + } + async init() { + await this.dependencyReady(); + if (!worker_threads_1.isMainThread) { + const { createSvg2png, initialize } = require('svg2png-wasm'); + const wasmBuff = await (0, promises_1.readFile)(path_1.default.resolve(path_1.default.dirname(require.resolve('svg2png-wasm')), '../svg2png_wasm_bg.wasm')); + const fontBuff = await (0, promises_1.readFile)(path_1.default.resolve(__dirname, '../../licensed/SourceHanSansSC-Regular.otf')); + await initialize(wasmBuff); + this.svg2png = createSvg2png({ + fonts: [Uint8Array.from(fontBuff)], + defaultFontFamily: { + serifFamily: 'Source Han Sans SC', + sansSerifFamily: 'Source Han Sans SC', + cursiveFamily: 'Source Han Sans SC', + fantasyFamily: 'Source Han Sans SC', + monospaceFamily: 'Source Han Sans SC', + } + }); + } + this.canvas = require('@napi-rs/canvas'); + this.emit('ready'); + } + async renderSvgToPng(svgContent) { + return this.svg2png(svgContent, { backgroundColor: '#D3D3D3' }); + } + async _loadImage(input) { + let buff; + let contentType; + do { + if (typeof input === 'string') { + if (input.startsWith('data:')) { + const firstComma = input.indexOf(','); + const header = input.slice(0, firstComma); + const data = input.slice(firstComma + 1); + const encoding = header.split(';')[1]; + contentType = header.split(';')[0].split(':')[1]; + if (encoding?.startsWith('base64')) { + buff = Buffer.from(data, 'base64'); + } + else { + buff = Buffer.from(decodeURIComponent(data), 'utf-8'); + } + break; + } + if (input.startsWith('http')) { + const r = await downloadFile(input); + buff = Buffer.from(r.buff); + contentType = r.contentType; + break; + } + } + if (Buffer.isBuffer(input)) { + buff = input; + const mime = await (0, civkit_1.mimeOf)(buff); + contentType = `${mime.mediaType}/${mime.subType}`; + break; + } + throw new civkit_1.ParamValidationError('Invalid input'); + } while (false); + if (!buff) { + throw new civkit_1.ParamValidationError('Invalid input'); + } + if (contentType?.includes('svg')) { + buff = await this.renderSvgToPng(buff.toString('utf-8')); + } + const img = await this.canvas.loadImage(buff); + Reflect.set(img, 'contentType', contentType); + return img; + } + async loadImage(uri) { + const t0 = Date.now(); + try { + const theImage = await this._loadImage(uri); + const t1 = Date.now(); + this.logger.debug(`Image loaded in ${t1 - t0}ms`); + return theImage; + } + catch (err) { + if (err?.message?.includes('Unsupported image type') || err?.message?.includes('unsupported')) { + this.logger.warn(`Failed to load image ${uri.slice(0, 128)}`, { err }); + throw new civkit_1.SubmittedDataMalformedError(`Unknown image format for ${uri.slice(0, 128)}`); + } + throw err; + } + } + fitImageToSquareBox(image, size = 1024) { + // this.logger.debug(`Fitting image(${ image.width }x${ image.height }) to ${ size } box`); + // const t0 = Date.now(); + if (image.width <= size && image.height <= size) { + if (image instanceof this.canvas.Canvas) { + return image; + } + const canvasInstance = this.canvas.createCanvas(image.width, image.height); + const ctx = canvasInstance.getContext('2d'); + ctx.drawImage(image, 0, 0, image.width, image.height, 0, 0, canvasInstance.width, canvasInstance.height); + // this.logger.debug(`No need to resize, copied to canvas in ${ Date.now() - t0 } ms`); + return canvasInstance; + } + const aspectRatio = image.width / image.height; + const resizedWidth = Math.round(aspectRatio > 1 ? size : size * aspectRatio); + const resizedHeight = Math.round(aspectRatio > 1 ? size / aspectRatio : size); + const canvasInstance = this.canvas.createCanvas(resizedWidth, resizedHeight); + const ctx = canvasInstance.getContext('2d'); + ctx.drawImage(image, 0, 0, image.width, image.height, 0, 0, resizedWidth, resizedHeight); + // this.logger.debug(`Resized to ${ resizedWidth }x${ resizedHeight } in ${ Date.now() - t0 } ms`); + return canvasInstance; + } + corpImage(image, x, y, w, h) { + // this.logger.debug(`Cropping image(${ image.width }x${ image.height }) to ${ w }x${ h } at ${ x },${ y } `); + // const t0 = Date.now(); + const canvasInstance = this.canvas.createCanvas(w, h); + const ctx = canvasInstance.getContext('2d'); + ctx.drawImage(image, x, y, w, h, 0, 0, w, h); + // this.logger.debug(`Crop complete in ${ Date.now() - t0 } ms`); + return canvasInstance; + } + canvasToDataUrl(canvas, mimeType) { + // this.logger.debug(`Exporting canvas(${ canvas.width }x${ canvas.height })`); + // const t0 = Date.now(); + return canvas.toDataURLAsync((mimeType || 'image/png')); + } + async canvasToBuffer(canvas, mimeType) { + // this.logger.debug(`Exporting canvas(${ canvas.width }x${ canvas.height })`); + // const t0 = Date.now(); + return canvas.toBuffer((mimeType || 'image/png')); + } +}; +exports.CanvasService = CanvasService; +__decorate([ + (0, threaded_1.Threaded)(), + __metadata("design:type", Function), + __metadata("design:paramtypes", [String]), + __metadata("design:returntype", Promise) +], CanvasService.prototype, "renderSvgToPng", null); +exports.CanvasService = CanvasService = __decorate([ + (0, tsyringe_1.singleton)(), + __metadata("design:paramtypes", [temp_file_1.TempFileManager, + logger_1.GlobalLogger]) +], CanvasService); +const instance = tsyringe_1.container.resolve(CanvasService); +exports.default = instance; +//# sourceMappingURL=canvas.js.map \ No newline at end of file diff --git a/build/services/canvas.js.map b/build/services/canvas.js.map new file mode 100644 index 0000000000000000000000000000000000000000..fd4abfeee3e832618f856f92d02f163e68ea387e --- /dev/null +++ b/build/services/canvas.js.map @@ -0,0 +1 @@ +{"version":3,"file":"canvas.js","sourceRoot":"","sources":["../../src/services/canvas.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/build/services/cf-browser-rendering.js b/build/services/cf-browser-rendering.js new file mode 100644 index 0000000000000000000000000000000000000000..7a2b84485fb037b84d18eae2400ef795da13a922 --- /dev/null +++ b/build/services/cf-browser-rendering.js @@ -0,0 +1,58 @@ +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.CFBrowserRendering = void 0; +const tsyringe_1 = require("tsyringe"); +const async_service_1 = require("civkit/async-service"); +const secrets_1 = require("../shared/services/secrets"); +const logger_1 = require("./logger"); +const cloud_flare_1 = require("../shared/3rd-party/cloud-flare"); +const http_1 = require("civkit/http"); +const errors_1 = require("./errors"); +let CFBrowserRendering = class CFBrowserRendering extends async_service_1.AsyncService { + constructor(globalLogger, secretExposer) { + super(...arguments); + this.globalLogger = globalLogger; + this.secretExposer = secretExposer; + this.logger = this.globalLogger.child({ service: this.constructor.name }); + } + async init() { + await this.dependencyReady(); + const [account, key] = this.secretExposer.CLOUD_FLARE_API_KEY?.split(':'); + this.client = new cloud_flare_1.CloudFlareHTTP(account, key); + this.emit('ready'); + } + async fetchContent(url) { + try { + const r = await this.client.fetchBrowserRenderedHTML({ url }); + return r.parsed.result; + } + catch (err) { + if (err instanceof http_1.HTTPServiceError) { + if (err.status === 429) { + // Rate limit exceeded, return empty result + this.logger.warn('Cloudflare browser rendering rate limit exceeded', { url }); + throw new errors_1.ServiceNodeResourceDrainError(`Cloudflare browser rendering (our account) is at capacity, please try again later or switch to another engine.`); + } + } + throw err; + } + } +}; +exports.CFBrowserRendering = CFBrowserRendering; +exports.CFBrowserRendering = CFBrowserRendering = __decorate([ + (0, tsyringe_1.singleton)(), + __metadata("design:paramtypes", [logger_1.GlobalLogger, + secrets_1.SecretExposer]) +], CFBrowserRendering); +const instance = tsyringe_1.container.resolve(CFBrowserRendering); +exports.default = instance; +//# sourceMappingURL=cf-browser-rendering.js.map \ No newline at end of file diff --git a/build/services/cf-browser-rendering.js.map b/build/services/cf-browser-rendering.js.map new file mode 100644 index 0000000000000000000000000000000000000000..51459a7d02df77f9955335b1c0fdd5bc237f8e3a --- /dev/null +++ b/build/services/cf-browser-rendering.js.map @@ -0,0 +1 @@ +{"version":3,"file":"cf-browser-rendering.js","sourceRoot":"","sources":["../../src/services/cf-browser-rendering.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,uCAAgD;AAChD,wDAAoD;AACpD,wDAA2D;AAC3D,qCAAwC;AACxC,iEAAiE;AACjE,sCAA+C;AAC/C,qCAAyD;AAGlD,IAAM,kBAAkB,GAAxB,MAAM,kBAAmB,SAAQ,4BAAY;IAKhD,YACc,YAA0B,EAC1B,aAA4B;QAEtC,KAAK,CAAC,GAAG,SAAS,CAAC,CAAC;QAHV,iBAAY,GAAZ,YAAY,CAAc;QAC1B,kBAAa,GAAb,aAAa,CAAe;QAL1C,WAAM,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC;IAQrE,CAAC;IAGQ,KAAK,CAAC,IAAI;QACf,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;QAC7B,MAAM,CAAC,OAAO,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC,mBAAmB,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;QAC1E,IAAI,CAAC,MAAM,GAAG,IAAI,4BAAc,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QAE/C,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,GAAW;QAC1B,IAAI,CAAC;YACD,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,wBAAwB,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;YAE9D,OAAO,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC;QAC3B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACX,IAAI,GAAG,YAAY,uBAAgB,EAAE,CAAC;gBAClC,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;oBACrB,2CAA2C;oBAC3C,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,kDAAkD,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;oBAE9E,MAAM,IAAI,sCAA6B,CAAC,gHAAgH,CAAE,CAAC;gBAC/J,CAAC;YACL,CAAC;YAED,MAAM,GAAG,CAAC;QACd,CAAC;IACL,CAAC;CAEJ,CAAA;AAxCY,gDAAkB;6BAAlB,kBAAkB;IAD9B,IAAA,oBAAS,GAAE;qCAOoB,qBAAY;QACX,uBAAa;GAPjC,kBAAkB,CAwC9B;AAED,MAAM,QAAQ,GAAG,oBAAS,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;AAEvD,kBAAe,QAAQ,CAAC"} \ No newline at end of file diff --git a/build/services/curl.js b/build/services/curl.js new file mode 100644 index 0000000000000000000000000000000000000000..9c9877d48475547a2e2493eb4e1144c3ffacf38c --- /dev/null +++ b/build/services/curl.js @@ -0,0 +1,431 @@ +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.CurlControl = void 0; +const async_service_1 = require("civkit/async-service"); +const tsyringe_1 = require("tsyringe"); +const node_libcurl_1 = require("node-libcurl"); +const set_cookie_parser_1 = require("set-cookie-parser"); +const logger_1 = require("./logger"); +const civkit_1 = require("civkit"); +const errors_1 = require("./errors"); +const temp_file_1 = require("../services/temp-file"); +const zlib_1 = require("zlib"); +const simple_zstd_1 = require("simple-zstd"); +const lodash_1 = __importDefault(require("lodash")); +const async_context_1 = require("./async-context"); +const blackhole_detector_1 = require("./blackhole-detector"); +let CurlControl = class CurlControl extends async_service_1.AsyncService { + constructor(globalLogger, tempFileManager, asyncLocalContext, blackHoleDetector) { + super(...arguments); + this.globalLogger = globalLogger; + this.tempFileManager = tempFileManager; + this.asyncLocalContext = asyncLocalContext; + this.blackHoleDetector = blackHoleDetector; + this.logger = this.globalLogger.child({ service: this.constructor.name }); + this.chromeVersion = `132`; + this.safariVersion = `537.36`; + this.platform = `Linux`; + this.ua = `Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/${this.safariVersion} (KHTML, like Gecko) Chrome/${this.chromeVersion}.0.0.0 Safari/${this.safariVersion}`; + this.lifeCycleTrack = new WeakMap(); + } + async init() { + await this.dependencyReady(); + if (process.platform === 'darwin') { + this.platform = `macOS`; + } + else if (process.platform === 'win32') { + this.platform = `Windows`; + } + this.emit('ready'); + } + impersonateChrome(ua) { + this.chromeVersion = ua.match(/Chrome\/(\d+)/)[1]; + this.safariVersion = ua.match(/AppleWebKit\/([\d\.]+)/)[1]; + this.ua = ua; + } + curlImpersonateHeader(curl, headers) { + let uaPlatform = this.platform; + if (this.ua.includes('Windows')) { + uaPlatform = 'Windows'; + } + else if (this.ua.includes('Android')) { + uaPlatform = 'Android'; + } + else if (this.ua.includes('iPhone') || this.ua.includes('iPad') || this.ua.includes('iPod')) { + uaPlatform = 'iOS'; + } + else if (this.ua.includes('CrOS')) { + uaPlatform = 'Chrome OS'; + } + else if (this.ua.includes('Macintosh')) { + uaPlatform = 'macOS'; + } + const mixinHeaders = { + 'Sec-Ch-Ua': `Not A(Brand";v="8", "Chromium";v="${this.chromeVersion}", "Google Chrome";v="${this.chromeVersion}"`, + 'Sec-Ch-Ua-Mobile': '?0', + 'Sec-Ch-Ua-Platform': `"${uaPlatform}"`, + 'Upgrade-Insecure-Requests': '1', + 'User-Agent': this.ua, + 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7', + 'Sec-Fetch-Site': 'none', + 'Sec-Fetch-Mode': 'navigate', + 'Sec-Fetch-User': '?1', + 'Sec-Fetch-Dest': 'document', + 'Accept-Encoding': 'gzip, deflate, br, zstd', + 'Accept-Language': 'en-US,en;q=0.9', + }; + const headersCopy = { ...headers }; + for (const k of Object.keys(mixinHeaders)) { + const lowerK = k.toLowerCase(); + if (headersCopy[lowerK]) { + mixinHeaders[k] = headersCopy[lowerK]; + delete headersCopy[lowerK]; + } + } + Object.assign(mixinHeaders, headersCopy); + curl.setOpt(node_libcurl_1.Curl.option.HTTPHEADER, Object.entries(mixinHeaders).flatMap(([k, v]) => { + if (Array.isArray(v) && v.length) { + return v.map((v2) => `${k}: ${v2}`); + } + return [`${k}: ${v}`]; + })); + return curl; + } + urlToFile1Shot(urlToCrawl, crawlOpts) { + return new Promise((resolve, reject) => { + let contentType = ''; + const curl = new node_libcurl_1.Curl(); + curl.enable(node_libcurl_1.CurlFeature.StreamResponse); + curl.setOpt('URL', urlToCrawl.toString()); + curl.setOpt(node_libcurl_1.Curl.option.FOLLOWLOCATION, false); + curl.setOpt(node_libcurl_1.Curl.option.SSL_VERIFYPEER, false); + curl.setOpt(node_libcurl_1.Curl.option.TIMEOUT_MS, crawlOpts?.timeoutMs || 30_000); + curl.setOpt(node_libcurl_1.Curl.option.CONNECTTIMEOUT_MS, 3_000); + curl.setOpt(node_libcurl_1.Curl.option.LOW_SPEED_LIMIT, 32768); + curl.setOpt(node_libcurl_1.Curl.option.LOW_SPEED_TIME, 5_000); + if (crawlOpts?.method) { + curl.setOpt(node_libcurl_1.Curl.option.CUSTOMREQUEST, crawlOpts.method.toUpperCase()); + } + if (crawlOpts?.body) { + curl.setOpt(node_libcurl_1.Curl.option.POSTFIELDS, crawlOpts.body.toString()); + } + const headersToSet = { ...crawlOpts?.extraHeaders }; + if (crawlOpts?.cookies?.length) { + const cookieKv = {}; + for (const cookie of crawlOpts.cookies) { + cookieKv[cookie.name] = cookie.value; + } + for (const cookie of crawlOpts.cookies) { + if (cookie.maxAge && cookie.maxAge < 0) { + delete cookieKv[cookie.name]; + continue; + } + if (cookie.expires && cookie.expires < new Date()) { + delete cookieKv[cookie.name]; + continue; + } + if (cookie.secure && urlToCrawl.protocol !== 'https:') { + delete cookieKv[cookie.name]; + continue; + } + if (cookie.domain && !urlToCrawl.hostname.endsWith(cookie.domain)) { + delete cookieKv[cookie.name]; + continue; + } + if (cookie.path && !urlToCrawl.pathname.startsWith(cookie.path)) { + delete cookieKv[cookie.name]; + continue; + } + } + const cookieChunks = Object.entries(cookieKv).map(([k, v]) => `${k}=${encodeURIComponent(v)}`); + headersToSet.cookie ??= cookieChunks.join('; '); + } + if (crawlOpts?.referer) { + headersToSet.referer ??= crawlOpts.referer; + } + if (crawlOpts?.overrideUserAgent) { + headersToSet['user-agent'] ??= crawlOpts.overrideUserAgent; + } + this.curlImpersonateHeader(curl, headersToSet); + if (crawlOpts?.proxyUrl) { + const proxyUrlCopy = new URL(crawlOpts.proxyUrl); + curl.setOpt(node_libcurl_1.Curl.option.PROXY, proxyUrlCopy.href); + } + let curlStream; + curl.on('error', (err, errCode) => { + curl.close(); + this.logger.warn(`Curl ${urlToCrawl.origin}: ${err}`, { err, urlToCrawl }); + const err2 = this.digestCurlCode(errCode, err.message) || + new civkit_1.AssertionFailureError(`Failed to access ${urlToCrawl.origin}: ${err.message}`); + err2.cause ??= err; + if (curlStream) { + // For some reason, manually emitting error event is required for curlStream. + curlStream.emit('error', err2); + curlStream.destroy(err2); + } + reject(err2); + }); + curl.setOpt(node_libcurl_1.Curl.option.MAXFILESIZE, 4 * 1024 * 1024 * 1024); // 4GB + let status = -1; + let statusText; + let contentEncoding = ''; + curl.once('end', () => { + if (curlStream) { + curlStream.once('end', () => curl.close()); + return; + } + curl.close(); + }); + curl.on('stream', (stream, statusCode, headers) => { + this.logger.debug(`CURL: [${statusCode}] ${urlToCrawl.origin}`, { statusCode }); + status = statusCode; + curlStream = stream; + for (const headerSet of headers) { + for (const [k, v] of Object.entries(headerSet)) { + if (k.trim().endsWith(':')) { + Reflect.set(headerSet, k.slice(0, k.indexOf(':')), v || ''); + Reflect.deleteProperty(headerSet, k); + continue; + } + if (v === undefined) { + Reflect.set(headerSet, k, ''); + continue; + } + if (k.toLowerCase() === 'content-type' && typeof v === 'string') { + contentType = v.toLowerCase(); + } + } + } + const lastResHeaders = headers[headers.length - 1]; + statusText = lastResHeaders.result?.reason; + for (const [k, v] of Object.entries(lastResHeaders)) { + const kl = k.toLowerCase(); + if (kl === 'content-type') { + contentType = (v || '').toLowerCase(); + } + if (kl === 'content-encoding') { + contentEncoding = (v || '').toLowerCase(); + } + if (contentType && contentEncoding) { + break; + } + } + if ([301, 302, 303, 307, 308].includes(statusCode)) { + if (stream) { + stream.resume(); + } + resolve({ + statusCode: status, + statusText, + data: undefined, + headers: headers, + }); + return; + } + if (!stream) { + resolve({ + statusCode: status, + statusText, + data: undefined, + headers: headers, + }); + return; + } + switch (contentEncoding) { + case 'gzip': { + const decompressed = (0, zlib_1.createGunzip)(); + stream.pipe(decompressed); + stream.once('error', (err) => { + decompressed.destroy(err); + }); + stream = decompressed; + break; + } + case 'deflate': { + const decompressed = (0, zlib_1.createInflate)(); + stream.pipe(decompressed); + stream.once('error', (err) => { + decompressed.destroy(err); + }); + stream = decompressed; + break; + } + case 'br': { + const decompressed = (0, zlib_1.createBrotliDecompress)(); + stream.pipe(decompressed); + stream.once('error', (err) => { + decompressed.destroy(err); + }); + stream = decompressed; + break; + } + case 'zstd': { + const decompressed = (0, simple_zstd_1.ZSTDDecompress)(); + stream.pipe(decompressed); + stream.once('error', (err) => { + decompressed.destroy(err); + }); + stream = decompressed; + break; + } + default: { + break; + } + } + const fpath = this.tempFileManager.alloc(); + const fancyFile = civkit_1.FancyFile.auto(stream, fpath); + this.tempFileManager.bindPathTo(fancyFile, fpath); + resolve({ + statusCode: status, + statusText, + data: fancyFile, + headers: headers, + }); + }); + curl.perform(); + }); + } + async urlToFile(urlToCrawl, crawlOpts) { + let leftRedirection = 6; + let cookieRedirects = 0; + let opts = { ...crawlOpts }; + let nextHopUrl = urlToCrawl; + const fakeHeaderInfos = []; + do { + const r = await this.urlToFile1Shot(nextHopUrl, opts); + if ([301, 302, 303, 307, 308].includes(r.statusCode)) { + fakeHeaderInfos.push(...r.headers); + const headers = r.headers[r.headers.length - 1]; + const location = headers.Location || headers.location; + const setCookieHeader = headers['Set-Cookie'] || headers['set-cookie']; + if (setCookieHeader) { + const cookieAssignments = Array.isArray(setCookieHeader) ? setCookieHeader : [setCookieHeader]; + const parsed = cookieAssignments.filter(Boolean).map((x) => (0, set_cookie_parser_1.parseString)(x, { decodeValues: true })); + if (parsed.length) { + opts.cookies = [...(opts.cookies || []), ...parsed]; + } + if (!location) { + cookieRedirects += 1; + } + } + if (!location && !setCookieHeader) { + // Follow curl behavior + return { + statusCode: r.statusCode, + data: r.data, + headers: fakeHeaderInfos.concat(r.headers), + }; + } + if (!location && cookieRedirects > 1) { + throw new errors_1.ServiceBadApproachError(`Failed to access ${urlToCrawl}: Browser required to solve complex cookie preconditions.`); + } + nextHopUrl = new URL(location || '', nextHopUrl); + leftRedirection -= 1; + continue; + } + return { + statusCode: r.statusCode, + statusText: r.statusText, + data: r.data, + headers: fakeHeaderInfos.concat(r.headers), + }; + } while (leftRedirection > 0); + throw new errors_1.ServiceBadAttemptError(`Failed to access ${urlToCrawl}: Too many redirections.`); + } + async sideLoad(targetUrl, crawlOpts) { + const curlResult = await this.urlToFile(targetUrl, crawlOpts); + this.blackHoleDetector.itWorked(); + let finalURL = targetUrl; + const sideLoadOpts = { + impersonate: {}, + proxyOrigin: {}, + }; + for (const headers of curlResult.headers) { + sideLoadOpts.impersonate[finalURL.href] = { + status: headers.result?.code || -1, + headers: lodash_1.default.omit(headers, 'result'), + contentType: headers['Content-Type'] || headers['content-type'], + }; + if (crawlOpts?.proxyUrl) { + sideLoadOpts.proxyOrigin[finalURL.origin] = crawlOpts.proxyUrl; + } + if (headers.result?.code && [301, 302, 307, 308].includes(headers.result.code)) { + const location = headers.Location || headers.location; + if (location) { + finalURL = new URL(location, finalURL); + } + } + } + const lastHeaders = curlResult.headers[curlResult.headers.length - 1]; + const contentType = (lastHeaders['Content-Type'] || lastHeaders['content-type'])?.toLowerCase() || (await curlResult.data?.mimeType) || 'application/octet-stream'; + const contentDisposition = lastHeaders['Content-Disposition'] || lastHeaders['content-disposition']; + const fileName = contentDisposition?.match(/filename="([^"]+)"/i)?.[1] || finalURL.pathname.split('/').pop(); + if (sideLoadOpts.impersonate[finalURL.href] && (await curlResult.data?.size)) { + sideLoadOpts.impersonate[finalURL.href].body = curlResult.data; + } + // This should keep the file from being garbage collected and deleted until this asyncContext/request is done. + this.lifeCycleTrack.set(this.asyncLocalContext.ctx, curlResult.data); + return { + finalURL, + sideLoadOpts, + chain: curlResult.headers, + status: curlResult.statusCode, + statusText: curlResult.statusText, + headers: lastHeaders, + contentType, + contentDisposition, + fileName, + file: curlResult.data + }; + } + digestCurlCode(code, msg) { + switch (code) { + // 400 User errors + case node_libcurl_1.CurlCode.CURLE_COULDNT_RESOLVE_HOST: { + return new civkit_1.AssertionFailureError(msg); + } + // Maybe retry but dont retry with curl again + case node_libcurl_1.CurlCode.CURLE_OPERATION_TIMEDOUT: + case node_libcurl_1.CurlCode.CURLE_UNSUPPORTED_PROTOCOL: + case node_libcurl_1.CurlCode.CURLE_PEER_FAILED_VERIFICATION: { + return new errors_1.ServiceBadApproachError(msg); + } + // Retryable errors + case node_libcurl_1.CurlCode.CURLE_REMOTE_ACCESS_DENIED: + case node_libcurl_1.CurlCode.CURLE_SEND_ERROR: + case node_libcurl_1.CurlCode.CURLE_RECV_ERROR: + case node_libcurl_1.CurlCode.CURLE_GOT_NOTHING: + case node_libcurl_1.CurlCode.CURLE_SSL_CONNECT_ERROR: + case node_libcurl_1.CurlCode.CURLE_QUIC_CONNECT_ERROR: + case node_libcurl_1.CurlCode.CURLE_COULDNT_RESOLVE_PROXY: + case node_libcurl_1.CurlCode.CURLE_COULDNT_CONNECT: + case node_libcurl_1.CurlCode.CURLE_PARTIAL_FILE: { + return new errors_1.ServiceBadAttemptError(msg); + } + default: { + return undefined; + } + } + } +}; +exports.CurlControl = CurlControl; +exports.CurlControl = CurlControl = __decorate([ + (0, tsyringe_1.singleton)(), + __metadata("design:paramtypes", [logger_1.GlobalLogger, + temp_file_1.TempFileManager, + async_context_1.AsyncLocalContext, + blackhole_detector_1.BlackHoleDetector]) +], CurlControl); +//# sourceMappingURL=curl.js.map \ No newline at end of file diff --git a/build/services/curl.js.map b/build/services/curl.js.map new file mode 100644 index 0000000000000000000000000000000000000000..2895cc348af852952b478a1df9256e4f0f79acd0 --- /dev/null +++ b/build/services/curl.js.map @@ -0,0 +1 @@ +{"version":3,"file":"curl.js","sourceRoot":"","sources":["../../src/services/curl.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/build/services/errors.js b/build/services/errors.js new file mode 100644 index 0000000000000000000000000000000000000000..a00d9c04f8d109ae05bb48c4d92921ccb2f5d21c --- /dev/null +++ b/build/services/errors.js @@ -0,0 +1,101 @@ +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.BatchSizeTooLargeError = exports.SecurityCompromiseError = exports.HarmfulContentError = exports.BudgetExceededError = exports.LockConflictError = exports.InsufficientBalanceError = exports.TierFeatureConstraintError = exports.InsufficientCreditsError = exports.EmailUnverifiedError = exports.ServiceBadApproachError = exports.ServiceBadAttemptError = exports.ServiceNodeResourceDrainError = exports.ServiceCrashedError = exports.ServiceDisabledError = void 0; +const civ_rpc_1 = require("civkit/civ-rpc"); +const dayjs_1 = __importDefault(require("dayjs")); +const utc_1 = __importDefault(require("dayjs/plugin/utc")); +dayjs_1.default.extend(utc_1.default); +let ServiceDisabledError = class ServiceDisabledError extends civ_rpc_1.ApplicationError { +}; +exports.ServiceDisabledError = ServiceDisabledError; +exports.ServiceDisabledError = ServiceDisabledError = __decorate([ + (0, civ_rpc_1.StatusCode)(50301) +], ServiceDisabledError); +let ServiceCrashedError = class ServiceCrashedError extends civ_rpc_1.ApplicationError { +}; +exports.ServiceCrashedError = ServiceCrashedError; +exports.ServiceCrashedError = ServiceCrashedError = __decorate([ + (0, civ_rpc_1.StatusCode)(50302) +], ServiceCrashedError); +let ServiceNodeResourceDrainError = class ServiceNodeResourceDrainError extends civ_rpc_1.ApplicationError { +}; +exports.ServiceNodeResourceDrainError = ServiceNodeResourceDrainError; +exports.ServiceNodeResourceDrainError = ServiceNodeResourceDrainError = __decorate([ + (0, civ_rpc_1.StatusCode)(50303) +], ServiceNodeResourceDrainError); +let ServiceBadAttemptError = class ServiceBadAttemptError extends civ_rpc_1.ApplicationError { +}; +exports.ServiceBadAttemptError = ServiceBadAttemptError; +exports.ServiceBadAttemptError = ServiceBadAttemptError = __decorate([ + (0, civ_rpc_1.StatusCode)(50304) +], ServiceBadAttemptError); +let ServiceBadApproachError = class ServiceBadApproachError extends ServiceBadAttemptError { +}; +exports.ServiceBadApproachError = ServiceBadApproachError; +exports.ServiceBadApproachError = ServiceBadApproachError = __decorate([ + (0, civ_rpc_1.StatusCode)(50305) +], ServiceBadApproachError); +let EmailUnverifiedError = class EmailUnverifiedError extends civ_rpc_1.ApplicationError { +}; +exports.EmailUnverifiedError = EmailUnverifiedError; +exports.EmailUnverifiedError = EmailUnverifiedError = __decorate([ + (0, civ_rpc_1.StatusCode)(40104) +], EmailUnverifiedError); +let InsufficientCreditsError = class InsufficientCreditsError extends civ_rpc_1.ApplicationError { +}; +exports.InsufficientCreditsError = InsufficientCreditsError; +exports.InsufficientCreditsError = InsufficientCreditsError = __decorate([ + (0, civ_rpc_1.StatusCode)(40201) +], InsufficientCreditsError); +let TierFeatureConstraintError = class TierFeatureConstraintError extends civ_rpc_1.ApplicationError { +}; +exports.TierFeatureConstraintError = TierFeatureConstraintError; +exports.TierFeatureConstraintError = TierFeatureConstraintError = __decorate([ + (0, civ_rpc_1.StatusCode)(40202) +], TierFeatureConstraintError); +let InsufficientBalanceError = class InsufficientBalanceError extends civ_rpc_1.ApplicationError { +}; +exports.InsufficientBalanceError = InsufficientBalanceError; +exports.InsufficientBalanceError = InsufficientBalanceError = __decorate([ + (0, civ_rpc_1.StatusCode)(40203) +], InsufficientBalanceError); +let LockConflictError = class LockConflictError extends civ_rpc_1.ApplicationError { +}; +exports.LockConflictError = LockConflictError; +exports.LockConflictError = LockConflictError = __decorate([ + (0, civ_rpc_1.StatusCode)(40903) +], LockConflictError); +let BudgetExceededError = class BudgetExceededError extends civ_rpc_1.ApplicationError { +}; +exports.BudgetExceededError = BudgetExceededError; +exports.BudgetExceededError = BudgetExceededError = __decorate([ + (0, civ_rpc_1.StatusCode)(40904) +], BudgetExceededError); +let HarmfulContentError = class HarmfulContentError extends civ_rpc_1.ApplicationError { +}; +exports.HarmfulContentError = HarmfulContentError; +exports.HarmfulContentError = HarmfulContentError = __decorate([ + (0, civ_rpc_1.StatusCode)(45101) +], HarmfulContentError); +let SecurityCompromiseError = class SecurityCompromiseError extends civ_rpc_1.ApplicationError { +}; +exports.SecurityCompromiseError = SecurityCompromiseError; +exports.SecurityCompromiseError = SecurityCompromiseError = __decorate([ + (0, civ_rpc_1.StatusCode)(45102) +], SecurityCompromiseError); +let BatchSizeTooLargeError = class BatchSizeTooLargeError extends civ_rpc_1.ApplicationError { +}; +exports.BatchSizeTooLargeError = BatchSizeTooLargeError; +exports.BatchSizeTooLargeError = BatchSizeTooLargeError = __decorate([ + (0, civ_rpc_1.StatusCode)(41201) +], BatchSizeTooLargeError); +//# sourceMappingURL=errors.js.map \ No newline at end of file diff --git a/build/services/errors.js.map b/build/services/errors.js.map new file mode 100644 index 0000000000000000000000000000000000000000..3837982439b0a1092b429b459adcfb54f03c1024 --- /dev/null +++ b/build/services/errors.js.map @@ -0,0 +1 @@ +{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/services/errors.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,4CAA8D;AAE9D,kDAA0B;AAC1B,2DAAmC;AAEnC,eAAK,CAAC,MAAM,CAAC,aAAG,CAAC,CAAC;AAGX,IAAM,oBAAoB,GAA1B,MAAM,oBAAqB,SAAQ,0BAAgB;CAAI,CAAA;AAAjD,oDAAoB;+BAApB,oBAAoB;IADhC,IAAA,oBAAU,EAAC,KAAK,CAAC;GACL,oBAAoB,CAA6B;AAGvD,IAAM,mBAAmB,GAAzB,MAAM,mBAAoB,SAAQ,0BAAgB;CAAI,CAAA;AAAhD,kDAAmB;8BAAnB,mBAAmB;IAD/B,IAAA,oBAAU,EAAC,KAAK,CAAC;GACL,mBAAmB,CAA6B;AAGtD,IAAM,6BAA6B,GAAnC,MAAM,6BAA8B,SAAQ,0BAAgB;CAAI,CAAA;AAA1D,sEAA6B;wCAA7B,6BAA6B;IADzC,IAAA,oBAAU,EAAC,KAAK,CAAC;GACL,6BAA6B,CAA6B;AAGhE,IAAM,sBAAsB,GAA5B,MAAM,sBAAuB,SAAQ,0BAAgB;CAAI,CAAA;AAAnD,wDAAsB;iCAAtB,sBAAsB;IADlC,IAAA,oBAAU,EAAC,KAAK,CAAC;GACL,sBAAsB,CAA6B;AAGzD,IAAM,uBAAuB,GAA7B,MAAM,uBAAwB,SAAQ,sBAAsB;CAAI,CAAA;AAA1D,0DAAuB;kCAAvB,uBAAuB;IADnC,IAAA,oBAAU,EAAC,KAAK,CAAC;GACL,uBAAuB,CAAmC;AAGhE,IAAM,oBAAoB,GAA1B,MAAM,oBAAqB,SAAQ,0BAAgB;CAAI,CAAA;AAAjD,oDAAoB;+BAApB,oBAAoB;IADhC,IAAA,oBAAU,EAAC,KAAK,CAAC;GACL,oBAAoB,CAA6B;AAGvD,IAAM,wBAAwB,GAA9B,MAAM,wBAAyB,SAAQ,0BAAgB;CAAI,CAAA;AAArD,4DAAwB;mCAAxB,wBAAwB;IADpC,IAAA,oBAAU,EAAC,KAAK,CAAC;GACL,wBAAwB,CAA6B;AAG3D,IAAM,0BAA0B,GAAhC,MAAM,0BAA2B,SAAQ,0BAAgB;CAAI,CAAA;AAAvD,gEAA0B;qCAA1B,0BAA0B;IADtC,IAAA,oBAAU,EAAC,KAAK,CAAC;GACL,0BAA0B,CAA6B;AAG7D,IAAM,wBAAwB,GAA9B,MAAM,wBAAyB,SAAQ,0BAAgB;CAAI,CAAA;AAArD,4DAAwB;mCAAxB,wBAAwB;IADpC,IAAA,oBAAU,EAAC,KAAK,CAAC;GACL,wBAAwB,CAA6B;AAG3D,IAAM,iBAAiB,GAAvB,MAAM,iBAAkB,SAAQ,0BAAgB;CAAI,CAAA;AAA9C,8CAAiB;4BAAjB,iBAAiB;IAD7B,IAAA,oBAAU,EAAC,KAAK,CAAC;GACL,iBAAiB,CAA6B;AAGpD,IAAM,mBAAmB,GAAzB,MAAM,mBAAoB,SAAQ,0BAAgB;CAAI,CAAA;AAAhD,kDAAmB;8BAAnB,mBAAmB;IAD/B,IAAA,oBAAU,EAAC,KAAK,CAAC;GACL,mBAAmB,CAA6B;AAGtD,IAAM,mBAAmB,GAAzB,MAAM,mBAAoB,SAAQ,0BAAgB;CAAI,CAAA;AAAhD,kDAAmB;8BAAnB,mBAAmB;IAD/B,IAAA,oBAAU,EAAC,KAAK,CAAC;GACL,mBAAmB,CAA6B;AAGtD,IAAM,uBAAuB,GAA7B,MAAM,uBAAwB,SAAQ,0BAAgB;CAAI,CAAA;AAApD,0DAAuB;kCAAvB,uBAAuB;IADnC,IAAA,oBAAU,EAAC,KAAK,CAAC;GACL,uBAAuB,CAA6B;AAG1D,IAAM,sBAAsB,GAA5B,MAAM,sBAAuB,SAAQ,0BAAgB;CAAI,CAAA;AAAnD,wDAAsB;iCAAtB,sBAAsB;IADlC,IAAA,oBAAU,EAAC,KAAK,CAAC;GACL,sBAAsB,CAA6B"} \ No newline at end of file diff --git a/build/services/finalizer.js b/build/services/finalizer.js new file mode 100644 index 0000000000000000000000000000000000000000..5c8518c3fe44de8630e3aea4726c030282575ce4 --- /dev/null +++ b/build/services/finalizer.js @@ -0,0 +1,49 @@ +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Finalizer = exports.FinalizerService = void 0; +const finalizer_1 = require("civkit/finalizer"); +const tsyringe_1 = require("tsyringe"); +const worker_threads_1 = require("worker_threads"); +const logger_1 = require("./logger"); +const realProcessExit = process.exit; +process.exit = ((code) => { + if (worker_threads_1.isMainThread) { + return; + } + return realProcessExit(code); +}); +let FinalizerService = class FinalizerService extends finalizer_1.AbstractFinalizerService { + quitProcess(code) { + return realProcessExit(code); + } + constructor(globalLogger) { + super(...arguments); + this.globalLogger = globalLogger; + this.container = tsyringe_1.container; + this.logger = this.globalLogger.child({ service: this.constructor.name }); + } + onUnhandledRejection(err, _triggeringPromise) { + this.logger.warn(`Unhandled promise rejection in pid ${process.pid}`, { err }); + } +}; +exports.FinalizerService = FinalizerService; +exports.FinalizerService = FinalizerService = __decorate([ + (0, tsyringe_1.singleton)(), + __metadata("design:paramtypes", [logger_1.GlobalLogger]) +], FinalizerService); +const instance = tsyringe_1.container.resolve(FinalizerService); +exports.Finalizer = instance.decorators().Finalizer; +exports.default = instance; +if (worker_threads_1.isMainThread) { + instance.serviceReady(); +} +//# sourceMappingURL=finalizer.js.map \ No newline at end of file diff --git a/build/services/finalizer.js.map b/build/services/finalizer.js.map new file mode 100644 index 0000000000000000000000000000000000000000..dd7ec25e2598c5976585e5da2f502c6bfebe9c3f --- /dev/null +++ b/build/services/finalizer.js.map @@ -0,0 +1 @@ +{"version":3,"file":"finalizer.js","sourceRoot":"","sources":["../../src/services/finalizer.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,gDAA4D;AAC5D,uCAAgD;AAChD,mDAA8C;AAC9C,qCAAwC;AAExC,MAAM,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;AACrC,OAAO,CAAC,IAAI,GAAG,CAAC,CAAC,IAAa,EAAE,EAAE;IAC9B,IAAI,6BAAY,EAAE,CAAC;QACf,OAAO;IACX,CAAC;IACD,OAAO,eAAe,CAAC,IAAI,CAAC,CAAC;AACjC,CAAC,CAAwB,CAAC;AAGnB,IAAM,gBAAgB,GAAtB,MAAM,gBAAiB,SAAQ,oCAAwB;IAKjD,WAAW,CAAC,IAAyC;QAC1D,OAAO,eAAe,CAAC,IAAI,CAAC,CAAC;IACjC,CAAC;IAED,YAAsB,YAA0B;QAC5C,KAAK,CAAC,GAAG,SAAS,CAAC,CAAC;QADF,iBAAY,GAAZ,YAAY,CAAc;QAPhD,cAAS,GAAG,oBAAS,CAAC;QACtB,WAAM,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC;IAQrE,CAAC;IAEQ,oBAAoB,CAAC,GAAY,EAAE,kBAAoC;QAC5E,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,sCAAsC,OAAO,CAAC,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;IACnF,CAAC;CACJ,CAAA;AAhBY,4CAAgB;2BAAhB,gBAAgB;IAD5B,IAAA,oBAAS,GAAE;qCAU4B,qBAAY;GATvC,gBAAgB,CAgB5B;AAED,MAAM,QAAQ,GAAG,oBAAS,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;AACtC,iBAAS,GAAK,QAAQ,CAAC,UAAU,EAAE,WAAC;AACnD,kBAAe,QAAQ,CAAC;AAExB,IAAI,6BAAY,EAAE,CAAC;IACf,QAAQ,CAAC,YAAY,EAAE,CAAC;AAC5B,CAAC"} \ No newline at end of file diff --git a/build/services/geoip.js b/build/services/geoip.js new file mode 100644 index 0000000000000000000000000000000000000000..de4970d10100c695fbc025fb8223e33afb38b098 --- /dev/null +++ b/build/services/geoip.js @@ -0,0 +1,156 @@ +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.GeoIPService = exports.GeoIPCityResponse = exports.GeoIPCountryInfo = exports.GeoIPInfo = exports.GEOIP_SUPPORTED_LANGUAGES = void 0; +const tsyringe_1 = require("tsyringe"); +const promises_1 = __importDefault(require("fs/promises")); +const maxmind_1 = require("maxmind"); +const civkit_1 = require("civkit"); +const logger_1 = require("./logger"); +const path_1 = __importDefault(require("path")); +const threaded_1 = require("./threaded"); +var GEOIP_SUPPORTED_LANGUAGES; +(function (GEOIP_SUPPORTED_LANGUAGES) { + GEOIP_SUPPORTED_LANGUAGES["EN"] = "en"; + GEOIP_SUPPORTED_LANGUAGES["ZH_CN"] = "zh-CN"; + GEOIP_SUPPORTED_LANGUAGES["JA"] = "ja"; + GEOIP_SUPPORTED_LANGUAGES["DE"] = "de"; + GEOIP_SUPPORTED_LANGUAGES["FR"] = "fr"; + GEOIP_SUPPORTED_LANGUAGES["ES"] = "es"; + GEOIP_SUPPORTED_LANGUAGES["PT_BR"] = "pt-BR"; + GEOIP_SUPPORTED_LANGUAGES["RU"] = "ru"; +})(GEOIP_SUPPORTED_LANGUAGES || (exports.GEOIP_SUPPORTED_LANGUAGES = GEOIP_SUPPORTED_LANGUAGES = {})); +class GeoIPInfo extends civkit_1.AutoCastable { +} +exports.GeoIPInfo = GeoIPInfo; +__decorate([ + (0, civkit_1.Prop)(), + __metadata("design:type", String) +], GeoIPInfo.prototype, "code", void 0); +__decorate([ + (0, civkit_1.Prop)(), + __metadata("design:type", String) +], GeoIPInfo.prototype, "name", void 0); +class GeoIPCountryInfo extends GeoIPInfo { +} +exports.GeoIPCountryInfo = GeoIPCountryInfo; +__decorate([ + (0, civkit_1.Prop)(), + __metadata("design:type", Boolean) +], GeoIPCountryInfo.prototype, "eu", void 0); +class GeoIPCityResponse extends civkit_1.AutoCastable { +} +exports.GeoIPCityResponse = GeoIPCityResponse; +__decorate([ + (0, civkit_1.Prop)(), + __metadata("design:type", GeoIPInfo) +], GeoIPCityResponse.prototype, "continent", void 0); +__decorate([ + (0, civkit_1.Prop)(), + __metadata("design:type", GeoIPCountryInfo) +], GeoIPCityResponse.prototype, "country", void 0); +__decorate([ + (0, civkit_1.Prop)({ + arrayOf: GeoIPInfo + }), + __metadata("design:type", Array) +], GeoIPCityResponse.prototype, "subdivisions", void 0); +__decorate([ + (0, civkit_1.Prop)(), + __metadata("design:type", String) +], GeoIPCityResponse.prototype, "city", void 0); +__decorate([ + (0, civkit_1.Prop)({ + arrayOf: Number + }), + __metadata("design:type", Array) +], GeoIPCityResponse.prototype, "coordinates", void 0); +__decorate([ + (0, civkit_1.Prop)(), + __metadata("design:type", String) +], GeoIPCityResponse.prototype, "timezone", void 0); +let GeoIPService = class GeoIPService extends civkit_1.AsyncService { + constructor(globalLogger) { + super(...arguments); + this.globalLogger = globalLogger; + this.logger = this.globalLogger.child({ service: this.constructor.name }); + } + async init() { + await this.dependencyReady(); + this.emit('ready'); + } + async _lazyload() { + const mmdpPath = path_1.default.resolve(__dirname, '..', '..', 'licensed', 'GeoLite2-City.mmdb'); + const dbBuff = await promises_1.default.readFile(mmdpPath, { flag: 'r', encoding: null }); + this.mmdbCity = new maxmind_1.Reader(dbBuff); + this.logger.info(`Loaded GeoIP database, ${dbBuff.byteLength} bytes`); + } + async lookupCity(ip, lang = GEOIP_SUPPORTED_LANGUAGES.EN) { + await this._lazyload(); + const r = this.mmdbCity.get(ip); + if (!r) { + return undefined; + } + return GeoIPCityResponse.from({ + continent: r.continent ? { + code: r.continent?.code, + name: r.continent?.names?.[lang] || r.continent?.names?.en, + } : undefined, + country: r.country ? { + code: r.country?.iso_code, + name: r.country?.names?.[lang] || r.country?.names.en, + eu: r.country?.is_in_european_union, + } : undefined, + city: r.city?.names?.[lang] || r.city?.names?.en, + subdivisions: r.subdivisions?.map((x) => ({ + code: x.iso_code, + name: x.names?.[lang] || x.names?.en, + })), + coordinates: r.location ? [ + r.location.latitude, r.location.longitude, r.location.accuracy_radius + ] : undefined, + timezone: r.location?.time_zone, + }); + } + async lookupCities(ips, lang = GEOIP_SUPPORTED_LANGUAGES.EN) { + const r = (await Promise.all(ips.map((ip) => this.lookupCity(ip, lang)))).filter(Boolean); + return r; + } +}; +exports.GeoIPService = GeoIPService; +__decorate([ + (0, civkit_1.runOnce)(), + __metadata("design:type", Function), + __metadata("design:paramtypes", []), + __metadata("design:returntype", Promise) +], GeoIPService.prototype, "_lazyload", null); +__decorate([ + (0, threaded_1.Threaded)(), + __metadata("design:type", Function), + __metadata("design:paramtypes", [String, String]), + __metadata("design:returntype", Promise) +], GeoIPService.prototype, "lookupCity", null); +__decorate([ + (0, threaded_1.Threaded)(), + __metadata("design:type", Function), + __metadata("design:paramtypes", [Array, String]), + __metadata("design:returntype", Promise) +], GeoIPService.prototype, "lookupCities", null); +exports.GeoIPService = GeoIPService = __decorate([ + (0, tsyringe_1.singleton)(), + __metadata("design:paramtypes", [logger_1.GlobalLogger]) +], GeoIPService); +const instance = tsyringe_1.container.resolve(GeoIPService); +exports.default = instance; +//# sourceMappingURL=geoip.js.map \ No newline at end of file diff --git a/build/services/geoip.js.map b/build/services/geoip.js.map new file mode 100644 index 0000000000000000000000000000000000000000..cd5213c7ffbc4f4e4dca9cd2b6d039a53c83911e --- /dev/null +++ b/build/services/geoip.js.map @@ -0,0 +1 @@ +{"version":3,"file":"geoip.js","sourceRoot":"","sources":["../../src/services/geoip.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/build/services/jsdom.js b/build/services/jsdom.js new file mode 100644 index 0000000000000000000000000000000000000000..b8b9d3db1706f0d122db0c0a262ce9df5ac76b35 --- /dev/null +++ b/build/services/jsdom.js @@ -0,0 +1,383 @@ +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.JSDomControl = void 0; +const tsyringe_1 = require("tsyringe"); +const logger_1 = require("./logger"); +const readability_1 = require("@mozilla/readability"); +const threaded_1 = require("../services/threaded"); +const tailwind_classes_1 = require("../utils/tailwind-classes"); +const openai_1 = require("../shared/utils/openai"); +const async_service_1 = require("civkit/async-service"); +const civ_rpc_1 = require("civkit/civ-rpc"); +const pLinkedom = import('linkedom'); +let JSDomControl = class JSDomControl extends async_service_1.AsyncService { + constructor(globalLogger) { + super(...arguments); + this.globalLogger = globalLogger; + this.logger = this.globalLogger.child({ service: this.constructor.name }); + } + async init() { + await this.dependencyReady(); + this.linkedom = await pLinkedom; + this.emit('ready'); + } + async narrowSnapshot(snapshot, options) { + if (snapshot?.parsed && !options?.targetSelector && !options?.removeSelector && !options?.withIframe && !options?.withShadowDom) { + return snapshot; + } + if (!snapshot?.html) { + return snapshot; + } + try { + // SideLoad contains native objects that cannot go through thread boundaries. + return await this.actualNarrowSnapshot(snapshot, { ...options, sideLoad: undefined }); + } + catch (err) { + this.logger.warn(`Error narrowing snapshot`, { err }); + if (err instanceof civ_rpc_1.ApplicationError) { + throw err; + } + throw new civ_rpc_1.AssertionFailureError(`Failed to process the page: ${err?.message}`); + } + } + async actualNarrowSnapshot(snapshot, options) { + const t0 = Date.now(); + let sourceHTML = snapshot.html; + if (options?.withShadowDom && snapshot.shadowExpanded) { + sourceHTML = snapshot.shadowExpanded; + } + let jsdom = this.linkedom.parseHTML(sourceHTML); + if (!jsdom.window.document.documentElement) { + jsdom = this.linkedom.parseHTML(`${sourceHTML}`); + } + const allNodes = []; + jsdom.window.document.querySelectorAll('svg').forEach((x) => x.innerHTML = ''); + if (options?.withIframe) { + jsdom.window.document.querySelectorAll('iframe[src],frame[src]').forEach((x) => { + const src = x.getAttribute('src'); + const thisSnapshot = snapshot.childFrames?.find((f) => f.href === src); + if (options?.withIframe === 'quoted') { + const blockquoteElem = jsdom.window.document.createElement('blockquote'); + const preElem = jsdom.window.document.createElement('pre'); + preElem.innerHTML = thisSnapshot?.text || ''; + blockquoteElem.appendChild(preElem); + x.replaceWith(blockquoteElem); + } + else if (thisSnapshot?.html) { + x.innerHTML = thisSnapshot.html; + x.querySelectorAll('script, style').forEach((s) => s.remove()); + if (src) { + x.querySelectorAll('[src]').forEach((el) => { + const imgSrc = el.getAttribute('src'); + if (URL.canParse(imgSrc, src)) { + el.setAttribute('src', new URL(imgSrc, src).toString()); + } + }); + x.querySelectorAll('[href]').forEach((el) => { + const linkHref = el.getAttribute('href'); + if (URL.canParse(linkHref, src)) { + el.setAttribute('href', new URL(linkHref, src).toString()); + } + }); + } + } + }); + } + if (Array.isArray(options?.removeSelector)) { + for (const rl of options.removeSelector) { + jsdom.window.document.querySelectorAll(rl).forEach((x) => x.remove()); + } + } + else if (options?.removeSelector) { + jsdom.window.document.querySelectorAll(options.removeSelector).forEach((x) => x.remove()); + } + let bewareTargetContentDoesNotExist = false; + if (Array.isArray(options?.targetSelector)) { + bewareTargetContentDoesNotExist = true; + for (const x of options.targetSelector.map((x) => jsdom.window.document.querySelectorAll(x))) { + x.forEach((el) => { + if (!allNodes.includes(el)) { + allNodes.push(el); + } + }); + } + } + else if (options?.targetSelector) { + bewareTargetContentDoesNotExist = true; + jsdom.window.document.querySelectorAll(options.targetSelector).forEach((el) => { + if (!allNodes.includes(el)) { + allNodes.push(el); + } + }); + } + else { + allNodes.push(jsdom.window.document); + } + if (!allNodes.length) { + if (bewareTargetContentDoesNotExist) { + return undefined; + } + return snapshot; + } + const textNodes = []; + let rootDoc; + if (allNodes.length === 1 && allNodes[0].nodeName === '#document' && allNodes[0].documentElement) { + rootDoc = allNodes[0]; + if (rootDoc.body?.innerText) { + textNodes.push(rootDoc.body); + } + } + else { + rootDoc = this.linkedom.parseHTML('').window.document; + for (const n of allNodes) { + rootDoc.body.appendChild(n); + rootDoc.body.appendChild(rootDoc.createTextNode('\n\n')); + if (n.innerText) { + textNodes.push(n); + } + } + } + const textChunks = textNodes.map((x) => { + const clone = x.cloneNode(true); + clone.querySelectorAll('script,style,link,svg').forEach((s) => s.remove()); + return clone.innerText; + }); + let parsed; + try { + parsed = new readability_1.Readability(rootDoc.cloneNode(true)).parse(); + } + catch (err) { + this.logger.warn(`Failed to parse selected element`, { err }); + } + const imgSet = new Set(); + const rebuiltImgs = []; + Array.from(rootDoc.querySelectorAll('img[src],img[data-src]')) + .map((x) => [x.getAttribute('src'), x.getAttribute('data-src'), x.getAttribute('alt')]) + .forEach(([u1, u2, alt]) => { + let absUrl; + if (u1) { + try { + const u1Txt = new URL(u1, snapshot.rebase || snapshot.href).toString(); + imgSet.add(u1Txt); + absUrl = u1Txt; + } + catch (err) { + // void 0; + } + } + if (u2) { + try { + const u2Txt = new URL(u2, snapshot.rebase || snapshot.href).toString(); + imgSet.add(u2Txt); + absUrl = u2Txt; + } + catch (err) { + // void 0; + } + } + if (absUrl) { + rebuiltImgs.push({ + src: absUrl, + alt + }); + } + }); + const r = { + ...snapshot, + title: snapshot.title || jsdom.window.document.title, + description: snapshot.description || + (jsdom.window.document.head?.querySelector('meta[name="description"]')?.getAttribute('content') ?? ''), + parsed, + html: rootDoc.documentElement.outerHTML, + text: textChunks.join('\n'), + imgs: (snapshot.imgs || rebuiltImgs)?.filter((x) => imgSet.has(x.src)) || [], + }; + const dt = Date.now() - t0; + if (dt > 1000) { + this.logger.warn(`Performance issue: Narrowing snapshot took ${dt}ms`, { url: snapshot.href, dt }); + } + return r; + } + async inferSnapshot(snapshot) { + const t0 = Date.now(); + const extendedSnapshot = { ...snapshot }; + try { + const jsdom = this.linkedom.parseHTML(snapshot.html); + jsdom.window.document.querySelectorAll('svg').forEach((x) => x.innerHTML = ''); + const links = Array.from(jsdom.window.document.querySelectorAll('a[href]')) + .map((x) => [x.textContent.replace(/\s+/g, ' ').trim(), x.getAttribute('href'),]) + .map(([text, href]) => { + if (!href) { + return undefined; + } + try { + const parsed = new URL(href, snapshot.rebase || snapshot.href); + return [text, parsed.toString()]; + } + catch (err) { + return undefined; + } + }) + .filter(Boolean); + extendedSnapshot.links = links; + const imgs = Array.from(jsdom.window.document.querySelectorAll('img[src],img[data-src]')) + .map((x) => { + let linkPreferredSrc = x.getAttribute('src') || ''; + if (linkPreferredSrc.startsWith('data:')) { + const dataSrc = x.getAttribute('data-src') || ''; + if (dataSrc && !dataSrc.startsWith('data:')) { + linkPreferredSrc = dataSrc; + } + } + return { + src: new URL(linkPreferredSrc, snapshot.rebase || snapshot.href).toString(), + width: parseInt(x.getAttribute('width') || '0'), + height: parseInt(x.getAttribute('height') || '0'), + alt: x.getAttribute('alt') || x.getAttribute('title'), + }; + }); + extendedSnapshot.imgs = imgs; + } + catch (_err) { + void 0; + } + const dt = Date.now() - t0; + if (dt > 1000) { + this.logger.warn(`Performance issue: Inferring snapshot took ${dt}ms`, { url: snapshot.href, dt }); + } + return extendedSnapshot; + } + cleanRedundantEmptyLines(text) { + const lines = text.split(/\r?\n/g); + const mappedFlag = lines.map((line) => Boolean(line.trim())); + return lines.filter((_line, i) => mappedFlag[i] || mappedFlag[i - 1]).join('\n'); + } + async cleanHTMLforLMs(sourceHTML, ...discardSelectors) { + const t0 = Date.now(); + let jsdom = this.linkedom.parseHTML(sourceHTML); + if (!jsdom.window.document.documentElement) { + jsdom = this.linkedom.parseHTML(`${sourceHTML}`); + } + for (const rl of discardSelectors) { + jsdom.window.document.querySelectorAll(rl).forEach((x) => x.remove()); + } + jsdom.window.document.querySelectorAll('img[src],img[data-src]').forEach((x) => { + const src = x.getAttribute('src') || x.getAttribute('data-src'); + if (src?.startsWith('data:')) { + x.setAttribute('src', 'blob:opaque'); + } + x.removeAttribute('data-src'); + x.removeAttribute('srcset'); + }); + jsdom.window.document.querySelectorAll('[class]').forEach((x) => { + const classes = x.getAttribute('class')?.split(/\s+/g) || []; + const newClasses = classes.filter((c) => !tailwind_classes_1.tailwindClasses.has(c)); + x.setAttribute('class', newClasses.join(' ')); + }); + jsdom.window.document.querySelectorAll('[style]').forEach((x) => { + const style = x.getAttribute('style')?.toLocaleLowerCase() || ''; + if (style.startsWith('display: none')) { + return; + } + x.removeAttribute('style'); + }); + const treeWalker = jsdom.window.document.createTreeWalker(jsdom.window.document, // Start from the root document + 0x80 // Only show comment nodes + ); + let currentNode; + while ((currentNode = treeWalker.nextNode())) { + currentNode.parentNode?.removeChild(currentNode); // Remove each comment node + } + jsdom.window.document.querySelectorAll('*').forEach((x) => { + const attrs = x.getAttributeNames(); + for (const attr of attrs) { + if (attr.startsWith('data-') || attr.startsWith('aria-')) { + x.removeAttribute(attr); + } + } + }); + const final = this.cleanRedundantEmptyLines(jsdom.window.document.documentElement.outerHTML); + const dt = Date.now() - t0; + if (dt > 1000) { + this.logger.warn(`Performance issue: Cleaning HTML for LMs took ${dt}ms`, { dt }); + } + return final; + } + snippetToElement(snippet, url) { + const parsed = this.linkedom.parseHTML(snippet || ''); + // Hack for turndown gfm table plugin. + parsed.window.document.querySelectorAll('table').forEach((x) => { + Object.defineProperty(x, 'rows', { value: Array.from(x.querySelectorAll('tr')), enumerable: true }); + }); + Object.defineProperty(parsed.window.document.documentElement, 'cloneNode', { + value: function () { return this; }, + }); + return parsed.window.document.documentElement; + } + runTurndown(turndownService, html) { + const t0 = Date.now(); + try { + return turndownService.turndown(html); + } + finally { + const dt = Date.now() - t0; + if (dt > 1000) { + this.logger.warn(`Performance issue: Turndown took ${dt}ms`, { dt }); + } + } + } + async analyzeHTMLTextLite(sourceHTML) { + let jsdom = this.linkedom.parseHTML(sourceHTML); + if (!jsdom.window.document.documentElement) { + jsdom = this.linkedom.parseHTML(`${sourceHTML}`); + } + jsdom.window.document.querySelectorAll('script,style,link,svg').forEach((s) => s.remove()); + const text = jsdom.window.document.body.innerText || ''; + return { + title: jsdom.window.document.title, + text, + tokens: (0, openai_1.countGPTToken)(text.replaceAll(/[\s\r\n\t]+/g, ' ')), + }; + } +}; +exports.JSDomControl = JSDomControl; +__decorate([ + (0, threaded_1.Threaded)(), + __metadata("design:type", Function), + __metadata("design:paramtypes", [Object, Object]), + __metadata("design:returntype", Promise) +], JSDomControl.prototype, "actualNarrowSnapshot", null); +__decorate([ + (0, threaded_1.Threaded)(), + __metadata("design:type", Function), + __metadata("design:paramtypes", [Object]), + __metadata("design:returntype", Promise) +], JSDomControl.prototype, "inferSnapshot", null); +__decorate([ + (0, threaded_1.Threaded)(), + __metadata("design:type", Function), + __metadata("design:paramtypes", [String, String]), + __metadata("design:returntype", Promise) +], JSDomControl.prototype, "cleanHTMLforLMs", null); +__decorate([ + (0, threaded_1.Threaded)(), + __metadata("design:type", Function), + __metadata("design:paramtypes", [String]), + __metadata("design:returntype", Promise) +], JSDomControl.prototype, "analyzeHTMLTextLite", null); +exports.JSDomControl = JSDomControl = __decorate([ + (0, tsyringe_1.singleton)(), + __metadata("design:paramtypes", [logger_1.GlobalLogger]) +], JSDomControl); +const jsdomControl = tsyringe_1.container.resolve(JSDomControl); +exports.default = jsdomControl; +//# sourceMappingURL=jsdom.js.map \ No newline at end of file diff --git a/build/services/jsdom.js.map b/build/services/jsdom.js.map new file mode 100644 index 0000000000000000000000000000000000000000..15f0688c26a24b06febcaafb2dfb30027381b4e9 --- /dev/null +++ b/build/services/jsdom.js.map @@ -0,0 +1 @@ +{"version":3,"file":"jsdom.js","sourceRoot":"","sources":["../../src/services/jsdom.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/build/services/lm.js b/build/services/lm.js new file mode 100644 index 0000000000000000000000000000000000000000..7788e5389a76adf4aa84104cdfe257fece64df87 --- /dev/null +++ b/build/services/lm.js @@ -0,0 +1,140 @@ +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var _a; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.LmControl = void 0; +const async_service_1 = require("civkit/async-service"); +const tsyringe_1 = require("tsyringe"); +const logger_1 = require("./logger"); +const civkit_1 = require("civkit"); +const common_llm_1 = require("../shared/services/common-llm"); +const jsdom_1 = require("./jsdom"); +const tripleBackTick = '```'; +let LmControl = class LmControl extends async_service_1.AsyncService { + constructor(globalLogger, commonLLM, jsdomControl) { + super(...arguments); + this.globalLogger = globalLogger; + this.commonLLM = commonLLM; + this.jsdomControl = jsdomControl; + this.logger = this.globalLogger.child({ service: this.constructor.name }); + } + async init() { + await this.dependencyReady(); + this.emit('ready'); + } + async *geminiFromBrowserSnapshot(snapshot) { + const pageshot = snapshot?.pageshotUrl || snapshot?.pageshot; + if (!pageshot) { + throw new civkit_1.AssertionFailureError('Screenshot of the page is not available'); + } + const html = await this.jsdomControl.cleanHTMLforLMs(snapshot.html, 'script,link,style,textarea,select>option,svg'); + const it = this.commonLLM.iterRun('vertex-gemini-1.5-flash-002', { + prompt: [ + `HTML: \n${html}\n\nSCREENSHOT: \n`, + typeof pageshot === 'string' ? new URL(pageshot) : pageshot, + `Convert this webpage into a markdown source file that does not contain HTML tags, retaining the page language and visual structures.`, + ], + options: { + system: 'You are ReaderLM-v7, a model that generates Markdown source files only. No HTML, notes and chit-chats allowed', + stream: true + } + }); + const chunks = []; + for await (const txt of it) { + chunks.push(txt); + const output = { + ...snapshot, + parsed: { + ...snapshot?.parsed, + textContent: chunks.join(''), + } + }; + yield output; + } + return; + } + async *readerLMMarkdownFromSnapshot(snapshot) { + if (!snapshot) { + throw new civkit_1.AssertionFailureError('Snapshot of the page is not available'); + } + const html = await this.jsdomControl.cleanHTMLforLMs(snapshot.html, 'script,link,style,textarea,select>option,svg'); + const it = this.commonLLM.iterRun('readerlm-v2', { + prompt: `Extract the main content from the given HTML and convert it to Markdown format.\n\n${tripleBackTick}html\n${html}\n${tripleBackTick}\n`, + options: { + // system: 'You are an AI assistant developed by VENDOR_NAME', + stream: true, + modelSpecific: { + top_k: 1, + temperature: 0, + repetition_penalty: 1.13, + presence_penalty: 0.25, + frequency_penalty: 0.25, + max_tokens: 8192, + } + }, + maxTry: 1, + }); + const chunks = []; + for await (const txt of it) { + chunks.push(txt); + const output = { + ...snapshot, + parsed: { + ...snapshot?.parsed, + textContent: chunks.join(''), + } + }; + yield output; + } + return; + } + async *readerLMFromSnapshot(schema, instruction = 'Infer useful information from the HTML and present it in a structured JSON object.', snapshot) { + if (!snapshot) { + throw new civkit_1.AssertionFailureError('Snapshot of the page is not available'); + } + const html = await this.jsdomControl.cleanHTMLforLMs(snapshot.html, 'script,link,style,textarea,select>option,svg'); + const it = this.commonLLM.iterRun('readerlm-v2', { + prompt: `${instruction}\n\n${tripleBackTick}html\n${html}\n${tripleBackTick}\n${schema ? `The JSON schema:\n${tripleBackTick}json\n${schema}\n${tripleBackTick}\n` : ''}`, + options: { + // system: 'You are an AI assistant developed by VENDOR_NAME', + stream: true, + modelSpecific: { + top_k: 1, + temperature: 0, + repetition_penalty: 1.13, + presence_penalty: 0.25, + frequency_penalty: 0.25, + max_tokens: 8192, + } + }, + maxTry: 1, + }); + const chunks = []; + for await (const txt of it) { + chunks.push(txt); + const output = { + ...snapshot, + parsed: { + ...snapshot?.parsed, + textContent: chunks.join(''), + } + }; + yield output; + } + return; + } +}; +exports.LmControl = LmControl; +exports.LmControl = LmControl = __decorate([ + (0, tsyringe_1.singleton)(), + __metadata("design:paramtypes", [logger_1.GlobalLogger, typeof (_a = typeof common_llm_1.LLMManager !== "undefined" && common_llm_1.LLMManager) === "function" ? _a : Object, jsdom_1.JSDomControl]) +], LmControl); +//# sourceMappingURL=lm.js.map \ No newline at end of file diff --git a/build/services/lm.js.map b/build/services/lm.js.map new file mode 100644 index 0000000000000000000000000000000000000000..da14f7decaf154affc5265b2ea70ac37314ebd99 --- /dev/null +++ b/build/services/lm.js.map @@ -0,0 +1 @@ +{"version":3,"file":"lm.js","sourceRoot":"","sources":["../../src/services/lm.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/build/services/logger.js b/build/services/logger.js new file mode 100644 index 0000000000000000000000000000000000000000..49562fbc18974b6ee11e28d6b69275a607367481 --- /dev/null +++ b/build/services/logger.js @@ -0,0 +1,66 @@ +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.GlobalLogger = void 0; +const pino_logger_1 = require("civkit/pino-logger"); +const tsyringe_1 = require("tsyringe"); +const node_worker_threads_1 = require("node:worker_threads"); +const async_context_1 = require("civkit/async-context"); +const levelToSeverityMap = { + trace: 'DEFAULT', + debug: 'DEBUG', + info: 'INFO', + warn: 'WARNING', + error: 'ERROR', + fatal: 'CRITICAL', +}; +let GlobalLogger = class GlobalLogger extends pino_logger_1.AbstractPinoLogger { + constructor() { + super(...arguments); + this.loggerOptions = { + level: 'debug', + base: { + tid: node_worker_threads_1.threadId, + } + }; + } + init() { + if (process.env['NODE_ENV']?.startsWith('prod')) { + super.init(process.stdout); + } + else { + const PinoPretty = require('pino-pretty').PinoPretty; + super.init(PinoPretty({ + singleLine: true, + colorize: true, + messageFormat(log, messageKey) { + return `${log['tid'] ? `[${log['tid']}]` : ''}[${log['service'] || 'ROOT'}] ${log[messageKey]}`; + }, + })); + } + this.emit('ready'); + } + log(...args) { + const [levelObj, ...rest] = args; + const severity = levelToSeverityMap[levelObj?.level]; + const traceCtx = (0, async_context_1.getTraceCtx)(); + const patched = { ...levelObj, severity }; + const traceId = traceCtx?.googleTraceId || traceCtx?.traceId; + if (traceId && process.env['GCLOUD_PROJECT']) { + patched['logging.googleapis.com/trace'] = `projects/${process.env['GCLOUD_PROJECT']}/traces/${traceId}`; + } + return super.log(patched, ...rest); + } +}; +exports.GlobalLogger = GlobalLogger; +exports.GlobalLogger = GlobalLogger = __decorate([ + (0, tsyringe_1.singleton)() +], GlobalLogger); +const instance = tsyringe_1.container.resolve(GlobalLogger); +exports.default = instance; +//# sourceMappingURL=logger.js.map \ No newline at end of file diff --git a/build/services/logger.js.map b/build/services/logger.js.map new file mode 100644 index 0000000000000000000000000000000000000000..7951cf1b2a9a2f781854cde34459413956705103 --- /dev/null +++ b/build/services/logger.js.map @@ -0,0 +1 @@ +{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/services/logger.ts"],"names":[],"mappings":";;;;;;;;;AAAA,oDAAwD;AACxD,uCAAgD;AAChD,6DAA+C;AAC/C,wDAAmD;AAGnD,MAAM,kBAAkB,GAAyC;IAC7D,KAAK,EAAE,SAAS;IAChB,KAAK,EAAE,OAAO;IACd,IAAI,EAAE,MAAM;IACZ,IAAI,EAAE,SAAS;IACf,KAAK,EAAE,OAAO;IACd,KAAK,EAAE,UAAU;CACpB,CAAC;AAGK,IAAM,YAAY,GAAlB,MAAM,YAAa,SAAQ,gCAAkB;IAA7C;;QACH,kBAAa,GAAG;YACZ,KAAK,EAAE,OAAO;YACd,IAAI,EAAE;gBACF,GAAG,EAAE,8BAAQ;aAChB;SACJ,CAAC;IA+BN,CAAC;IA7BY,IAAI;QACT,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;YAC9C,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAC/B,CAAC;aAAM,CAAC;YACJ,MAAM,UAAU,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC,UAAU,CAAC;YACrD,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC;gBAClB,UAAU,EAAE,IAAI;gBAChB,QAAQ,EAAE,IAAI;gBACd,aAAa,CAAC,GAAQ,EAAE,UAAe;oBACnC,OAAO,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,GAAG,CAAC,SAAS,CAAC,IAAI,MAAM,KAAK,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;gBACpG,CAAC;aACJ,CAAC,CAAC,CAAC;QACR,CAAC;QAGD,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACvB,CAAC;IAEQ,GAAG,CAAC,GAAG,IAAW;QACvB,MAAM,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;QACjC,MAAM,QAAQ,GAAG,kBAAkB,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QACrD,MAAM,QAAQ,GAAG,IAAA,2BAAW,GAAE,CAAC;QAC/B,MAAM,OAAO,GAAO,EAAE,GAAG,QAAQ,EAAE,QAAQ,EAAE,CAAC;QAC9C,MAAM,OAAO,GAAG,QAAQ,EAAE,aAAa,IAAI,QAAQ,EAAE,OAAO,CAAC;QAC7D,IAAI,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,EAAE,CAAC;YAC3C,OAAO,CAAC,8BAA8B,CAAC,GAAG,YAAY,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,WAAW,OAAO,EAAE,CAAC;QAC5G,CAAC;QACD,OAAO,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,CAAC;IACvC,CAAC;CACJ,CAAA;AArCY,oCAAY;uBAAZ,YAAY;IADxB,IAAA,oBAAS,GAAE;GACC,YAAY,CAqCxB;AAED,MAAM,QAAQ,GAAG,oBAAS,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;AACjD,kBAAe,QAAQ,CAAC"} \ No newline at end of file diff --git a/build/services/minimal-stealth.js b/build/services/minimal-stealth.js new file mode 100644 index 0000000000000000000000000000000000000000..58ddd48c0eb5998b4062dad3c5d2a094cee73565 --- /dev/null +++ b/build/services/minimal-stealth.js @@ -0,0 +1,544 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.minimalStealth = minimalStealth; +function minimalStealth() { + /** + * A set of shared utility functions specifically for the purpose of modifying native browser APIs without leaving traces. + * + * Meant to be passed down in puppeteer and used in the context of the page (everything in here runs in NodeJS as well as a browser). + * + * Note: If for whatever reason you need to use this outside of `puppeteer-extra`: + * Just remove the `module.exports` statement at the very bottom, the rest can be copy pasted into any browser context. + * + * Alternatively take a look at the `extract-stealth-evasions` package to create a finished bundle which includes these utilities. + * + */ + const utils = {}; + // const toStringRedirects = new WeakMap(); + utils.init = () => { + utils.preloadCache(); + // const handler = { + // apply: function (target, ctx) { + // // This fixes e.g. `HTMLMediaElement.prototype.canPlayType.toString + ""` + // if (ctx === Function.prototype.toString) { + // return utils.makeNativeString('toString'); + // } + // const originalObj = toStringRedirects.get(ctx); + // // `toString` targeted at our proxied Object detected + // if (originalObj) { + // const fallback = () => + // originalObj && originalObj.name + // ? utils.makeNativeString(originalObj.name) + // : utils.makeNativeString(ctx.name); + // // Return the toString representation of our original object if possible + // return originalObj + '' || fallback(); + // } + // if (typeof ctx === 'undefined' || ctx === null) { + // return target.call(ctx); + // } + // // Check if the toString protype of the context is the same as the global prototype, + // // if not indicates that we are doing a check across different windows., e.g. the iframeWithdirect` test case + // const hasSameProto = Object.getPrototypeOf( + // Function.prototype.toString + // ).isPrototypeOf(ctx.toString); // eslint-disable-line no-prototype-builtins + // if (!hasSameProto) { + // // Pass the call on to the local Function.prototype.toString instead + // return ctx.toString(); + // } + // return target.call(ctx); + // } + // }; + // const toStringProxy = new Proxy( + // Function.prototype.toString, + // utils.stripProxyFromErrors(handler) + // ); + // utils.replaceProperty(Function.prototype, 'toString', { + // value: toStringProxy + // }); + }; + /** + * Wraps a JS Proxy Handler and strips it's presence from error stacks, in case the traps throw. + * + * The presence of a JS Proxy can be revealed as it shows up in error stack traces. + * + * @param {object} handler - The JS Proxy handler to wrap + */ + utils.stripProxyFromErrors = (handler = {}) => { + const newHandler = { + setPrototypeOf: function (target, proto) { + if (proto === null) + throw new TypeError('Cannot convert object to primitive value'); + if (Object.getPrototypeOf(target) === Object.getPrototypeOf(proto)) { + throw new TypeError('Cyclic __proto__ value'); + } + return Reflect.setPrototypeOf(target, proto); + } + }; + // We wrap each trap in the handler in a try/catch and modify the error stack if they throw + const traps = Object.getOwnPropertyNames(handler); + traps.forEach(trap => { + newHandler[trap] = function () { + try { + // Forward the call to the defined proxy handler + return handler[trap].call(this, ...(arguments || [])); + } + catch (err) { + // Stack traces differ per browser, we only support chromium based ones currently + if (!err || !err.stack || !err.stack.includes(`at `)) { + throw err; + } + // When something throws within one of our traps the Proxy will show up in error stacks + // An earlier implementation of this code would simply strip lines with a blacklist, + // but it makes sense to be more surgical here and only remove lines related to our Proxy. + // We try to use a known "anchor" line for that and strip it with everything above it. + // If the anchor line cannot be found for some reason we fall back to our blacklist approach. + const stripWithBlacklist = (stack, stripFirstLine = true) => { + const blacklist = [ + `at Reflect.${trap} `, // e.g. Reflect.get or Reflect.apply + `at Object.${trap} `, // e.g. Object.get or Object.apply + `at Object.newHandler. [as ${trap}] ` // caused by this very wrapper :-) + ]; + return (err.stack + .split('\n') + // Always remove the first (file) line in the stack (guaranteed to be our proxy) + .filter((line, index) => !(index === 1 && stripFirstLine)) + // Check if the line starts with one of our blacklisted strings + .filter(line => !blacklist.some(bl => line.trim().startsWith(bl))) + .join('\n')); + }; + const stripWithAnchor = (stack, anchor) => { + const stackArr = stack.split('\n'); + anchor = anchor || `at Object.newHandler. [as ${trap}] `; // Known first Proxy line in chromium + const anchorIndex = stackArr.findIndex(line => line.trim().startsWith(anchor)); + if (anchorIndex === -1) { + return false; // 404, anchor not found + } + // Strip everything from the top until we reach the anchor line + // Note: We're keeping the 1st line (zero index) as it's unrelated (e.g. `TypeError`) + stackArr.splice(1, anchorIndex); + return stackArr.join('\n'); + }; + // Special cases due to our nested toString proxies + err.stack = err.stack.replace('at Object.toString (', 'at Function.toString ('); + if ((err.stack || '').includes('at Function.toString (')) { + err.stack = stripWithBlacklist(err.stack, false); + throw err; + } + // Try using the anchor method, fallback to blacklist if necessary + err.stack = stripWithAnchor(err.stack) || stripWithBlacklist(err.stack); + throw err; // Re-throw our now sanitized error + } + }; + }); + return newHandler; + }; + /** + * Strip error lines from stack traces until (and including) a known line the stack. + * + * @param {object} err - The error to sanitize + * @param {string} anchor - The string the anchor line starts with + */ + utils.stripErrorWithAnchor = (err, anchor) => { + const stackArr = err.stack.split('\n'); + const anchorIndex = stackArr.findIndex(line => line.trim().startsWith(anchor)); + if (anchorIndex === -1) { + return err; // 404, anchor not found + } + // Strip everything from the top until we reach the anchor line (remove anchor line as well) + // Note: We're keeping the 1st line (zero index) as it's unrelated (e.g. `TypeError`) + stackArr.splice(1, anchorIndex); + err.stack = stackArr.join('\n'); + return err; + }; + /** + * Replace the property of an object in a stealthy way. + * + * Note: You also want to work on the prototype of an object most often, + * as you'd otherwise leave traces (e.g. showing up in Object.getOwnPropertyNames(obj)). + * + * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty + * + * @example + * replaceProperty(WebGLRenderingContext.prototype, 'getParameter', { value: "alice" }) + * // or + * replaceProperty(Object.getPrototypeOf(navigator), 'languages', { get: () => ['en-US', 'en'] }) + * + * @param {object} obj - The object which has the property to replace + * @param {string} propName - The property name to replace + * @param {object} descriptorOverrides - e.g. { value: "alice" } + */ + utils.replaceProperty = (obj, propName, descriptorOverrides = {}) => { + return Object.defineProperty(obj, propName, { + // Copy over the existing descriptors (writable, enumerable, configurable, etc) + ...(Object.getOwnPropertyDescriptor(obj, propName) || {}), + // Add our overrides (e.g. value, get()) + ...descriptorOverrides + }); + }; + /** + * Preload a cache of function copies and data. + * + * For a determined enough observer it would be possible to overwrite and sniff usage of functions + * we use in our internal Proxies, to combat that we use a cached copy of those functions. + * + * Note: Whenever we add a `Function.prototype.toString` proxy we should preload the cache before, + * by executing `utils.preloadCache()` before the proxy is applied (so we don't cause recursive lookups). + * + * This is evaluated once per execution context (e.g. window) + */ + utils.preloadCache = () => { + if (utils.cache) { + return; + } + utils.cache = { + // Used in our proxies + Reflect: { + get: Reflect.get.bind(Reflect), + apply: Reflect.apply.bind(Reflect) + }, + // Used in `makeNativeString` + nativeToStringStr: Function.toString + '' // => `function toString() { [native code] }` + }; + }; + /** + * Utility function to generate a cross-browser `toString` result representing native code. + * + * There's small differences: Chromium uses a single line, whereas FF & Webkit uses multiline strings. + * To future-proof this we use an existing native toString result as the basis. + * + * The only advantage we have over the other team is that our JS runs first, hence we cache the result + * of the native toString result once, so they cannot spoof it afterwards and reveal that we're using it. + * + * @example + * makeNativeString('foobar') // => `function foobar() { [native code] }` + * + * @param {string} [name] - Optional function name + */ + utils.makeNativeString = (name = '') => { + return utils.cache.nativeToStringStr.replace('toString', name || ''); + }; + /** + * Helper function to modify the `toString()` result of the provided object. + * + * Note: Use `utils.redirectToString` instead when possible. + * + * There's a quirk in JS Proxies that will cause the `toString()` result to differ from the vanilla Object. + * If no string is provided we will generate a `[native code]` thing based on the name of the property object. + * + * @example + * patchToString(WebGLRenderingContext.prototype.getParameter, 'function getParameter() { [native code] }') + * + * @param {object} obj - The object for which to modify the `toString()` representation + * @param {string} str - Optional string used as a return value + */ + utils.patchToString = (obj, str = '') => { + // toStringRedirects.set(obj, str); + Object.defineProperty(obj, 'toString', { + value: () => str, + enumerable: false, + writable: true, + configurable: true, + }); + }; + /** + * Make all nested functions of an object native. + * + * @param {object} obj + */ + utils.patchToStringNested = (obj = {}) => { + return utils.execRecursively(obj, ['function'], utils.patchToString); + }; + /** + * Redirect toString requests from one object to another. + * + * @param {object} proxyObj - The object that toString will be called on + * @param {object} originalObj - The object which toString result we wan to return + */ + utils.redirectToString = (proxyObj, originalObj) => { + // toStringRedirects.set(proxyObj, originalObj); + Object.defineProperty(proxyObj, 'toString', { + value: () => originalObj.toString(), + enumerable: false, + writable: true, + configurable: true, + }); + }; + /** + * All-in-one method to replace a property with a JS Proxy using the provided Proxy handler with traps. + * + * Will stealthify these aspects (strip error stack traces, redirect toString, etc). + * Note: This is meant to modify native Browser APIs and works best with prototype objects. + * + * @example + * replaceWithProxy(WebGLRenderingContext.prototype, 'getParameter', proxyHandler) + * + * @param {object} obj - The object which has the property to replace + * @param {string} propName - The name of the property to replace + * @param {object} handler - The JS Proxy handler to use + */ + utils.replaceWithProxy = (obj, propName, handler) => { + const originalObj = obj[propName]; + const proxyObj = new Proxy(obj[propName], utils.stripProxyFromErrors(handler)); + utils.replaceProperty(obj, propName, { value: proxyObj }); + utils.redirectToString(proxyObj, originalObj); + return true; + }; + /** + * All-in-one method to replace a getter with a JS Proxy using the provided Proxy handler with traps. + * + * @example + * replaceGetterWithProxy(Object.getPrototypeOf(navigator), 'vendor', proxyHandler) + * + * @param {object} obj - The object which has the property to replace + * @param {string} propName - The name of the property to replace + * @param {object} handler - The JS Proxy handler to use + */ + utils.replaceGetterWithProxy = (obj, propName, handler) => { + const fn = Object.getOwnPropertyDescriptor(obj, propName).get; + const fnStr = fn.toString(); // special getter function string + const proxyObj = new Proxy(fn, utils.stripProxyFromErrors(handler)); + utils.replaceProperty(obj, propName, { get: proxyObj }); + utils.patchToString(proxyObj, fnStr); + return true; + }; + /** + * All-in-one method to replace a getter and/or setter. Functions get and set + * of handler have one more argument that contains the native function. + * + * @example + * replaceGetterSetter(HTMLIFrameElement.prototype, 'contentWindow', handler) + * + * @param {object} obj - The object which has the property to replace + * @param {string} propName - The name of the property to replace + * @param {object} handlerGetterSetter - The handler with get and/or set + * functions + * @see https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty#description + */ + utils.replaceGetterSetter = (obj, propName, handlerGetterSetter) => { + const ownPropertyDescriptor = Object.getOwnPropertyDescriptor(obj, propName); + const handler = { ...ownPropertyDescriptor }; + if (handlerGetterSetter.get !== undefined) { + const nativeFn = ownPropertyDescriptor.get; + handler.get = function () { + return handlerGetterSetter.get.call(this, nativeFn.bind(this)); + }; + utils.redirectToString(handler.get, nativeFn); + } + if (handlerGetterSetter.set !== undefined) { + const nativeFn = ownPropertyDescriptor.set; + handler.set = function (newValue) { + handlerGetterSetter.set.call(this, newValue, nativeFn.bind(this)); + }; + utils.redirectToString(handler.set, nativeFn); + } + Object.defineProperty(obj, propName, handler); + }; + /** + * All-in-one method to mock a non-existing property with a JS Proxy using the provided Proxy handler with traps. + * + * Will stealthify these aspects (strip error stack traces, redirect toString, etc). + * + * @example + * mockWithProxy(chrome.runtime, 'sendMessage', function sendMessage() {}, proxyHandler) + * + * @param {object} obj - The object which has the property to replace + * @param {string} propName - The name of the property to replace or create + * @param {object} pseudoTarget - The JS Proxy target to use as a basis + * @param {object} handler - The JS Proxy handler to use + */ + utils.mockWithProxy = (obj, propName, pseudoTarget, handler) => { + const proxyObj = new Proxy(pseudoTarget, utils.stripProxyFromErrors(handler)); + utils.replaceProperty(obj, propName, { value: proxyObj }); + utils.patchToString(proxyObj); + return true; + }; + /** + * All-in-one method to create a new JS Proxy with stealth tweaks. + * + * This is meant to be used whenever we need a JS Proxy but don't want to replace or mock an existing known property. + * + * Will stealthify certain aspects of the Proxy (strip error stack traces, redirect toString, etc). + * + * @example + * createProxy(navigator.mimeTypes.__proto__.namedItem, proxyHandler) // => Proxy + * + * @param {object} pseudoTarget - The JS Proxy target to use as a basis + * @param {object} handler - The JS Proxy handler to use + */ + utils.createProxy = (pseudoTarget, handler) => { + const proxyObj = new Proxy(pseudoTarget, utils.stripProxyFromErrors(handler)); + utils.patchToString(proxyObj); + return proxyObj; + }; + /** + * Helper function to split a full path to an Object into the first part and property. + * + * @example + * splitObjPath(`HTMLMediaElement.prototype.canPlayType`) + * // => {objName: "HTMLMediaElement.prototype", propName: "canPlayType"} + * + * @param {string} objPath - The full path to an object as dot notation string + */ + utils.splitObjPath = objPath => ({ + // Remove last dot entry (property) ==> `HTMLMediaElement.prototype` + objName: objPath.split('.').slice(0, -1).join('.'), + // Extract last dot entry ==> `canPlayType` + propName: objPath.split('.').slice(-1)[0] + }); + /** + * Convenience method to replace a property with a JS Proxy using the provided objPath. + * + * Supports a full path (dot notation) to the object as string here, in case that makes it easier. + * + * @example + * replaceObjPathWithProxy('WebGLRenderingContext.prototype.getParameter', proxyHandler) + * + * @param {string} objPath - The full path to an object (dot notation string) to replace + * @param {object} handler - The JS Proxy handler to use + */ + utils.replaceObjPathWithProxy = (objPath, handler) => { + const { objName, propName } = utils.splitObjPath(objPath); + const obj = eval(objName); // eslint-disable-line no-eval + return utils.replaceWithProxy(obj, propName, handler); + }; + /** + * Traverse nested properties of an object recursively and apply the given function on a whitelist of value types. + * + * @param {object} obj + * @param {array} typeFilter - e.g. `['function']` + * @param {Function} fn - e.g. `utils.patchToString` + */ + utils.execRecursively = (obj = {}, typeFilter = [], fn) => { + function recurse(obj) { + for (const key in obj) { + if (obj[key] === undefined) { + continue; + } + if (obj[key] && typeof obj[key] === 'object') { + recurse(obj[key]); + } + else { + if (obj[key] && typeFilter.includes(typeof obj[key])) { + fn.call(this, obj[key]); + } + } + } + } + recurse(obj); + return obj; + }; + /** + * Everything we run through e.g. `page.evaluate` runs in the browser context, not the NodeJS one. + * That means we cannot just use reference variables and functions from outside code, we need to pass everything as a parameter. + * + * Unfortunately the data we can pass is only allowed to be of primitive types, regular functions don't survive the built-in serialization process. + * This utility function will take an object with functions and stringify them, so we can pass them down unharmed as strings. + * + * We use this to pass down our utility functions as well as any other functions (to be able to split up code better). + * + * @see utils.materializeFns + * + * @param {object} fnObj - An object containing functions as properties + */ + utils.stringifyFns = (fnObj = { hello: () => 'world' }) => { + // Object.fromEntries() ponyfill (in 6 lines) - supported only in Node v12+, modern browsers are fine + // https://github.com/feross/fromentries + function fromEntries(iterable) { + return [...iterable].reduce((obj, [key, val]) => { + obj[key] = val; + return obj; + }, {}); + } + return (Object.fromEntries || fromEntries)(Object.entries(fnObj) + .filter(([key, value]) => typeof value === 'function') + .map(([key, value]) => [key, value.toString()]) // eslint-disable-line no-eval + ); + }; + /** + * Utility function to reverse the process of `utils.stringifyFns`. + * Will materialize an object with stringified functions (supports classic and fat arrow functions). + * + * @param {object} fnStrObj - An object containing stringified functions as properties + */ + utils.materializeFns = (fnStrObj = { hello: "() => 'world'" }) => { + return Object.fromEntries(Object.entries(fnStrObj).map(([key, value]) => { + if (value.startsWith('function')) { + // some trickery is needed to make oldschool functions work :-) + return [key, eval(`() => ${value}`)()]; // eslint-disable-line no-eval + } + else { + // arrow functions just work + return [key, eval(value)]; // eslint-disable-line no-eval + } + })); + }; + // Proxy handler templates for re-usability + utils.makeHandler = () => ({ + // Used by simple `navigator` getter evasions + getterValue: value => ({ + apply(target, ctx, args) { + // Let's fetch the value first, to trigger and escalate potential errors + // Illegal invocations like `navigator.__proto__.vendor` will throw here + utils.cache.Reflect.apply(...arguments); + return value; + } + }) + }); + /** + * Compare two arrays. + * + * @param {array} array1 - First array + * @param {array} array2 - Second array + */ + utils.arrayEquals = (array1, array2) => { + if (array1.length !== array2.length) { + return false; + } + for (let i = 0; i < array1.length; ++i) { + if (array1[i] !== array2[i]) { + return false; + } + } + return true; + }; + /** + * Cache the method return according to its arguments. + * + * @param {Function} fn - A function that will be cached + */ + utils.memoize = fn => { + const cache = []; + return function (...args) { + if (!cache.some(c => utils.arrayEquals(c.key, args))) { + cache.push({ key: args, value: fn.apply(this, args) }); + } + return cache.find(c => utils.arrayEquals(c.key, args)).value; + }; + }; + utils.init(); + const getParameterProxyHandler = { + apply: function (target, ctx, args) { + const param = (args || [])[0]; + const result = utils.cache.Reflect.apply(target, ctx, args); + // UNMASKED_VENDOR_WEBGL + if (param === 37445) { + return 'Intel Inc.'; // default in headless: Google Inc. + } + // UNMASKED_RENDERER_WEBGL + if (param === 37446) { + return 'Intel Iris OpenGL Engine'; // default in headless: Google SwiftShader + } + return result; + } + }; + // There's more than one WebGL rendering context + // https://developer.mozilla.org/en-US/docs/Web/API/WebGL2RenderingContext#Browser_compatibility + // To find out the original values here: Object.getOwnPropertyDescriptors(WebGLRenderingContext.prototype.getParameter) + const addProxy = (obj, propName) => { + utils.replaceWithProxy(obj, propName, getParameterProxyHandler); + }; + // For whatever weird reason loops don't play nice with Object.defineProperty, here's the next best thing: + addProxy(WebGLRenderingContext.prototype, 'getParameter'); + addProxy(WebGL2RenderingContext.prototype, 'getParameter'); +} +//# sourceMappingURL=minimal-stealth.js.map \ No newline at end of file diff --git a/build/services/minimal-stealth.js.map b/build/services/minimal-stealth.js.map new file mode 100644 index 0000000000000000000000000000000000000000..2264b9f406f108f9060126a90f95c9836646df82 --- /dev/null +++ b/build/services/minimal-stealth.js.map @@ -0,0 +1 @@ +{"version":3,"file":"minimal-stealth.js","sourceRoot":"","sources":["../../src/services/minimal-stealth.js"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/build/services/misc.js b/build/services/misc.js new file mode 100644 index 0000000000000000000000000000000000000000..87fa3b2168c1717682e46b1847d610c09f72c6cb --- /dev/null +++ b/build/services/misc.js @@ -0,0 +1,109 @@ +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.MiscService = void 0; +const tsyringe_1 = require("tsyringe"); +const async_service_1 = require("civkit/async-service"); +const civ_rpc_1 = require("civkit/civ-rpc"); +const errors_1 = require("../shared/lib/errors"); +const node_net_1 = require("node:net"); +const ip_1 = require("../utils/ip"); +const logger_1 = require("./logger"); +const promises_1 = require("node:dns/promises"); +const threaded_1 = require("./threaded"); +const normalizeUrl = require('@esm2cjs/normalize-url').default; +let MiscService = class MiscService extends async_service_1.AsyncService { + constructor(globalLogger) { + super(...arguments); + this.globalLogger = globalLogger; + this.logger = this.globalLogger.child({ service: this.constructor.name }); + } + async init() { + await this.dependencyReady(); + this.emit('ready'); + } + async assertNormalizedUrl(input) { + let result; + try { + result = new URL(normalizeUrl(input, { + stripWWW: false, + removeTrailingSlash: false, + removeSingleSlash: false, + sortQueryParameters: false, + })); + } + catch (err) { + throw new civ_rpc_1.ParamValidationError({ + message: `${err}`, + path: 'url' + }); + } + if (!['http:', 'https:', 'blob:'].includes(result.protocol)) { + throw new civ_rpc_1.ParamValidationError({ + message: `Invalid protocol ${result.protocol}`, + path: 'url' + }); + } + const normalizedHostname = result.hostname.startsWith('[') ? result.hostname.slice(1, -1) : result.hostname; + let ips = []; + const isIp = (0, node_net_1.isIP)(normalizedHostname); + if (isIp) { + ips.push(normalizedHostname); + } + if ((result.hostname === 'localhost') || + (isIp && (0, ip_1.isIPInNonPublicRange)(normalizedHostname))) { + this.logger.warn(`Suspicious action: Request to localhost or non-public IP: ${normalizedHostname}`, { href: result.href }); + throw new errors_1.SecurityCompromiseError({ + message: `Suspicious action: Request to localhost or non-public IP: ${normalizedHostname}`, + path: 'url' + }); + } + if (!isIp && result.protocol !== 'blob:') { + const resolved = await (0, promises_1.lookup)(result.hostname, { all: true }).catch((err) => { + if (err.code === 'ENOTFOUND') { + return Promise.reject(new civ_rpc_1.ParamValidationError({ + message: `Domain '${result.hostname}' could not be resolved`, + path: 'url' + })); + } + return; + }); + if (resolved) { + for (const x of resolved) { + if ((0, ip_1.isIPInNonPublicRange)(x.address)) { + this.logger.warn(`Suspicious action: Domain resolved to non-public IP: ${result.hostname} => ${x.address}`, { href: result.href, ip: x.address }); + throw new errors_1.SecurityCompromiseError({ + message: `Suspicious action: Domain resolved to non-public IP: ${x.address}`, + path: 'url' + }); + } + ips.push(x.address); + } + } + } + return { + url: result, + ips + }; + } +}; +exports.MiscService = MiscService; +__decorate([ + (0, threaded_1.Threaded)(), + __metadata("design:type", Function), + __metadata("design:paramtypes", [String]), + __metadata("design:returntype", Promise) +], MiscService.prototype, "assertNormalizedUrl", null); +exports.MiscService = MiscService = __decorate([ + (0, tsyringe_1.singleton)(), + __metadata("design:paramtypes", [logger_1.GlobalLogger]) +], MiscService); +//# sourceMappingURL=misc.js.map \ No newline at end of file diff --git a/build/services/misc.js.map b/build/services/misc.js.map new file mode 100644 index 0000000000000000000000000000000000000000..9be8a303abca2fb84222f918d4eb0d9cd7c35c41 --- /dev/null +++ b/build/services/misc.js.map @@ -0,0 +1 @@ +{"version":3,"file":"misc.js","sourceRoot":"","sources":["../../src/services/misc.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/build/services/pdf-extract.js b/build/services/pdf-extract.js new file mode 100644 index 0000000000000000000000000000000000000000..6aa0190920f6ccf3454c7d46225710b0d7c7331e --- /dev/null +++ b/build/services/pdf-extract.js @@ -0,0 +1,339 @@ +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.PDFExtractor = void 0; +const tsyringe_1 = require("tsyringe"); +const lodash_1 = __importDefault(require("lodash")); +const civkit_1 = require("civkit"); +const logger_1 = require("./logger"); +const pdf_1 = require("../db/pdf"); +const dayjs_1 = __importDefault(require("dayjs")); +const firebase_storage_bucket_1 = require("../shared/services/firebase-storage-bucket"); +const crypto_1 = require("crypto"); +const path_1 = __importDefault(require("path")); +const async_context_1 = require("./async-context"); +const utc = require('dayjs/plugin/utc'); // Import the UTC plugin +dayjs_1.default.extend(utc); // Extend dayjs with the UTC plugin +const timezone = require('dayjs/plugin/timezone'); +dayjs_1.default.extend(timezone); +const pPdfjs = import('pdfjs-dist/legacy/build/pdf.mjs'); +const nodeCmapUrl = path_1.default.resolve(require.resolve('pdfjs-dist'), '../../cmaps') + '/'; +const md5Hasher = new civkit_1.HashManager('md5', 'hex'); +function stdDev(numbers) { + const mean = lodash_1.default.mean(numbers); + const squareDiffs = numbers.map((num) => Math.pow(num - mean, 2)); + const avgSquareDiff = lodash_1.default.mean(squareDiffs); + return Math.sqrt(avgSquareDiff); +} +function isRotatedByAtLeast35Degrees(transform) { + if (!transform) { + return false; + } + const [a, b, c, d, _e, _f] = transform; + // Calculate the rotation angles using arctan(b/a) and arctan(-c/d) + const angle1 = Math.atan2(b, a) * (180 / Math.PI); // from a, b + const angle2 = Math.atan2(-c, d) * (180 / Math.PI); // from c, d + // Either angle1 or angle2 can be used to determine the rotation, they should be equivalent + const rotationAngle1 = Math.abs(angle1); + const rotationAngle2 = Math.abs(angle2); + // Check if the absolute rotation angle is greater than or equal to 35 degrees + return rotationAngle1 >= 35 || rotationAngle2 >= 35; +} +let PDFExtractor = class PDFExtractor extends civkit_1.AsyncService { + constructor(globalLogger, firebaseObjectStorage, asyncLocalContext) { + super(...arguments); + this.globalLogger = globalLogger; + this.firebaseObjectStorage = firebaseObjectStorage; + this.asyncLocalContext = asyncLocalContext; + this.logger = this.globalLogger.child({ service: this.constructor.name }); + this.cacheRetentionMs = 1000 * 3600 * 24 * 7; + } + async init() { + await this.dependencyReady(); + this.pdfjs = await pPdfjs; + this.emit('ready'); + } + isDataUrl(url) { + return url.startsWith('data:'); + } + parseDataUrl(url) { + const protocol = url.slice(0, url.indexOf(':')); + const contentType = url.slice(url.indexOf(':') + 1, url.indexOf(';')); + const data = url.slice(url.indexOf(',') + 1); + if (protocol !== 'data' || !data) { + throw new Error('Invalid data URL'); + } + if (contentType !== 'application/pdf') { + throw new Error('Invalid data URL type'); + } + return { + type: contentType, + data: data + }; + } + async extract(url) { + let loadingTask; + if (typeof url === 'string' && this.isDataUrl(url)) { + const { data } = this.parseDataUrl(url); + const binary = Uint8Array.from(Buffer.from(data, 'base64')); + loadingTask = this.pdfjs.getDocument({ + data: binary, + disableFontFace: true, + verbosity: 0, + cMapUrl: nodeCmapUrl, + }); + } + else { + loadingTask = this.pdfjs.getDocument({ + url, + disableFontFace: true, + verbosity: 0, + cMapUrl: nodeCmapUrl, + }); + } + const doc = await loadingTask.promise; + const meta = await doc.getMetadata(); + const textItems = []; + for (const pg of lodash_1.default.range(0, doc.numPages)) { + const page = await doc.getPage(pg + 1); + const textContent = await page.getTextContent({ includeMarkedContent: true }); + textItems.push(textContent.items); + } + const articleCharHeights = []; + for (const textItem of textItems.flat()) { + if (textItem.height) { + articleCharHeights.push(...Array(textItem.str.length).fill(textItem.height)); + } + } + const articleAvgHeight = lodash_1.default.mean(articleCharHeights); + const articleStdDevHeight = stdDev(articleCharHeights); + // const articleMedianHeight = articleCharHeights.sort()[Math.floor(articleCharHeights.length / 2)]; + const mdOps = []; + const rawChunks = []; + let op = 'new'; + let mode = 'p'; + for (const pageTextItems of textItems) { + const charHeights = []; + for (const textItem of pageTextItems) { + if (textItem.height) { + charHeights.push(...Array(textItem.str.length).fill(textItem.height)); + } + rawChunks.push(`${textItem.str}${textItem.hasEOL ? '\n' : ''}`); + } + const avgHeight = lodash_1.default.mean(charHeights); + const stdDevHeight = stdDev(charHeights); + // const medianHeight = charHeights.sort()[Math.floor(charHeights.length / 2)]; + for (const textItem of pageTextItems) { + if (textItem.height > articleAvgHeight + 3 * articleStdDevHeight) { + mode = 'h1'; + } + else if (textItem.height > articleAvgHeight + 2 * articleStdDevHeight) { + mode = 'h2'; + } + else if (textItem.height && textItem.height < avgHeight - stdDevHeight) { + mode = 'appendix'; + } + else if (textItem.height) { + mode = 'p'; + } + else { + mode = 'space'; + } + if (isRotatedByAtLeast35Degrees(textItem.transform)) { + mode = 'appendix'; + } + mdOps.push({ + op, + mode, + text: textItem.str + }); + if (textItem.hasEOL && !textItem.str) { + op = 'new'; + } + else { + op = 'append'; + } + } + } + const mdChunks = []; + const appendixChunks = []; + mode = 'space'; + for (const x of mdOps) { + const previousMode = mode; + const changeToMdChunks = []; + const isNewStart = x.mode !== 'space' && (x.op === 'new' || (previousMode === 'appendix' && x.mode !== previousMode)); + if (isNewStart) { + switch (x.mode) { + case 'h1': { + changeToMdChunks.push(`\n\n# `); + mode = x.mode; + break; + } + case 'h2': { + changeToMdChunks.push(`\n\n## `); + mode = x.mode; + break; + } + case 'p': { + changeToMdChunks.push(`\n\n`); + mode = x.mode; + break; + } + case 'appendix': { + mode = x.mode; + appendixChunks.push(`\n\n`); + break; + } + default: { + break; + } + } + } + else { + if (x.mode === 'appendix' && appendixChunks.length) { + const lastChunk = appendixChunks[appendixChunks.length - 1]; + if (!lastChunk.match(/(\s+|-)$/) && lastChunk.length !== 1) { + appendixChunks.push(' '); + } + } + else if (mdChunks.length) { + const lastChunk = mdChunks[mdChunks.length - 1]; + if (!lastChunk.match(/(\s+|-)$/) && lastChunk.length !== 1) { + changeToMdChunks.push(' '); + } + } + } + if (x.text) { + if (x.mode == 'appendix') { + if (appendixChunks.length || isNewStart) { + appendixChunks.push(x.text); + } + else { + changeToMdChunks.push(x.text); + } + } + else { + changeToMdChunks.push(x.text); + } + } + if (isNewStart && x.mode !== 'appendix' && appendixChunks.length) { + const appendix = appendixChunks.join('').split(/\r?\n/).map((x) => x.trim()).filter(Boolean).map((x) => `> ${x}`).join('\n'); + changeToMdChunks.unshift(appendix); + changeToMdChunks.unshift(`\n\n`); + appendixChunks.length = 0; + } + if (x.mode === 'space' && changeToMdChunks.length) { + changeToMdChunks.length = 1; + } + if (changeToMdChunks.length) { + mdChunks.push(...changeToMdChunks); + } + } + if (mdChunks.length) { + mdChunks[0] = mdChunks[0].trimStart(); + } + return { meta: meta.info, content: mdChunks.join(''), text: rawChunks.join('') }; + } + async cachedExtract(url, cacheTolerance = 1000 * 3600 * 24, alternativeUrl) { + if (!url) { + return undefined; + } + let nameUrl = alternativeUrl || url; + const digest = md5Hasher.hash(nameUrl); + if (this.isDataUrl(url)) { + nameUrl = `blob://pdf:${digest}`; + } + const cache = nameUrl.startsWith('blob:') ? undefined : + (await pdf_1.PDFContent.fromFirestoreQuery(pdf_1.PDFContent.COLLECTION.where('urlDigest', '==', digest).orderBy('createdAt', 'desc').limit(1)))?.[0]; + if (cache) { + const age = Date.now() - cache?.createdAt.valueOf(); + const stale = cache.createdAt.valueOf() < (Date.now() - cacheTolerance); + this.logger.info(`${stale ? 'Stale cache exists' : 'Cache hit'} for PDF ${nameUrl}, normalized digest: ${digest}, ${age}ms old, tolerance ${cacheTolerance}ms`, { + data: url, url: nameUrl, digest, age, stale, cacheTolerance + }); + if (!stale) { + if (cache.content && cache.text) { + return { + meta: cache.meta, + content: cache.content, + text: cache.text + }; + } + try { + const r = await this.firebaseObjectStorage.downloadFile(`pdfs/${cache._id}`); + let cached = JSON.parse(r.toString('utf-8')); + return { + meta: cached.meta, + content: cached.content, + text: cached.text + }; + } + catch (err) { + this.logger.warn(`Unable to load cached content for ${nameUrl}`, { err }); + return undefined; + } + } + } + let extracted; + try { + extracted = await this.extract(url); + } + catch (err) { + this.logger.warn(`Unable to extract from pdf ${nameUrl}`, { err, url, nameUrl }); + throw new civkit_1.AssertionFailureError(`Unable to process ${nameUrl} as pdf: ${err?.message}`); + } + if (!this.asyncLocalContext.ctx.DNT && !nameUrl.startsWith('blob:')) { + const theID = (0, crypto_1.randomUUID)(); + await this.firebaseObjectStorage.saveFile(`pdfs/${theID}`, Buffer.from(JSON.stringify(extracted), 'utf-8'), { contentType: 'application/json' }); + pdf_1.PDFContent.save(pdf_1.PDFContent.from({ + _id: theID, + src: nameUrl, + meta: extracted?.meta || {}, + urlDigest: digest, + createdAt: new Date(), + expireAt: new Date(Date.now() + this.cacheRetentionMs) + }).degradeForFireStore()).catch((r) => { + this.logger.warn(`Unable to cache PDF content for ${nameUrl}`, { err: r }); + }); + } + return extracted; + } + parsePdfDate(pdfDate) { + if (!pdfDate) { + return undefined; + } + // Remove the 'D:' prefix + const cleanedDate = pdfDate.slice(2); + // Define the format without the timezone part first + const dateTimePart = cleanedDate.slice(0, 14); + const timezonePart = cleanedDate.slice(14); + // Construct the full date string in a standard format + const formattedDate = `${dateTimePart}${timezonePart.replace("'", "").replace("'", "")}`; + // Parse the date with timezone + const parsedDate = (0, dayjs_1.default)(formattedDate, "YYYYMMDDHHmmssZ"); + const date = parsedDate.toDate(); + if (!date.valueOf()) { + return undefined; + } + return date; + } +}; +exports.PDFExtractor = PDFExtractor; +exports.PDFExtractor = PDFExtractor = __decorate([ + (0, tsyringe_1.singleton)(), + __metadata("design:paramtypes", [logger_1.GlobalLogger, + firebase_storage_bucket_1.FirebaseStorageBucketControl, + async_context_1.AsyncLocalContext]) +], PDFExtractor); +//# sourceMappingURL=pdf-extract.js.map \ No newline at end of file diff --git a/build/services/pdf-extract.js.map b/build/services/pdf-extract.js.map new file mode 100644 index 0000000000000000000000000000000000000000..f08edc452acd0a1b48a353d79b8358d60c2645f6 --- /dev/null +++ b/build/services/pdf-extract.js.map @@ -0,0 +1 @@ +{"version":3,"file":"pdf-extract.js","sourceRoot":"","sources":["../../src/services/pdf-extract.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/build/services/pseudo-transfer.js b/build/services/pseudo-transfer.js new file mode 100644 index 0000000000000000000000000000000000000000..74237c2fea9ce627442ca8d2bc86730d6231a920 --- /dev/null +++ b/build/services/pseudo-transfer.js @@ -0,0 +1,67 @@ +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.PseudoTransfer = void 0; +const civkit_1 = require("civkit"); +const pseudo_transfer_1 = require("civkit/pseudo-transfer"); +const tsyringe_1 = require("tsyringe"); +let PseudoTransfer = class PseudoTransfer extends pseudo_transfer_1.AbstractPseudoTransfer { + async init() { + await this.dependencyReady(); + this.emit('ready'); + } +}; +exports.PseudoTransfer = PseudoTransfer; +exports.PseudoTransfer = PseudoTransfer = __decorate([ + (0, tsyringe_1.singleton)() +], PseudoTransfer); +const instance = tsyringe_1.container.resolve(PseudoTransfer); +Object.defineProperty(Error.prototype, pseudo_transfer_1.SYM_PSEUDO_TRANSFERABLE, { + value: function () { + const prototype = this; + return { + copyOwnProperty: 'all', + marshall: (input) => (0, civkit_1.marshalErrorLike)(input), + unMarshall: (input) => { + Object.setPrototypeOf(input, prototype); + return input; + }, + }; + }, + enumerable: false, +}); +instance.expectPseudoTransferableType(Error); +for (const x of [...Object.values(require('./errors')), ...Object.values(require('civkit/civ-rpc'))]) { + if (typeof x === 'function' && x.prototype instanceof Error) { + instance.expectPseudoTransferableType(x); + } +} +Object.defineProperty(URL.prototype, pseudo_transfer_1.SYM_PSEUDO_TRANSFERABLE, { + value: function () { + return { + copyOwnProperty: 'none', + marshall: (input) => ({ href: input.href }), + unMarshall: (input) => new URL(input.href), + }; + }, + enumerable: false, +}); +instance.expectPseudoTransferableType(URL); +Object.defineProperty(Buffer.prototype, pseudo_transfer_1.SYM_PSEUDO_TRANSFERABLE, { + value: function () { + return { + copyOwnProperty: 'none', + unMarshall: (input) => Buffer.isBuffer(input) ? input : Buffer.from(input), + marshall: (input) => input, + }; + }, + enumerable: false, +}); +instance.expectPseudoTransferableType(Buffer); +exports.default = instance; +//# sourceMappingURL=pseudo-transfer.js.map \ No newline at end of file diff --git a/build/services/pseudo-transfer.js.map b/build/services/pseudo-transfer.js.map new file mode 100644 index 0000000000000000000000000000000000000000..7b04a52487c5dac47db0352b689584242e062af6 --- /dev/null +++ b/build/services/pseudo-transfer.js.map @@ -0,0 +1 @@ +{"version":3,"file":"pseudo-transfer.js","sourceRoot":"","sources":["../../src/services/pseudo-transfer.ts"],"names":[],"mappings":";;;;;;;;;AAAA,mCAA0C;AAC1C,4DAAyF;AACzF,uCAAgD;AAIzC,IAAM,cAAc,GAApB,MAAM,cAAe,SAAQ,wCAAsB;IAE7C,KAAK,CAAC,IAAI;QACf,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;QAC7B,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACvB,CAAC;CAEJ,CAAA;AAPY,wCAAc;yBAAd,cAAc;IAD1B,IAAA,oBAAS,GAAE;GACC,cAAc,CAO1B;AAED,MAAM,QAAQ,GAAG,oBAAS,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;AAEnD,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,SAAS,EAAE,yCAAuB,EAAE;IAC5D,KAAK,EAAE;QACH,MAAM,SAAS,GAAG,IAAI,CAAC;QACvB,OAAO;YACH,eAAe,EAAE,KAAK;YACtB,QAAQ,EAAE,CAAC,KAAY,EAAE,EAAE,CAAC,IAAA,yBAAgB,EAAC,KAAK,CAAC;YACnD,UAAU,EAAE,CAAC,KAAa,EAAE,EAAE;gBAC1B,MAAM,CAAC,cAAc,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;gBACxC,OAAO,KAAK,CAAC;YACjB,CAAC;SACJ,CAAC;IACN,CAAC;IACD,UAAU,EAAE,KAAK;CACpB,CAAC,CAAC;AACH,QAAQ,CAAC,4BAA4B,CAAC,KAAK,CAAC,CAAC;AAC7C,KAAK,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,CAAC;IACnG,IAAI,OAAO,CAAC,KAAK,UAAU,IAAI,CAAC,CAAC,SAAS,YAAY,KAAK,EAAE,CAAC;QAC1D,QAAQ,CAAC,4BAA4B,CAAC,CAAQ,CAAC,CAAC;IACpD,CAAC;AACL,CAAC;AAGD,MAAM,CAAC,cAAc,CAAC,GAAG,CAAC,SAAS,EAAE,yCAAuB,EAAE;IAC1D,KAAK,EAAE;QACH,OAAO;YACH,eAAe,EAAE,MAAM;YACvB,QAAQ,EAAE,CAAC,KAAU,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC;YAChD,UAAU,EAAE,CAAC,KAAwB,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC;SAChE,CAAC;IACN,CAAC;IACD,UAAU,EAAE,KAAK;CACpB,CAAC,CAAC;AACH,QAAQ,CAAC,4BAA4B,CAAC,GAAG,CAAC,CAAC;AAE3C,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,SAAS,EAAE,yCAAuB,EAAE;IAC7D,KAAK,EAAE;QACH,OAAO;YACH,eAAe,EAAE,MAAM;YACvB,UAAU,EAAE,CAAC,KAA0B,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;YAC/F,QAAQ,EAAE,CAAC,KAA0B,EAAE,EAAE,CAAC,KAAK;SAClD,CAAC;IACN,CAAC;IACD,UAAU,EAAE,KAAK;CACpB,CAAC,CAAC;AACH,QAAQ,CAAC,4BAA4B,CAAC,MAAM,CAAC,CAAC;AAG9C,kBAAe,QAAQ,CAAC"} \ No newline at end of file diff --git a/build/services/puppeteer.js b/build/services/puppeteer.js new file mode 100644 index 0000000000000000000000000000000000000000..51f8b02866e118d6a54d98cecf047bb05f6aa2a3 --- /dev/null +++ b/build/services/puppeteer.js @@ -0,0 +1,1214 @@ +"use strict"; +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __importStar = (this && this.__importStar) || (function () { + var ownKeys = function(o) { + ownKeys = Object.getOwnPropertyNames || function (o) { + var ar = []; + for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; + return ar; + }; + return ownKeys(o); + }; + return function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); + __setModuleDefault(result, mod); + return result; + }; +})(); +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.PuppeteerControl = void 0; +const lodash_1 = __importDefault(require("lodash")); +const net_1 = require("net"); +const promises_1 = require("fs/promises"); +const fs_1 = __importDefault(require("fs")); +const tsyringe_1 = require("tsyringe"); +const puppeteer_1 = __importStar(require("puppeteer")); +const defer_1 = require("civkit/defer"); +const civ_rpc_1 = require("civkit/civ-rpc"); +const async_service_1 = require("civkit/async-service"); +const timeout_1 = require("civkit/timeout"); +const errors_1 = require("../shared/lib/errors"); +const curl_1 = require("./curl"); +const blackhole_detector_1 = require("./blackhole-detector"); +const async_context_1 = require("./async-context"); +const logger_1 = require("./logger"); +const minimal_stealth_1 = require("./minimal-stealth"); +const tldExtract = require('tld-extract'); +const READABILITY_JS = fs_1.default.readFileSync(require.resolve('@mozilla/readability/Readability.js'), 'utf-8'); +const SIMULATE_SCROLL = ` +(function () { + function createIntersectionObserverEntry(target, isIntersecting, timestamp) { + const targetRect = target.getBoundingClientRect(); + const record = { + target, + isIntersecting, + time: timestamp, + // If intersecting, intersectionRect matches boundingClientRect + // If not intersecting, intersectionRect is empty (0x0) + intersectionRect: isIntersecting + ? targetRect + : new DOMRectReadOnly(0, 0, 0, 0), + // Current bounding client rect of the target + boundingClientRect: targetRect, + // Intersection ratio is either 0 (not intersecting) or 1 (fully intersecting) + intersectionRatio: isIntersecting ? 1 : 0, + // Root bounds (viewport in our case) + rootBounds: new DOMRectReadOnly( + 0, + 0, + window.innerWidth, + window.innerHeight + ) + }; + Object.setPrototypeOf(record, window.IntersectionObserverEntry.prototype); + return record; + } + function cloneIntersectionObserverEntry(entry) { + const record = { + target: entry.target, + isIntersecting: entry.isIntersecting, + time: entry.time, + intersectionRect: entry.intersectionRect, + boundingClientRect: entry.boundingClientRect, + intersectionRatio: entry.intersectionRatio, + rootBounds: entry.rootBounds + }; + Object.setPrototypeOf(record, window.IntersectionObserverEntry.prototype); + return record; + } + const orig = window.IntersectionObserver; + const kCallback = Symbol('callback'); + const kLastEntryMap = Symbol('lastEntryMap'); + const liveObservers = new Map(); + class MangledIntersectionObserver extends orig { + constructor(callback, options) { + super((entries, observer) => { + const lastEntryMap = observer[kLastEntryMap]; + const lastEntry = entries[entries.length - 1]; + lastEntryMap.set(lastEntry.target, lastEntry); + return callback(entries, observer); + }, options); + this[kCallback] = callback; + this[kLastEntryMap] = new WeakMap(); + liveObservers.set(this, new Set()); + } + disconnect() { + liveObservers.get(this)?.clear(); + liveObservers.delete(this); + return super.disconnect(); + } + observe(target) { + const observer = liveObservers.get(this); + observer?.add(target); + return super.observe(target); + } + unobserve(target) { + const observer = liveObservers.get(this); + observer?.delete(target); + return super.unobserve(target); + } + } + Object.defineProperty(MangledIntersectionObserver, 'name', { value: 'IntersectionObserver', writable: false }); + window.IntersectionObserver = MangledIntersectionObserver; + function simulateScroll() { + for (const [observer, targets] of liveObservers.entries()) { + const t0 = performance.now(); + for (const target of targets) { + const entry = createIntersectionObserverEntry(target, true, t0); + observer[kCallback]([entry], observer); + setTimeout(() => { + const t1 = performance.now(); + const lastEntry = observer[kLastEntryMap].get(target); + if (!lastEntry) { + return; + } + const entry2 = { ...cloneIntersectionObserverEntry(lastEntry), time: t1 }; + observer[kCallback]([entry2], observer); + }); + } + } + } + window.simulateScroll = simulateScroll; +})(); +`; +const MUTATION_IDLE_WATCH = ` +(function () { + let timeout; + const sendMsg = ()=> { + document.dispatchEvent(new CustomEvent('mutationIdle')); + }; + + const cb = () => { + if (timeout) { + clearTimeout(timeout); + timeout = setTimeout(sendMsg, 200); + } + }; + const mutationObserver = new MutationObserver(cb); + + document.addEventListener('DOMContentLoaded', () => { + mutationObserver.observe(document.documentElement, { + childList: true, + subtree: true, + }); + timeout = setTimeout(sendMsg, 200); + }, { once: true }) +})(); +`; +const SCRIPT_TO_INJECT_INTO_FRAME = ` +${READABILITY_JS} +${SIMULATE_SCROLL} +${MUTATION_IDLE_WATCH} +(${minimal_stealth_1.minimalStealth.toString()})(); + +(function(){ +function briefImgs(elem) { + const imageTags = Array.from((elem || document).querySelectorAll('img[src],img[data-src]')); + + return imageTags.map((x)=> { + let linkPreferredSrc = x.src; + if (linkPreferredSrc.startsWith('data:')) { + if (typeof x.dataset?.src === 'string' && !x.dataset.src.startsWith('data:')) { + linkPreferredSrc = x.dataset.src; + } + } + + return { + src: new URL(linkPreferredSrc, document.baseURI).toString(), + loaded: x.complete, + width: x.width, + height: x.height, + naturalWidth: x.naturalWidth, + naturalHeight: x.naturalHeight, + alt: x.alt || x.title, + }; + }); +} +function getMaxDepthAndElemCountUsingTreeWalker(root=document.documentElement) { + let maxDepth = 0; + let currentDepth = 0; + let elementCount = 0; + + const treeWalker = document.createTreeWalker( + root, + NodeFilter.SHOW_ELEMENT, + (node) => { + const nodeName = node.nodeName?.toLowerCase(); + return (nodeName === 'svg') ? NodeFilter.FILTER_REJECT : NodeFilter.FILTER_ACCEPT; + }, + false + ); + + while (true) { + maxDepth = Math.max(maxDepth, currentDepth); + elementCount++; // Increment the count for the current node + + if (treeWalker.firstChild()) { + currentDepth++; + } else { + while (!treeWalker.nextSibling() && currentDepth > 0) { + treeWalker.parentNode(); + currentDepth--; + } + + if (currentDepth <= 0) { + break; + } + } + } + + return { + maxDepth: maxDepth + 1, + elementCount: elementCount + }; +} + +function cloneAndExpandShadowRoots(rootElement = document.documentElement) { + // Create a shallow clone of the root element + const clone = rootElement.cloneNode(false); + // Function to process an element and its shadow root + function processShadowRoot(original, cloned) { + if (original.shadowRoot && original.shadowRoot.mode === 'open') { + shadowDomPresents = true; + const shadowContent = document.createDocumentFragment(); + + // Clone shadow root content normally + original.shadowRoot.childNodes.forEach(childNode => { + const clonedNode = childNode.cloneNode(true); + shadowContent.appendChild(clonedNode); + }); + + // Handle slots + const slots = shadowContent.querySelectorAll('slot'); + slots.forEach(slot => { + const slotName = slot.getAttribute('name') || ''; + const assignedElements = original.querySelectorAll( + slotName ? \`[slot="\${slotName}"]\` : ':not([slot])' + ); + + if (assignedElements.length > 0) { + const slotContent = document.createDocumentFragment(); + assignedElements.forEach(el => { + const clonedEl = el.cloneNode(true); + slotContent.appendChild(clonedEl); + }); + slot.parentNode.replaceChild(slotContent, slot); + } else if (!slotName) { + // Keep default slot content + // No need to do anything as it's already cloned + } + }); + + cloned.appendChild(shadowContent); + } + } + + // Use a TreeWalker on the original root to clone the entire structure + const treeWalker = document.createTreeWalker( + rootElement, + NodeFilter.SHOW_ELEMENT | NodeFilter.SHOW_TEXT + ); + + const elementMap = new Map([[rootElement, clone]]); + + let currentNode; + while (currentNode = treeWalker.nextNode()) { + const parentClone = elementMap.get(currentNode.parentNode); + const clonedNode = currentNode.cloneNode(false); + parentClone.appendChild(clonedNode); + + if (currentNode.nodeType === Node.ELEMENT_NODE) { + elementMap.set(currentNode, clonedNode); + processShadowRoot(currentNode, clonedNode); + } + } + + return clone; +} + +function shadowDomPresent(rootElement = document.documentElement) { + const elems = rootElement.querySelectorAll('*'); + for (const x of elems) { + if (x.shadowRoot && x.shadowRoot.mode === 'open') { + return true; + } + } + return false; +} + +let lastMutationIdle = 0; +let initialAnalytics; +document.addEventListener('mutationIdle', ()=> lastMutationIdle = Date.now()); + +function giveSnapshot(stopActiveSnapshot, overrideDomAnalysis) { + if (stopActiveSnapshot) { + window.haltSnapshot = true; + } + let parsed; + try { + parsed = new Readability(document.cloneNode(true)).parse(); + } catch (err) { + void 0; + } + const domAnalysis = overrideDomAnalysis || getMaxDepthAndElemCountUsingTreeWalker(document.documentElement); + initialAnalytics ??= domAnalysis; + + const thisElemCount = domAnalysis.elementCount; + const initialElemCount = initialAnalytics.elementCount; + Math.abs(thisElemCount - initialElemCount) / (initialElemCount + Number.EPSILON) + const r = { + title: document.title, + description: document.head?.querySelector('meta[name="description"]')?.getAttribute('content') ?? '', + href: document.location.href, + html: document.documentElement?.outerHTML, + htmlSignificantlyModifiedByJs: Boolean(Math.abs(thisElemCount - initialElemCount) / (initialElemCount + Number.EPSILON) > 0.05), + text: document.body?.innerText, + shadowExpanded: shadowDomPresent() ? cloneAndExpandShadowRoots()?.outerHTML : undefined, + parsed: parsed, + imgs: [], + maxElemDepth: domAnalysis.maxDepth, + elemCount: domAnalysis.elementCount, + lastMutationIdle, + }; + if (document.baseURI !== r.href) { + r.rebase = document.baseURI; + } + r.imgs = briefImgs(); + + return r; +} +function waitForSelector(selectorText) { + return new Promise((resolve) => { + const existing = document.querySelector(selectorText); + if (existing) { + resolve(existing); + return; + } + const observer = new MutationObserver(() => { + const elem = document.querySelector(selectorText); + if (elem) { + resolve(document.querySelector(selectorText)); + observer.disconnect(); + } + }); + observer.observe(document.documentElement, { + childList: true, + subtree: true + }); + }); +} +window.getMaxDepthAndElemCountUsingTreeWalker = getMaxDepthAndElemCountUsingTreeWalker; +window.waitForSelector = waitForSelector; +window.giveSnapshot = giveSnapshot; +window.briefImgs = briefImgs; +})(); +`; +const documentResourceTypes = new Set([ + 'document', 'script', 'xhr', 'fetch', 'prefetch', 'eventsource', 'websocket', 'preflight' +]); +const mediaResourceTypes = new Set([ + 'stylesheet', 'image', 'font', 'media' +]); +class PageReqCtrlKit { + constructor(concurrency) { + this.concurrency = concurrency; + this.reqSet = new Set(); + this.blockers = []; + this.lastResourceLoadedAt = 0; + this.lastContentResourceLoadedAt = 0; + this.lastMediaResourceLoadedAt = 0; + if (isNaN(concurrency) || concurrency < 1) { + throw new civ_rpc_1.AssertionFailureError(`Invalid concurrency: ${concurrency}`); + } + } + onNewRequest(req) { + this.reqSet.add(req); + if (this.reqSet.size <= this.concurrency) { + return Promise.resolve(); + } + const deferred = (0, defer_1.Defer)(); + this.blockers.push(deferred); + return deferred.promise; + } + onFinishRequest(req) { + this.reqSet.delete(req); + const deferred = this.blockers.shift(); + deferred?.resolve(); + const now = Date.now(); + this.lastResourceLoadedAt = now; + // Beware req being undefined + // https://pptr.dev/api/puppeteer.pageevent#:~:text=For%20certain%20requests%2C%20might%20contain%20undefined. + const typ = req?.resourceType(); + if (!typ) { + return; + } + if (documentResourceTypes.has(typ)) { + this.lastContentResourceLoadedAt = now; + } + if (mediaResourceTypes.has(typ)) { + this.lastMediaResourceLoadedAt = now; + } + } +} +let PuppeteerControl = class PuppeteerControl extends async_service_1.AsyncService { + constructor(globalLogger, asyncLocalContext, curlControl, blackHoleDetector) { + super(...arguments); + this.globalLogger = globalLogger; + this.asyncLocalContext = asyncLocalContext; + this.curlControl = curlControl; + this.blackHoleDetector = blackHoleDetector; + this._sn = 0; + this.logger = this.globalLogger.child({ service: this.constructor.name }); + this.__loadedPage = []; + this.finalizerMap = new WeakMap(); + this.snMap = new WeakMap(); + this.livePages = new Set(); + this.pagePhase = new WeakMap(); + this.lastPageCratedAt = 0; + this.ua = ''; + this.effectiveUA = ''; + this.concurrentRequestsPerPage = 32; + this.pageReqCtrl = new WeakMap(); + this.lastReqSentAt = 0; + this.circuitBreakerHosts = new Set(); + this.lifeCycleTrack = new WeakMap(); + this.setMaxListeners(Infinity); + let crippledTimes = 0; + this.on('crippled', () => { + crippledTimes += 1; + this.__loadedPage.length = 0; + this.livePages.clear(); + if (crippledTimes > 5) { + process.nextTick(() => { + this.emit('error', new Error('Browser crashed too many times, quitting...')); + // process.exit(1); + }); + } + }); + } + async init() { + await this.dependencyReady(); + if (process.env.NODE_ENV?.includes('dry-run')) { + this.emit('ready'); + return; + } + if (this.browser) { + if (this.browser.connected) { + await this.browser.close(); + } + else { + this.browser.process()?.kill('SIGKILL'); + } + } + this.browser = await puppeteer_1.default.launch({ + timeout: 10_000, + headless: !Boolean(process.env.DEBUG_BROWSER), + executablePath: process.env.OVERRIDE_CHROME_EXECUTABLE_PATH, + args: [ + '--disable-dev-shm-usage', + '--disable-blink-features=AutomationControlled' + ] + }).catch((err) => { + this.logger.error(`Unknown firebase issue, just die fast.`, { err }); + process.nextTick(() => { + this.emit('error', err); + // process.exit(1); + }); + return Promise.reject(err); + }); + this.browser.once('disconnected', () => { + this.logger.warn(`Browser disconnected`); + if (this.browser) { + this.emit('crippled'); + } + process.nextTick(() => this.serviceReady()); + }); + this.ua = await this.browser.userAgent(); + this.logger.info(`Browser launched: ${this.browser.process()?.pid}, ${this.ua}`); + this.effectiveUA = this.ua.replace(/Headless/i, '').replace('Mozilla/5.0 (X11; Linux x86_64)', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)'); + this.curlControl.impersonateChrome(this.effectiveUA); + await this.newPage('beware_deadlock').then((r) => this.__loadedPage.push(r)); + this.emit('ready'); + } + getRpsControlKit(page) { + let kit = this.pageReqCtrl.get(page); + if (!kit) { + kit = new PageReqCtrlKit(this.concurrentRequestsPerPage); + this.pageReqCtrl.set(page, kit); + } + return kit; + } + async newPage(bewareDeadLock = false) { + if (!bewareDeadLock) { + await this.serviceReady(); + } + const sn = this._sn++; + let page; + try { + const dedicatedContext = await this.browser.createBrowserContext(); + page = await dedicatedContext.newPage(); + } + catch (err) { + this.logger.warn(`Failed to create page ${sn}`, { err }); + this.browser.process()?.kill('SIGKILL'); + throw new errors_1.ServiceNodeResourceDrainError(`This specific worker node failed to open a new page, try again.`); + } + const preparations = []; + preparations.push(page.setUserAgent(this.effectiveUA)); + // preparations.push(page.setUserAgent(`Slackbot-LinkExpanding 1.0 (+https://api.slack.com/robots)`)); + // preparations.push(page.setUserAgent(`Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; GPTBot/1.0; +https://openai.com/gptbot)`)); + preparations.push(page.setBypassCSP(true)); + preparations.push(page.setViewport({ width: 1024, height: 1024 })); + preparations.push(page.exposeFunction('reportSnapshot', (snapshot) => { + if (snapshot.href === 'about:blank') { + return; + } + page.emit('snapshot', snapshot); + })); + preparations.push(page.exposeFunction('setViewport', (viewport) => { + page.setViewport(viewport).catch(() => undefined); + })); + preparations.push(page.evaluateOnNewDocument(SCRIPT_TO_INJECT_INTO_FRAME)); + preparations.push(page.setRequestInterception(true)); + await Promise.all(preparations); + await page.goto('about:blank', { waitUntil: 'domcontentloaded' }); + const domainSet = new Set(); + let reqCounter = 0; + let t0; + let halt = false; + page.on('request', async (req) => { + reqCounter++; + if (halt) { + return req.abort('blockedbyclient', 1000); + } + const requestUrl = req.url(); + if (!requestUrl.startsWith('http:') && !requestUrl.startsWith('https:') && !requestUrl.startsWith('chrome-extension:') && requestUrl !== 'about:blank') { + return req.abort('blockedbyclient', 1000); + } + t0 ??= Date.now(); + const parsedUrl = new URL(requestUrl); + if ((0, net_1.isIP)(parsedUrl.hostname)) { + domainSet.add(parsedUrl.hostname); + } + else { + try { + const tldParsed = tldExtract(requestUrl); + domainSet.add(tldParsed.domain); + } + catch (_err) { + domainSet.add(parsedUrl.hostname); + } + } + if (this.circuitBreakerHosts.has(parsedUrl.hostname.toLowerCase())) { + page.emit('abuse', { url: requestUrl, page, sn, reason: `Abusive request: ${requestUrl}` }); + return req.abort('blockedbyclient', 1000); + } + if (parsedUrl.hostname === 'localhost' || + parsedUrl.hostname.startsWith('127.')) { + page.emit('abuse', { url: requestUrl, page, sn, reason: `Suspicious action: Request to localhost: ${requestUrl}` }); + return req.abort('blockedbyclient', 1000); + } + const dt = Math.ceil((Date.now() - t0) / 1000); + const rps = reqCounter / dt; + // console.log(`rps: ${rps}`); + const pagePhase = this.pagePhase.get(page); + if (pagePhase === 'background') { + if (rps > 10 || reqCounter > 1000) { + halt = true; + return req.abort('blockedbyclient', 1000); + } + } + if (reqCounter > 1000) { + if (rps > 60 || reqCounter > 2000) { + page.emit('abuse', { url: requestUrl, page, sn, reason: `DDoS attack suspected: Too many requests` }); + halt = true; + return req.abort('blockedbyclient', 1000); + } + } + if (domainSet.size > 200) { + page.emit('abuse', { url: requestUrl, page, sn, reason: `DDoS attack suspected: Too many domains` }); + halt = true; + return req.abort('blockedbyclient', 1000); + } + if (requestUrl.startsWith('http')) { + const kit = this.getRpsControlKit(page); + await kit.onNewRequest(req); + } + if (req.isInterceptResolutionHandled()) { + return; + } + ; + const continueArgs = req.continueRequestOverrides + ? [req.continueRequestOverrides(), 0] + : []; + return req.continue(continueArgs[0], continueArgs[1]); + }); + const reqFinishHandler = (req) => { + const kit = this.getRpsControlKit(page); + kit.onFinishRequest(req); + }; + page.on('requestfinished', reqFinishHandler); + page.on('requestfailed', reqFinishHandler); + page.on('requestservedfromcache', reqFinishHandler); + await page.evaluateOnNewDocument(` +(function () { + if (window.self === window.top) { + let lastAnalytics; + let lastReportedAt = 0; + const handlePageLoad = () => { + const now = Date.now(); + const dt = now - lastReportedAt; + const previousAnalytics = lastAnalytics; + const thisAnalytics = getMaxDepthAndElemCountUsingTreeWalker(); + let dElem = 0; + + if (window.haltSnapshot) { + return; + } + + const thisElemCount = thisAnalytics.elementCount; + if (previousAnalytics) { + const previousElemCount = previousAnalytics.elementCount; + + const delta = Math.abs(thisElemCount - previousElemCount); + dElem = delta /(previousElemCount + Number.EPSILON); + } + + if (dt < 1200 && dElem < 0.05) { + return; + } + + lastAnalytics = thisAnalytics; + lastReportedAt = now; + + const r = giveSnapshot(false, lastAnalytics); + window.reportSnapshot(r); + }; + document.addEventListener('readystatechange', ()=> { + if (document.readyState === 'interactive') { + handlePageLoad(); + } + }); + document.addEventListener('load', handlePageLoad); + window.addEventListener('load', handlePageLoad); + document.addEventListener('DOMContentLoaded', handlePageLoad); + document.addEventListener('mutationIdle', handlePageLoad); + } + document.addEventListener('DOMContentLoaded', ()=> window.simulateScroll(), { once: true }); +})(); +`); + this.snMap.set(page, sn); + this.logger.debug(`Page ${sn} created.`); + this.lastPageCratedAt = Date.now(); + this.livePages.add(page); + this.pagePhase.set(page, 'idle'); + return page; + } + async getNextPage() { + let thePage; + if (this.__loadedPage.length) { + thePage = this.__loadedPage.shift(); + if (this.__loadedPage.length <= 1) { + process.nextTick(() => { + this.newPage() + .then((r) => this.__loadedPage.push(r)) + .catch((err) => { + this.logger.warn(`Failed to load new page ahead of time`, { err }); + }); + }); + } + } + if (!thePage) { + thePage = await this.newPage(); + } + const timer = setTimeout(() => { + this.logger.warn(`Page is not allowed to live past 5 minutes, ditching page ${this.snMap.get(thePage)}...`); + this.ditchPage(thePage); + }, 300 * 1000); + this.finalizerMap.set(thePage, timer); + return thePage; + } + async ditchPage(page) { + if (this.finalizerMap.has(page)) { + clearTimeout(this.finalizerMap.get(page)); + this.finalizerMap.delete(page); + } + if (page.isClosed()) { + return; + } + const sn = this.snMap.get(page); + this.logger.debug(`Closing page ${sn}`); + await Promise.race([ + (async () => { + const ctx = page.browserContext(); + try { + await page.close(); + } + finally { + await ctx.close(); + } + })(), + (0, timeout_1.delay)(5000) + ]).catch((err) => { + this.logger.error(`Failed to destroy page ${sn}`, { err }); + }); + this.livePages.delete(page); + this.pagePhase.delete(page); + } + async *scrap(parsedUrl, options = {}) { + // parsedUrl.search = ''; + const url = parsedUrl.toString(); + let snapshot; + let screenshot; + let pageshot; + const pdfUrls = []; + let navigationResponse; + const page = await this.getNextPage(); + this.lifeCycleTrack.set(page, this.asyncLocalContext.ctx); + this.pagePhase.set(page, 'active'); + page.on('response', (resp) => { + this.blackHoleDetector.itWorked(); + const req = resp.request(); + if (req.frame() === page.mainFrame() && req.isNavigationRequest()) { + navigationResponse = resp; + } + if (!resp.ok()) { + return; + } + const headers = resp.headers(); + const url = resp.url(); + const contentType = headers['content-type']; + if (contentType?.toLowerCase().includes('application/pdf')) { + pdfUrls.push(url); + } + }); + page.on('request', async (req) => { + if (req.isInterceptResolutionHandled()) { + return; + } + ; + const reqUrlParsed = new URL(req.url()); + if (!reqUrlParsed.protocol.startsWith('http')) { + const overrides = req.continueRequestOverrides(); + return req.continue(overrides, 0); + } + const typ = req.resourceType(); + if (typ === 'media') { + // Non-cooperative answer to block all media requests. + return req.abort('blockedbyclient'); + } + if (!options.proxyResources) { + const isDocRequest = ['document', 'xhr', 'fetch', 'websocket', 'prefetch', 'eventsource', 'ping'].includes(typ); + if (!isDocRequest) { + if (options.extraHeaders) { + const overrides = req.continueRequestOverrides(); + const continueArgs = [{ + ...overrides, + headers: { + ...req.headers(), + ...overrides?.headers, + ...options.extraHeaders, + } + }, 1]; + return req.continue(continueArgs[0], continueArgs[1]); + } + const overrides = req.continueRequestOverrides(); + return req.continue(overrides, 0); + } + } + const sideload = options.sideLoad; + const impersonate = sideload?.impersonate[reqUrlParsed.href]; + if (impersonate) { + let body; + if (impersonate.body) { + body = await (0, promises_1.readFile)(await impersonate.body.filePath); + if (req.isInterceptResolutionHandled()) { + return; + } + } + return req.respond({ + status: impersonate.status, + headers: impersonate.headers, + contentType: impersonate.contentType, + body: body ? Uint8Array.from(body) : undefined, + }, 999); + } + const proxy = options.proxyUrl || sideload?.proxyOrigin?.[reqUrlParsed.origin]; + const ctx = this.lifeCycleTrack.get(page); + if (proxy && ctx) { + return await this.asyncLocalContext.bridge(ctx, async () => { + try { + const curled = await this.curlControl.sideLoad(reqUrlParsed, { + ...options, + method: req.method(), + body: req.postData(), + extraHeaders: { + ...req.headers(), + ...options.extraHeaders, + }, + proxyUrl: proxy + }); + if (req.isInterceptResolutionHandled()) { + return; + } + ; + if (curled.chain.length === 1) { + if (!curled.file) { + return req.respond({ + status: curled.status, + headers: lodash_1.default.omit(curled.headers, 'result'), + contentType: curled.contentType, + }, 3); + } + const body = await (0, promises_1.readFile)(await curled.file.filePath); + if (req.isInterceptResolutionHandled()) { + return; + } + ; + return req.respond({ + status: curled.status, + headers: lodash_1.default.omit(curled.headers, 'result'), + contentType: curled.contentType, + body: Uint8Array.from(body), + }, 3); + } + options.sideLoad ??= curled.sideLoadOpts; + lodash_1.default.merge(options.sideLoad, curled.sideLoadOpts); + const firstReq = curled.chain[0]; + return req.respond({ + status: firstReq.result.code, + headers: lodash_1.default.omit(firstReq, 'result'), + }, 3); + } + catch (err) { + this.logger.warn(`Failed to sideload browser request ${reqUrlParsed.origin}`, { href: reqUrlParsed.href, err, proxy }); + } + if (req.isInterceptResolutionHandled()) { + return; + } + ; + const overrides = req.continueRequestOverrides(); + const continueArgs = [{ + ...overrides, + headers: { + ...req.headers(), + ...overrides?.headers, + ...options.extraHeaders, + } + }, 1]; + return req.continue(continueArgs[0], continueArgs[1]); + }); + } + if (req.isInterceptResolutionHandled()) { + return; + } + ; + const overrides = req.continueRequestOverrides(); + const continueArgs = [{ + ...overrides, + headers: { + ...req.headers(), + ...overrides?.headers, + ...options.extraHeaders, + } + }, 1]; + return req.continue(continueArgs[0], continueArgs[1]); + }); + let pageScriptEvaluations = []; + let frameScriptEvaluations = []; + if (options.injectPageScripts?.length) { + page.on('framenavigated', (frame) => { + if (frame !== page.mainFrame()) { + return; + } + pageScriptEvaluations.push(Promise.allSettled(options.injectPageScripts.map((x) => frame.evaluate(x).catch((err) => { + this.logger.warn(`Error in evaluation of page scripts`, { err }); + })))); + }); + } + if (options.injectFrameScripts?.length) { + page.on('framenavigated', (frame) => { + frameScriptEvaluations.push(Promise.allSettled(options.injectFrameScripts.map((x) => frame.evaluate(x).catch((err) => { + this.logger.warn(`Error in evaluation of frame scripts`, { err }); + })))); + }); + } + const sn = this.snMap.get(page); + this.logger.info(`Page ${sn}: Scraping ${url}`, { url }); + if (options.locale) { + // Add headers via request interception to walk around this bug + // https://github.com/puppeteer/puppeteer/issues/10235 + // await page.setExtraHTTPHeaders({ + // 'Accept-Language': options.locale + // }); + await page.evaluateOnNewDocument(() => { + Object.defineProperty(navigator, "language", { + get: function () { + return options.locale; + } + }); + Object.defineProperty(navigator, "languages", { + get: function () { + return [options.locale]; + } + }); + }); + } + if (options.cookies) { + const mapped = options.cookies.map((x) => { + const draft = { + name: x.name, + value: encodeURIComponent(x.value), + secure: x.secure, + domain: x.domain, + path: x.path, + expires: x.expires ? Math.floor(x.expires.valueOf() / 1000) : undefined, + sameSite: x.sameSite, + }; + if (!draft.expires && x.maxAge) { + draft.expires = Math.floor(Date.now() / 1000) + x.maxAge; + } + if (!draft.domain) { + draft.url = parsedUrl.toString(); + } + return draft; + }); + try { + await page.setCookie(...mapped); + } + catch (err) { + this.logger.warn(`Page ${sn}: Failed to set cookies`, { err }); + throw new civ_rpc_1.ParamValidationError({ + path: 'cookies', + message: `Failed to set cookies: ${err?.message}` + }); + } + } + if (options.overrideUserAgent) { + await page.setUserAgent(options.overrideUserAgent); + } + if (options.viewport) { + await page.setViewport(options.viewport); + } + let nextSnapshotDeferred = (0, defer_1.Defer)(); + const crippleListener = () => nextSnapshotDeferred.reject(new errors_1.ServiceCrashedError({ message: `Browser crashed, try again` })); + this.once('crippled', crippleListener); + nextSnapshotDeferred.promise.finally(() => { + this.off('crippled', crippleListener); + }); + let successfullyDone; + const hdl = (s) => { + if (snapshot === s) { + return; + } + snapshot = s; + if (snapshot) { + const kit = this.pageReqCtrl.get(page); + snapshot.lastContentResourceLoaded = kit?.lastContentResourceLoadedAt; + snapshot.lastMediaResourceLoaded = kit?.lastMediaResourceLoadedAt; + } + if (s?.maxElemDepth && s.maxElemDepth > 256) { + return; + } + if (s?.elemCount && s.elemCount > 10_000) { + return; + } + nextSnapshotDeferred.resolve(s); + nextSnapshotDeferred = (0, defer_1.Defer)(); + this.once('crippled', crippleListener); + nextSnapshotDeferred.promise.finally(() => { + this.off('crippled', crippleListener); + }); + }; + page.on('snapshot', hdl); + page.once('abuse', (event) => { + this.emit('abuse', { ...event, url: parsedUrl }); + if (snapshot?.href && parsedUrl.href !== snapshot.href) { + this.emit('abuse', { ...event, url: snapshot.href }); + } + nextSnapshotDeferred.reject(new errors_1.SecurityCompromiseError(`Abuse detected: ${event.reason}`)); + }); + const timeout = options.timeoutMs || 30_000; + const goToOptions = { + waitUntil: ['load', 'domcontentloaded', 'networkidle0'], + timeout, + }; + if (options.referer) { + goToOptions.referer = options.referer; + } + let waitForPromise; + let finalizationPromise; + const doFinalization = async () => { + if (waitForPromise) { + // SuccessfullyDone is meant for the finish of the page. + // It doesn't matter if you are expecting something and it didn't show up. + await waitForPromise.catch(() => void 0); + } + successfullyDone ??= true; + try { + const pSubFrameSnapshots = this.snapshotChildFrames(page); + snapshot = await page.evaluate('giveSnapshot(true)'); + screenshot = (await this.takeScreenShot(page)) || screenshot; + pageshot = (await this.takeScreenShot(page, { fullPage: true })) || pageshot; + if (snapshot) { + snapshot.childFrames = await pSubFrameSnapshots; + } + } + catch (err) { + this.logger.warn(`Page ${sn}: Failed to finalize ${url}`, { err }); + } + if (!snapshot?.html) { + return; + } + this.logger.info(`Page ${sn}: Snapshot of ${url} done`, { url, title: snapshot?.title, href: snapshot?.href }); + this.emit('crawled', { + ...snapshot, + status: navigationResponse?.status(), + statusText: navigationResponse?.statusText(), + pdfs: lodash_1.default.uniq(pdfUrls), screenshot, pageshot, + }, { ...options, url: parsedUrl }); + }; + const delayPromise = (0, timeout_1.delay)(timeout); + const gotoPromise = page.goto(url, goToOptions) + .catch((err) => { + if (err instanceof puppeteer_1.TimeoutError) { + this.logger.warn(`Page ${sn}: Browsing of ${url} timed out`, { err }); + return new civ_rpc_1.AssertionFailureError({ + message: `Failed to goto ${url}: ${err}`, + cause: err, + }); + } + if (err?.message?.startsWith('net::ERR_ABORTED')) { + if (pdfUrls.length) { + // Not throw for pdf mode. + return; + } + } + this.logger.warn(`Page ${sn}: Browsing of ${url} failed`, { err }); + return new civ_rpc_1.AssertionFailureError({ + message: `Failed to goto ${url}: ${err}`, + cause: err, + }); + }).then(async (stuff) => { + // This check is necessary because without snapshot, the condition of the page is unclear + // Calling evaluate directly may stall the process. + if (!snapshot) { + if (stuff instanceof Error) { + throw stuff; + } + } + await Promise.race([Promise.allSettled([...pageScriptEvaluations, ...frameScriptEvaluations]), delayPromise]) + .catch(() => void 0); + return stuff; + }); + if (options.waitForSelector) { + const t0 = Date.now(); + waitForPromise = nextSnapshotDeferred.promise.then(() => { + const t1 = Date.now(); + const elapsed = t1 - t0; + const remaining = timeout - elapsed; + const thisTimeout = remaining > 100 ? remaining : 100; + const p = (Array.isArray(options.waitForSelector) ? + Promise.all(options.waitForSelector.map((x) => page.waitForSelector(x, { timeout: thisTimeout }))) : + page.waitForSelector(options.waitForSelector, { timeout: thisTimeout })) + .then(() => { + successfullyDone = true; + }) + .catch((err) => { + waitForPromise = undefined; + this.logger.warn(`Page ${sn}: Failed to wait for selector ${options.waitForSelector}`, { err }); + }); + return p; + }); + finalizationPromise = Promise.allSettled([waitForPromise, gotoPromise]).then(doFinalization); + } + else { + finalizationPromise = gotoPromise.then(doFinalization); + } + try { + let lastHTML = snapshot?.html; + while (true) { + const ckpt = [nextSnapshotDeferred.promise, waitForPromise ?? gotoPromise]; + if (options.minIntervalMs) { + ckpt.push((0, timeout_1.delay)(options.minIntervalMs)); + } + let error; + await Promise.race(ckpt).catch((err) => error = err); + if (successfullyDone && !error) { + if (!snapshot && !screenshot) { + throw new civ_rpc_1.AssertionFailureError(`Could not extract any meaningful content from the page`); + } + yield { + ...snapshot, + status: navigationResponse?.status(), + statusText: navigationResponse?.statusText(), + pdfs: lodash_1.default.uniq(pdfUrls), screenshot, pageshot + }; + break; + } + if (options.favorScreenshot && snapshot?.title && snapshot?.html !== lastHTML) { + screenshot = (await this.takeScreenShot(page)) || screenshot; + pageshot = (await this.takeScreenShot(page, { fullPage: true })) || pageshot; + lastHTML = snapshot.html; + } + if (snapshot || screenshot) { + yield { + ...snapshot, + status: navigationResponse?.status(), + statusText: navigationResponse?.statusText(), + pdfs: lodash_1.default.uniq(pdfUrls), screenshot, pageshot, + isIntermediate: true, + }; + } + if (error) { + throw error; + } + if (successfullyDone) { + break; + } + } + await finalizationPromise; + yield { + ...snapshot, + status: navigationResponse?.status(), + statusText: navigationResponse?.statusText(), + pdfs: lodash_1.default.uniq(pdfUrls), screenshot, pageshot + }; + } + finally { + this.pagePhase.set(page, 'background'); + Promise.allSettled([gotoPromise, waitForPromise, finalizationPromise]).finally(() => { + page.off('snapshot', hdl); + this.ditchPage(page); + }); + nextSnapshotDeferred.resolve(); + } + } + async takeScreenShot(page, opts) { + const r = await page.screenshot(opts).catch((err) => { + this.logger.warn(`Failed to take screenshot`, { err }); + }); + if (r) { + return Buffer.from(r); + } + return undefined; + } + async snapshotChildFrames(page) { + const childFrames = page.mainFrame().childFrames(); + const r = await Promise.all(childFrames.map(async (x) => { + const thisUrl = x.url(); + if (!thisUrl || thisUrl === 'about:blank') { + return undefined; + } + try { + await x.evaluate(SCRIPT_TO_INJECT_INTO_FRAME); + return await x.evaluate(`giveSnapshot()`); + } + catch (err) { + this.logger.warn(`Failed to snapshot child frame ${thisUrl}`, { err }); + return undefined; + } + })); + return r.filter(Boolean); + } +}; +exports.PuppeteerControl = PuppeteerControl; +exports.PuppeteerControl = PuppeteerControl = __decorate([ + (0, tsyringe_1.singleton)(), + __metadata("design:paramtypes", [logger_1.GlobalLogger, + async_context_1.AsyncLocalContext, + curl_1.CurlControl, + blackhole_detector_1.BlackHoleDetector]) +], PuppeteerControl); +const puppeteerControl = tsyringe_1.container.resolve(PuppeteerControl); +exports.default = puppeteerControl; +//# sourceMappingURL=puppeteer.js.map \ No newline at end of file diff --git a/build/services/puppeteer.js.map b/build/services/puppeteer.js.map new file mode 100644 index 0000000000000000000000000000000000000000..7b91ed16c88db92d27395d1116082954aa5774bb --- /dev/null +++ b/build/services/puppeteer.js.map @@ -0,0 +1 @@ +{"version":3,"file":"puppeteer.js","sourceRoot":"","sources":["../../src/services/puppeteer.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/build/services/registry.js b/build/services/registry.js new file mode 100644 index 0000000000000000000000000000000000000000..4f4590c7975077d3c5c64b350f98b3cfd9ee2661 --- /dev/null +++ b/build/services/registry.js @@ -0,0 +1,74 @@ +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +var _a; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Ctx = exports.Param = exports.RPCReflect = exports.RPCMethod = exports.Method = exports.RPCRegistry = exports.InjectProperty = exports.Context = void 0; +const property_injector_1 = require("civkit/property-injector"); +const koa_1 = require("civkit/civ-rpc/koa"); +const tsyringe_1 = require("tsyringe"); +const civ_rpc_1 = require("civkit/civ-rpc"); +const bodyparser_1 = __importDefault(require("@koa/bodyparser")); +const logger_1 = require("./logger"); +const temp_file_1 = require("./temp-file"); +const async_context_1 = require("./async-context"); +const blackhole_detector_1 = require("./blackhole-detector"); +var koa_2 = require("koa"); +Object.defineProperty(exports, "Context", { enumerable: true, get: function () { return koa_2.Context; } }); +exports.InjectProperty = (0, property_injector_1.propertyInjectorFactory)(tsyringe_1.container); +let RPCRegistry = class RPCRegistry extends koa_1.KoaRPCRegistry { + static { this.envelope = civ_rpc_1.IntegrityEnvelope; } + constructor(globalLogger, ctxMgr, tempFileManager, blackHoleDetector) { + super(...arguments); + this.globalLogger = globalLogger; + this.ctxMgr = ctxMgr; + this.tempFileManager = tempFileManager; + this.blackHoleDetector = blackHoleDetector; + this.title = 'Jina Reader API'; + this.container = tsyringe_1.container; + this.logger = this.globalLogger.child({ service: this.constructor.name }); + this._BODY_PARSER_LIMIT = '102mb'; + this._RESPONSE_STREAM_MODE = 'koa'; + this.koaMiddlewares = [ + this.__CORSAllowAllMiddleware.bind(this), + (0, bodyparser_1.default)({ + encoding: 'utf-8', + enableTypes: ['json', 'form'], + jsonLimit: this._BODY_PARSER_LIMIT, + xmlLimit: this._BODY_PARSER_LIMIT, + formLimit: this._BODY_PARSER_LIMIT, + }), + this.__multiParse.bind(this), + this.__binaryParse.bind(this), + ]; + this.on('run', () => this.blackHoleDetector.incomingRequest()); + this.on('ran', () => this.blackHoleDetector.doneWithRequest()); + this.on('fail', () => this.blackHoleDetector.doneWithRequest()); + } + async init() { + await this.dependencyReady(); + this.emit('ready'); + } +}; +exports.RPCRegistry = RPCRegistry; +exports.RPCRegistry = RPCRegistry = __decorate([ + (0, tsyringe_1.singleton)(), + __metadata("design:paramtypes", [logger_1.GlobalLogger, + async_context_1.AsyncLocalContext, + temp_file_1.TempFileManager, + blackhole_detector_1.BlackHoleDetector]) +], RPCRegistry); +const instance = tsyringe_1.container.resolve(RPCRegistry); +exports.default = instance; +_a = instance.decorators(), exports.Method = _a.Method, exports.RPCMethod = _a.RPCMethod, exports.RPCReflect = _a.RPCReflect, exports.Param = _a.Param, exports.Ctx = _a.Ctx; +//# sourceMappingURL=registry.js.map \ No newline at end of file diff --git a/build/services/registry.js.map b/build/services/registry.js.map new file mode 100644 index 0000000000000000000000000000000000000000..3f38360ab5b925bb510ab9b43fbcf7a01ef7bb51 --- /dev/null +++ b/build/services/registry.js.map @@ -0,0 +1 @@ +{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/services/registry.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,gEAAmE;AACnE,4CAAoD;AACpD,uCAAgD;AAChD,4CAAmD;AACnD,iEAAyC;AAEzC,qCAAwC;AACxC,2CAA8C;AAC9C,mDAAoD;AACpD,6DAAyD;AACzD,2BAA8B;AAArB,8FAAA,OAAO,OAAA;AAEH,QAAA,cAAc,GAAG,IAAA,2CAAuB,EAAC,oBAAS,CAAC,CAAC;AAG1D,IAAM,WAAW,GAAjB,MAAM,WAAY,SAAQ,oBAAc;aAK3B,aAAQ,GAAG,2BAAiB,AAApB,CAAqB;IAiB7C,YACc,YAA0B,EAC1B,MAAyB,EACzB,eAAgC,EAChC,iBAAoC;QAE9C,KAAK,CAAC,GAAG,SAAS,CAAC,CAAC;QALV,iBAAY,GAAZ,YAAY,CAAc;QAC1B,WAAM,GAAN,MAAM,CAAmB;QACzB,oBAAe,GAAf,eAAe,CAAiB;QAChC,sBAAiB,GAAjB,iBAAiB,CAAmB;QAxBlD,UAAK,GAAG,iBAAiB,CAAC;QAC1B,cAAS,GAAG,oBAAS,CAAC;QACtB,WAAM,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC;QAE5D,uBAAkB,GAAG,OAAO,CAAC;QAC7B,0BAAqB,GAAG,KAAc,CAAC;QAEvC,mBAAc,GAAG;YACtB,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,IAAI,CAAC;YACxC,IAAA,oBAAU,EAAC;gBACP,QAAQ,EAAE,OAAO;gBACjB,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC;gBAC7B,SAAS,EAAE,IAAI,CAAC,kBAAkB;gBAClC,QAAQ,EAAE,IAAI,CAAC,kBAAkB;gBACjC,SAAS,EAAE,IAAI,CAAC,kBAAkB;aACrC,CAAC;YACF,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;YAC5B,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC;SAChC,CAAC;QAUE,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,iBAAiB,CAAC,eAAe,EAAE,CAAC,CAAC;QAC/D,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,iBAAiB,CAAC,eAAe,EAAE,CAAC,CAAC;QAC/D,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,iBAAiB,CAAC,eAAe,EAAE,CAAC,CAAC;IACpE,CAAC;IAEQ,KAAK,CAAC,IAAI;QACf,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;QAC7B,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACvB,CAAC;;AAtCQ,kCAAW;sBAAX,WAAW;IADvB,IAAA,oBAAS,GAAE;qCAwBoB,qBAAY;QAClB,iCAAiB;QACR,2BAAe;QACb,sCAAiB;GA1BzC,WAAW,CAwCvB;AAED,MAAM,QAAQ,GAAG,oBAAS,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;AAChD,kBAAe,QAAQ,CAAC;AACX,KAAiD,QAAQ,CAAC,UAAU,EAAE,EAApE,cAAM,cAAE,iBAAS,iBAAE,kBAAU,kBAAE,aAAK,aAAE,WAAG,UAA4B"} \ No newline at end of file diff --git a/build/services/robots-text.js b/build/services/robots-text.js new file mode 100644 index 0000000000000000000000000000000000000000..4ba8a8f1282476ba3c314e0f123d1b563980964d --- /dev/null +++ b/build/services/robots-text.js @@ -0,0 +1,131 @@ +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var _a; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.RobotsTxtService = exports.md5Hasher = void 0; +const tsyringe_1 = require("tsyringe"); +const url_1 = require("url"); +const civ_rpc_1 = require("civkit/civ-rpc"); +const async_service_1 = require("civkit/async-service"); +const hash_1 = require("civkit/hash"); +const lang_1 = require("civkit/lang"); +const logger_1 = require("./logger"); +const firebase_storage_bucket_1 = require("../shared/services/firebase-storage-bucket"); +const threaded_1 = require("../services/threaded"); +exports.md5Hasher = new hash_1.HashManager('md5', 'hex'); +let RobotsTxtService = class RobotsTxtService extends async_service_1.AsyncService { + constructor(globalLogger, firebaseStorageBucketControl) { + super(...arguments); + this.globalLogger = globalLogger; + this.firebaseStorageBucketControl = firebaseStorageBucketControl; + this.logger = this.globalLogger.child({ service: this.constructor.name }); + } + async init() { + await this.dependencyReady(); + this.emit('ready'); + } + async getCachedRobotTxt(origin) { + const digest = exports.md5Hasher.hash(origin.toLowerCase()); + const cacheLoc = `robots-txt/${digest}`; + let buff; + buff = await this.firebaseStorageBucketControl.downloadFile(cacheLoc).catch(() => undefined); + if (buff) { + return buff.toString(); + } + const r = await fetch(new url_1.URL('robots.txt', origin).href, { signal: AbortSignal.timeout(5000) }); + if (!r.ok) { + throw new civ_rpc_1.DownstreamServiceFailureError(`Failed to fetch robots.txt from ${origin}: ${r.status} ${r.statusText}`); + } + buff = Buffer.from(await r.arrayBuffer()); + this.firebaseStorageBucketControl.saveFile(cacheLoc, buff, { + contentType: 'text/plain' + }).catch((err) => { + this.logger.warn(`Failed to save robots.txt to cache: ${err}`, { err: (0, lang_1.marshalErrorLike)(err) }); + }); + return buff.toString(); + } + async assertAccessAllowed(url, inputMyUa = '*') { + let robotTxt = ''; + try { + robotTxt = await this.getCachedRobotTxt(url.origin); + } + catch (err) { + if (err instanceof civ_rpc_1.DownstreamServiceFailureError) { + // Remote server is reachable but cannot provide a robot.txt; this is treated as public access + return true; + } + throw new civ_rpc_1.AssertionFailureError(`Failed to load robots.txt from ${url.origin}: ${err}`); + } + const myUa = inputMyUa.toLowerCase(); + const lines = robotTxt.split(/\r?\n/g); + let currentUa = myUa || '*'; + let uaLine = 'User-Agent: *'; + const pathNormalized = `${url.pathname}?`; + for (const line of lines) { + const trimmed = line.trim(); + if (trimmed.startsWith('#') || !trimmed) { + continue; + } + const [k, ...rest] = trimmed.split(':'); + const key = k.trim().toLowerCase(); + const value = rest.join(':').trim(); + if (key === 'user-agent') { + currentUa = value.toLowerCase(); + if (value === '*') { + currentUa = myUa; + } + uaLine = line; + continue; + } + if (currentUa !== myUa) { + continue; + } + if (key === 'disallow') { + if (!value) { + return true; + } + if (value.includes('*')) { + const [head, tail] = value.split('*'); + if (url.pathname.startsWith(head) && url.pathname.endsWith(tail)) { + throw new civ_rpc_1.ResourcePolicyDenyError(`Access to ${url.href} is disallowed by site robots.txt: For ${uaLine}, ${line}`); + } + } + else if (pathNormalized.startsWith(value)) { + throw new civ_rpc_1.ResourcePolicyDenyError(`Access to ${url.href} is disallowed by site robots.txt: For ${uaLine}, ${line}`); + } + continue; + } + if (key === 'allow') { + if (!value) { + return true; + } + if (pathNormalized.startsWith(value)) { + return true; + } + continue; + } + } + return true; + } +}; +exports.RobotsTxtService = RobotsTxtService; +__decorate([ + (0, threaded_1.Threaded)(), + __metadata("design:type", Function), + __metadata("design:paramtypes", [typeof (_a = typeof url_1.URL !== "undefined" && url_1.URL) === "function" ? _a : Object, Object]), + __metadata("design:returntype", Promise) +], RobotsTxtService.prototype, "assertAccessAllowed", null); +exports.RobotsTxtService = RobotsTxtService = __decorate([ + (0, tsyringe_1.singleton)(), + __metadata("design:paramtypes", [logger_1.GlobalLogger, + firebase_storage_bucket_1.FirebaseStorageBucketControl]) +], RobotsTxtService); +//# sourceMappingURL=robots-text.js.map \ No newline at end of file diff --git a/build/services/robots-text.js.map b/build/services/robots-text.js.map new file mode 100644 index 0000000000000000000000000000000000000000..f5e5a0713013806a7822f270c9a6fbb8c4f918ea --- /dev/null +++ b/build/services/robots-text.js.map @@ -0,0 +1 @@ +{"version":3,"file":"robots-text.js","sourceRoot":"","sources":["../../src/services/robots-text.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/build/services/serp/compat.js b/build/services/serp/compat.js new file mode 100644 index 0000000000000000000000000000000000000000..2e8d3a0c13f8e03df9a5cac3aec7d50987c172c9 --- /dev/null +++ b/build/services/serp/compat.js @@ -0,0 +1,3 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +//# sourceMappingURL=compat.js.map \ No newline at end of file diff --git a/build/services/serp/compat.js.map b/build/services/serp/compat.js.map new file mode 100644 index 0000000000000000000000000000000000000000..177363e7c84b6d3eedfb6ac3fed51b8b15dcd811 --- /dev/null +++ b/build/services/serp/compat.js.map @@ -0,0 +1 @@ +{"version":3,"file":"compat.js","sourceRoot":"","sources":["../../../src/services/serp/compat.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/build/services/serp/google.js b/build/services/serp/google.js new file mode 100644 index 0000000000000000000000000000000000000000..97a16c13ca3a1f8bbf7b0dce3c14e5e78f9178bb --- /dev/null +++ b/build/services/serp/google.js @@ -0,0 +1,281 @@ +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +var _a, _b; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.GoogleSERP = void 0; +const tsyringe_1 = require("tsyringe"); +const async_service_1 = require("civkit/async-service"); +const logger_1 = require("../logger"); +const jsdom_1 = require("../jsdom"); +const worker_threads_1 = require("worker_threads"); +const lodash_1 = __importDefault(require("lodash")); +const puppeteer_1 = require("./puppeteer"); +const curl_1 = require("../curl"); +const promises_1 = require("fs/promises"); +const civ_rpc_1 = require("civkit/civ-rpc"); +const errors_1 = require("../errors"); +const vectorize_1 = require("civkit/vectorize"); +const decorators_1 = require("civkit/decorators"); +const proxy_provider_1 = require("../../shared/services/proxy-provider"); +let GoogleSERP = class GoogleSERP extends async_service_1.AsyncService { + constructor(globalLogger, puppeteerControl, jsDomControl, curlControl, proxyProvider) { + const filteredDeps = worker_threads_1.isMainThread ? arguments : lodash_1.default.without(arguments, puppeteerControl); + super(...filteredDeps); + this.globalLogger = globalLogger; + this.puppeteerControl = puppeteerControl; + this.jsDomControl = jsDomControl; + this.curlControl = curlControl; + this.proxyProvider = proxyProvider; + this.logger = this.globalLogger.child({ service: this.constructor.name }); + this.googleDomain = process.env.OVERRIDE_GOOGLE_DOMAIN || 'www.google.com'; + } + async init() { + await this.dependencyReady(); + this.emit('ready'); + } + async sideLoadWithAllocatedProxy(url, opts) { + if (opts?.allocProxy === 'none') { + return this.curlControl.sideLoad(url, opts); + } + const proxy = await this.proxyProvider.alloc(process.env.PREFERRED_PROXY_COUNTRY || 'auto'); + this.logger.debug(`Proxy allocated`, { proxy: proxy.href }); + const r = await this.curlControl.sideLoad(url, { + ...opts, + proxyUrl: proxy.href, + }); + if (r.status === 429) { + throw new errors_1.ServiceBadAttemptError('Google returned a 429 error. This may happen due to various reasons, including rate limiting or other issues.'); + } + if (opts && opts.allocProxy) { + opts.proxyUrl ??= proxy.href; + } + return { ...r, proxy }; + } + digestQuery(query) { + const url = new URL(`https://${this.googleDomain}/search`); + const clone = { ...query }; + const num = clone.num || 10; + if (clone.page) { + const page = parseInt(clone.page); + delete clone.page; + clone.start = (page - 1) * num; + if (clone.start === 0) { + delete clone.start; + } + } + if (clone.location) { + delete clone.location; + } + for (const [k, v] of Object.entries(clone)) { + if (v === undefined || v === null) { + continue; + } + url.searchParams.set(k, `${v}`); + } + return url; + } + async webSearch(query, opts) { + const url = this.digestQuery(query); + const sideLoaded = await this.sideLoadWithAllocatedProxy(url, opts); + if (opts && sideLoaded.sideLoadOpts) { + opts.sideLoad = sideLoaded.sideLoadOpts; + } + const snapshot = await this.puppeteerControl.controlledScrap(url, getWebSearchResults, opts); + return snapshot; + } + async newsSearch(query, opts) { + const url = this.digestQuery(query); + url.searchParams.set('tbm', 'nws'); + const sideLoaded = await this.sideLoadWithAllocatedProxy(url, opts); + if (opts && sideLoaded.sideLoadOpts) { + opts.sideLoad = sideLoaded.sideLoadOpts; + } + const snapshot = await this.puppeteerControl.controlledScrap(url, getNewsSearchResults, opts); + return snapshot; + } + async imageSearch(query, opts) { + const url = this.digestQuery(query); + url.searchParams.set('tbm', 'isch'); + url.searchParams.set('asearch', 'isch'); + url.searchParams.set('async', `_fmt:json,p:1,ijn:${query.start ? Math.floor(query.start / (query.num || 10)) : 0}`); + const sideLoaded = await this.sideLoadWithAllocatedProxy(url, opts); + if (sideLoaded.status !== 200 || !sideLoaded.file) { + throw new errors_1.ServiceBadAttemptError('Google returned an error page. This may happen due to various reasons, including rate limiting or other issues.'); + } + const jsonTxt = (await (0, promises_1.readFile)((await sideLoaded.file.filePath))).toString(); + const rJSON = (0, vectorize_1.parseJSONText)(jsonTxt.slice(jsonTxt.indexOf('{"ischj":'))); + return lodash_1.default.get(rJSON, 'ischj.metadata').map((x) => { + return { + link: lodash_1.default.get(x, 'result.referrer_url'), + title: lodash_1.default.get(x, 'result.page_title'), + snippet: lodash_1.default.get(x, 'text_in_grid.snippet'), + source: lodash_1.default.get(x, 'result.site_title'), + imageWidth: lodash_1.default.get(x, 'original_image.width'), + imageHeight: lodash_1.default.get(x, 'original_image.height'), + imageUrl: lodash_1.default.get(x, 'original_image.url'), + variant: 'images', + }; + }); + } +}; +exports.GoogleSERP = GoogleSERP; +__decorate([ + (0, decorators_1.retryWith)((err) => { + if (err instanceof errors_1.ServiceBadApproachError) { + return false; + } + if (err instanceof errors_1.ServiceBadAttemptError) { + // Keep trying + return true; + } + if (err instanceof civ_rpc_1.ApplicationError) { + // Quit with this error + return false; + } + return undefined; + }, 3), + __metadata("design:type", Function), + __metadata("design:paramtypes", [typeof (_b = typeof URL !== "undefined" && URL) === "function" ? _b : Object, Object]), + __metadata("design:returntype", Promise) +], GoogleSERP.prototype, "sideLoadWithAllocatedProxy", null); +exports.GoogleSERP = GoogleSERP = __decorate([ + (0, tsyringe_1.singleton)(), + __metadata("design:paramtypes", [logger_1.GlobalLogger, + puppeteer_1.SERPSpecializedPuppeteerControl, + jsdom_1.JSDomControl, + curl_1.CurlControl, typeof (_a = typeof proxy_provider_1.ProxyProviderService !== "undefined" && proxy_provider_1.ProxyProviderService) === "function" ? _a : Object]) +], GoogleSERP); +async function getWebSearchResults() { + if (location.pathname.startsWith('/sorry') || location.pathname.startsWith('/error')) { + throw new Error('Google returned an error page. This may happen due to various reasons, including rate limiting or other issues.'); + } + // @ts-ignore + await Promise.race([window.waitForSelector('div[data-async-context^="query"]'), window.waitForSelector('#botstuff .mnr-c')]); + const wrapper1 = document.querySelector('div[data-async-context^="query"]'); + if (!wrapper1) { + return undefined; + } + const query = decodeURIComponent(wrapper1.getAttribute('data-async-context')?.split('query:')[1] || ''); + if (!query) { + return undefined; + } + const candidates = Array.from(wrapper1.querySelectorAll('div[lang],div[data-surl]')); + return candidates.map((x, pos) => { + const primaryLink = x.querySelector('a:not([href="#"])'); + if (!primaryLink) { + return undefined; + } + const url = primaryLink.getAttribute('href'); + if (primaryLink.querySelector('div[role="heading"]')) { + // const spans = primaryLink.querySelectorAll('span'); + // const title = spans[0]?.textContent; + // const source = spans[1]?.textContent; + // const date = spans[spans.length - 1].textContent; + // return { + // link: url, + // title, + // source, + // date, + // variant: 'video' + // }; + return undefined; + } + const title = primaryLink.querySelector('h3')?.textContent; + const source = Array.from(primaryLink.querySelectorAll('span')).find((x) => x.textContent)?.textContent; + const cite = primaryLink.querySelector('cite[role=text]')?.textContent; + let date = cite?.split('·')[1]?.trim(); + const snippets = Array.from(x.querySelectorAll('div[data-sncf*="1"] span')); + let snippet = snippets[snippets.length - 1]?.textContent; + if (!snippet) { + snippet = x.querySelector('div.IsZvec')?.textContent?.trim() || null; + } + date ??= snippets[snippets.length - 2]?.textContent?.trim(); + const imageUrl = x.querySelector('div[data-sncf*="1"] img[src]:not(img[src^="data"])')?.getAttribute('src'); + let siteLinks = Array.from(x.querySelectorAll('div[data-sncf*="3"] a[href]')).map((l) => { + return { + link: l.getAttribute('href'), + title: l.textContent, + }; + }); + const perhapsParent = x.parentElement?.closest('div[data-hveid]'); + if (!siteLinks?.length && perhapsParent) { + const candidates = Array.from(perhapsParent.querySelectorAll('td h3')); + if (candidates.length) { + siteLinks = candidates.map((l) => { + const link = l.querySelector('a'); + if (!link) { + return undefined; + } + const snippet = l.nextElementSibling?.textContent; + return { + link: link.getAttribute('href'), + title: link.textContent, + snippet, + }; + }).filter(Boolean); + } + } + return { + link: url, + title, + source, + date, + snippet: snippet ?? undefined, + imageUrl: imageUrl?.startsWith('data:') ? undefined : imageUrl, + siteLinks: siteLinks.length ? siteLinks : undefined, + variant: 'web', + }; + }).filter(Boolean); +} +async function getNewsSearchResults() { + if (location.pathname.startsWith('/sorry') || location.pathname.startsWith('/error')) { + throw new Error('Google returned an error page. This may happen due to various reasons, including rate limiting or other issues.'); + } + // @ts-ignore + await Promise.race([window.waitForSelector('div[data-async-context^="query"]'), window.waitForSelector('#botstuff .mnr-c')]); + const wrapper1 = document.querySelector('div[data-async-context^="query"]'); + if (!wrapper1) { + return undefined; + } + const query = decodeURIComponent(wrapper1.getAttribute('data-async-context')?.split('query:')[1] || ''); + if (!query) { + return undefined; + } + const candidates = Array.from(wrapper1.querySelectorAll('div[data-news-doc-id]')); + return candidates.map((x) => { + const primaryLink = x.querySelector('a:not([href="#"])'); + if (!primaryLink) { + return undefined; + } + const url = primaryLink.getAttribute('href'); + const titleElem = primaryLink.querySelector('div[role="heading"]'); + if (!titleElem) { + return undefined; + } + const title = titleElem.textContent?.trim(); + const source = titleElem.previousElementSibling?.textContent?.trim(); + const snippet = titleElem.nextElementSibling?.textContent?.trim(); + const innerSpans = Array.from(titleElem.parentElement?.querySelectorAll('span') || []); + const date = innerSpans[innerSpans.length - 1]?.textContent?.trim(); + return { + link: url, + title, + source, + date, + snippet, + variant: 'news', + }; + }).filter(Boolean); +} +//# sourceMappingURL=google.js.map \ No newline at end of file diff --git a/build/services/serp/google.js.map b/build/services/serp/google.js.map new file mode 100644 index 0000000000000000000000000000000000000000..54013294cd4701c9c3727e9b3e9ec4103a6df193 --- /dev/null +++ b/build/services/serp/google.js.map @@ -0,0 +1 @@ +{"version":3,"file":"google.js","sourceRoot":"","sources":["../../../src/services/serp/google.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/build/services/serp/internal.js b/build/services/serp/internal.js new file mode 100644 index 0000000000000000000000000000000000000000..34e8ea99b3c5a2eccea3b012277277c547fdf450 --- /dev/null +++ b/build/services/serp/internal.js @@ -0,0 +1,76 @@ +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.InternalJinaSerpService = void 0; +const tsyringe_1 = require("tsyringe"); +const logger_1 = require("../logger"); +const secrets_1 = require("../../shared/services/secrets"); +const async_context_1 = require("../async-context"); +const blackhole_detector_1 = require("../blackhole-detector"); +const async_service_1 = require("civkit/async-service"); +const internal_serp_1 = require("../../shared/3rd-party/internal-serp"); +let InternalJinaSerpService = class InternalJinaSerpService extends async_service_1.AsyncService { + constructor(globalLogger, secretExposer, threadLocal, blackHoleDetector) { + super(...arguments); + this.globalLogger = globalLogger; + this.secretExposer = secretExposer; + this.threadLocal = threadLocal; + this.blackHoleDetector = blackHoleDetector; + this.logger = this.globalLogger.child({ service: this.constructor.name }); + } + async init() { + await this.dependencyReady(); + this.emit('ready'); + this.client = new internal_serp_1.JinaSerpApiHTTP(this.secretExposer.JINA_SERP_API_KEY); + } + async doSearch(variant, query) { + this.logger.debug(`Doing external search`, query); + let results; + switch (variant) { + // case 'images': { + // const r = await this.client.imageSearch(query); + // results = r.parsed.images; + // break; + // } + // case 'news': { + // const r = await this.client.newsSearch(query); + // results = r.parsed.news; + // break; + // } + case 'web': + default: { + const r = await this.client.webSearch(query); + results = r.parsed.results?.map((x) => ({ ...x, link: x.url })); + break; + } + } + this.blackHoleDetector.itWorked(); + return results; + } + async webSearch(query) { + return this.doSearch('web', query); + } + async imageSearch(query) { + return this.doSearch('images', query); + } + async newsSearch(query) { + return this.doSearch('news', query); + } +}; +exports.InternalJinaSerpService = InternalJinaSerpService; +exports.InternalJinaSerpService = InternalJinaSerpService = __decorate([ + (0, tsyringe_1.singleton)(), + __metadata("design:paramtypes", [logger_1.GlobalLogger, + secrets_1.SecretExposer, + async_context_1.AsyncLocalContext, + blackhole_detector_1.BlackHoleDetector]) +], InternalJinaSerpService); +//# sourceMappingURL=internal.js.map \ No newline at end of file diff --git a/build/services/serp/internal.js.map b/build/services/serp/internal.js.map new file mode 100644 index 0000000000000000000000000000000000000000..70a352100983d6848fcc458d271cb04540f597cb --- /dev/null +++ b/build/services/serp/internal.js.map @@ -0,0 +1 @@ +{"version":3,"file":"internal.js","sourceRoot":"","sources":["../../../src/services/serp/internal.ts"],"names":[],"mappings":";;;;;;;;;;;;AACA,uCAAqC;AACrC,sCAAyC;AACzC,2DAA8D;AAC9D,oDAAqD;AAErD,8DAA0D;AAC1D,wDAAoD;AACpD,wEAAuE;AAIhE,IAAM,uBAAuB,GAA7B,MAAM,uBAAwB,SAAQ,4BAAY;IAMrD,YACc,YAA0B,EAC1B,aAA4B,EAC5B,WAA8B,EAC9B,iBAAoC;QAE9C,KAAK,CAAC,GAAG,SAAS,CAAC,CAAC;QALV,iBAAY,GAAZ,YAAY,CAAc;QAC1B,kBAAa,GAAb,aAAa,CAAe;QAC5B,gBAAW,GAAX,WAAW,CAAmB;QAC9B,sBAAiB,GAAjB,iBAAiB,CAAmB;QARlD,WAAM,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC;IAWrE,CAAC;IAEQ,KAAK,CAAC,IAAI;QACf,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;QAC7B,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAEnB,IAAI,CAAC,MAAM,GAAG,IAAI,+BAAe,CAAC,IAAI,CAAC,aAAa,CAAC,iBAAiB,CAAC,CAAC;IAC5E,CAAC;IAGD,KAAK,CAAC,QAAQ,CAAC,OAAkC,EAAE,KAA8B;QAC7E,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,uBAAuB,EAAE,KAAK,CAAC,CAAC;QAClD,IAAI,OAAO,CAAC;QACZ,QAAQ,OAAO,EAAE,CAAC;YACd,mBAAmB;YACnB,sDAAsD;YAEtD,iCAAiC;YACjC,aAAa;YACb,IAAI;YACJ,iBAAiB;YACjB,qDAAqD;YAErD,+BAA+B;YAC/B,aAAa;YACb,IAAI;YACJ,KAAK,KAAK,CAAC;YACX,OAAO,CAAC,CAAC,CAAC;gBACN,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;gBAE7C,OAAO,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;gBAChE,MAAM;YACV,CAAC;QACL,CAAC;QAED,IAAI,CAAC,iBAAiB,CAAC,QAAQ,EAAE,CAAC;QAElC,OAAO,OAA2B,CAAC;IACvC,CAAC;IAGD,KAAK,CAAC,SAAS,CAAC,KAA8B;QAC1C,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IACvC,CAAC;IACD,KAAK,CAAC,WAAW,CAAC,KAA8B;QAC5C,OAAO,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IAC1C,CAAC;IACD,KAAK,CAAC,UAAU,CAAC,KAA8B;QAC3C,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IACxC,CAAC;CAEJ,CAAA;AAhEY,0DAAuB;kCAAvB,uBAAuB;IADnC,IAAA,oBAAS,GAAE;qCAQoB,qBAAY;QACX,uBAAa;QACf,iCAAiB;QACX,sCAAiB;GAVzC,uBAAuB,CAgEnC"} \ No newline at end of file diff --git a/build/services/serp/puppeteer.js b/build/services/serp/puppeteer.js new file mode 100644 index 0000000000000000000000000000000000000000..86880da325441d5960f309c20eeb6a5367a3df68 --- /dev/null +++ b/build/services/serp/puppeteer.js @@ -0,0 +1,666 @@ +"use strict"; +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __importStar = (this && this.__importStar) || (function () { + var ownKeys = function(o) { + ownKeys = Object.getOwnPropertyNames || function (o) { + var ar = []; + for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; + return ar; + }; + return ownKeys(o); + }; + return function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); + __setModuleDefault(result, mod); + return result; + }; +})(); +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.SERPSpecializedPuppeteerControl = void 0; +const lodash_1 = __importDefault(require("lodash")); +const promises_1 = require("fs/promises"); +const tsyringe_1 = require("tsyringe"); +const puppeteer_1 = __importStar(require("puppeteer")); +const defer_1 = require("civkit/defer"); +const civ_rpc_1 = require("civkit/civ-rpc"); +const async_service_1 = require("civkit/async-service"); +const timeout_1 = require("civkit/timeout"); +const errors_1 = require("../../shared/lib/errors"); +const curl_1 = require("../curl"); +const async_context_1 = require("../async-context"); +const logger_1 = require("../logger"); +const minimal_stealth_1 = require("../minimal-stealth"); +const blackhole_detector_1 = require("../blackhole-detector"); +const SIMULATE_SCROLL = ` +(function () { + function createIntersectionObserverEntry(target, isIntersecting, timestamp) { + const targetRect = target.getBoundingClientRect(); + const record = { + target, + isIntersecting, + time: timestamp, + // If intersecting, intersectionRect matches boundingClientRect + // If not intersecting, intersectionRect is empty (0x0) + intersectionRect: isIntersecting + ? targetRect + : new DOMRectReadOnly(0, 0, 0, 0), + // Current bounding client rect of the target + boundingClientRect: targetRect, + // Intersection ratio is either 0 (not intersecting) or 1 (fully intersecting) + intersectionRatio: isIntersecting ? 1 : 0, + // Root bounds (viewport in our case) + rootBounds: new DOMRectReadOnly( + 0, + 0, + window.innerWidth, + window.innerHeight + ) + }; + Object.setPrototypeOf(record, window.IntersectionObserverEntry.prototype); + return record; + } + function cloneIntersectionObserverEntry(entry) { + const record = { + target: entry.target, + isIntersecting: entry.isIntersecting, + time: entry.time, + intersectionRect: entry.intersectionRect, + boundingClientRect: entry.boundingClientRect, + intersectionRatio: entry.intersectionRatio, + rootBounds: entry.rootBounds + }; + Object.setPrototypeOf(record, window.IntersectionObserverEntry.prototype); + return record; + } + const orig = window.IntersectionObserver; + const kCallback = Symbol('callback'); + const kLastEntryMap = Symbol('lastEntryMap'); + const liveObservers = new Map(); + class MangledIntersectionObserver extends orig { + constructor(callback, options) { + super((entries, observer) => { + const lastEntryMap = observer[kLastEntryMap]; + const lastEntry = entries[entries.length - 1]; + lastEntryMap.set(lastEntry.target, lastEntry); + return callback(entries, observer); + }, options); + this[kCallback] = callback; + this[kLastEntryMap] = new WeakMap(); + liveObservers.set(this, new Set()); + } + disconnect() { + liveObservers.get(this)?.clear(); + liveObservers.delete(this); + return super.disconnect(); + } + observe(target) { + const observer = liveObservers.get(this); + observer?.add(target); + return super.observe(target); + } + unobserve(target) { + const observer = liveObservers.get(this); + observer?.delete(target); + return super.unobserve(target); + } + } + Object.defineProperty(MangledIntersectionObserver, 'name', { value: 'IntersectionObserver', writable: false }); + window.IntersectionObserver = MangledIntersectionObserver; + function simulateScroll() { + for (const [observer, targets] of liveObservers.entries()) { + const t0 = performance.now(); + for (const target of targets) { + const entry = createIntersectionObserverEntry(target, true, t0); + observer[kCallback]([entry], observer); + setTimeout(() => { + const t1 = performance.now(); + const lastEntry = observer[kLastEntryMap].get(target); + if (!lastEntry) { + return; + } + const entry2 = { ...cloneIntersectionObserverEntry(lastEntry), time: t1 }; + observer[kCallback]([entry2], observer); + }); + } + } + } + window.simulateScroll = simulateScroll; +})(); +`; +const MUTATION_IDLE_WATCH = ` +(function () { + let timeout; + const sendMsg = ()=> { + document.dispatchEvent(new CustomEvent('mutationIdle')); + }; + + const cb = () => { + if (timeout) { + clearTimeout(timeout); + timeout = setTimeout(sendMsg, 200); + } + }; + const mutationObserver = new MutationObserver(cb); + + document.addEventListener('DOMContentLoaded', () => { + mutationObserver.observe(document.documentElement, { + childList: true, + subtree: true, + }); + timeout = setTimeout(sendMsg, 200); + }, { once: true }) +})(); +`; +const SCRIPT_TO_INJECT_INTO_FRAME = ` +${SIMULATE_SCROLL} +${MUTATION_IDLE_WATCH} +(${minimal_stealth_1.minimalStealth.toString()})(); + +(function(){ + +let lastMutationIdle = 0; +let initialAnalytics; +document.addEventListener('mutationIdle', ()=> lastMutationIdle = Date.now()); + +function waitForSelector(selectorText) { + return new Promise((resolve) => { + const existing = document.querySelector(selectorText); + if (existing) { + resolve(existing); + return; + } + if (document.readyState === 'loading') { + document.addEventListener('DOMContentLoaded', () => { + const observer = new MutationObserver(() => { + const elem = document.querySelector(selectorText); + if (elem) { + resolve(document.querySelector(selectorText)); + observer.disconnect(); + } + }); + observer.observe(document.documentElement, { + childList: true, + subtree: true + }); + }); + return; + } + const observer = new MutationObserver(() => { + const elem = document.querySelector(selectorText); + if (elem) { + resolve(document.querySelector(selectorText)); + observer.disconnect(); + } + }); + observer.observe(document.documentElement, { + childList: true, + subtree: true + }); + }); +} +window.waitForSelector = waitForSelector; +})(); +`; +let SERPSpecializedPuppeteerControl = class SERPSpecializedPuppeteerControl extends async_service_1.AsyncService { + constructor(globalLogger, asyncLocalContext, curlControl, blackHoleDetector) { + super(...arguments); + this.globalLogger = globalLogger; + this.asyncLocalContext = asyncLocalContext; + this.curlControl = curlControl; + this.blackHoleDetector = blackHoleDetector; + this._sn = 0; + this.logger = this.globalLogger.child({ service: this.constructor.name }); + this.__loadedPage = []; + this.finalizerMap = new WeakMap(); + this.snMap = new WeakMap(); + this.livePages = new Set(); + this.lastPageCratedAt = 0; + this.ua = ''; + this.effectiveUA = ''; + this._REPORT_FUNCTION_NAME = 'bingo'; + this.lifeCycleTrack = new WeakMap(); + this.setMaxListeners(Infinity); + let crippledTimes = 0; + this.on('crippled', () => { + crippledTimes += 1; + this.__loadedPage.length = 0; + this.livePages.clear(); + if (crippledTimes > 5) { + process.nextTick(() => { + this.emit('error', new Error('Browser crashed too many times, quitting...')); + // process.exit(1); + }); + } + }); + } + async init() { + await this.dependencyReady(); + if (process.env.NODE_ENV?.includes('dry-run')) { + this.emit('ready'); + return; + } + if (this.browser) { + if (this.browser.connected) { + await this.browser.close(); + } + else { + this.browser.process()?.kill('SIGKILL'); + } + } + this.browser = await puppeteer_1.default.launch({ + timeout: 10_000, + headless: !Boolean(process.env.DEBUG_BROWSER), + executablePath: process.env.OVERRIDE_CHROME_EXECUTABLE_PATH, + args: [ + '--disable-dev-shm-usage', '--disable-blink-features=AutomationControlled' + ] + }).catch((err) => { + this.logger.error(`Unknown firebase issue, just die fast.`, { err }); + process.nextTick(() => { + this.emit('error', err); + // process.exit(1); + }); + return Promise.reject(err); + }); + this.browser.once('disconnected', () => { + this.logger.warn(`Browser disconnected`); + if (this.browser) { + this.emit('crippled'); + } + process.nextTick(() => this.serviceReady()); + }); + this.ua = await this.browser.userAgent(); + this.logger.info(`Browser launched: ${this.browser.process()?.pid}, ${this.ua}`); + this.effectiveUA = this.ua.replace(/Headless/i, '').replace('Mozilla/5.0 (X11; Linux x86_64)', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)'); + this.curlControl.impersonateChrome(this.effectiveUA); + await this.newPage('beware_deadlock').then((r) => this.__loadedPage.push(r)); + this.emit('ready'); + } + async newPage(bewareDeadLock = false) { + if (!bewareDeadLock) { + await this.serviceReady(); + } + const sn = this._sn++; + let page; + try { + const dedicatedContext = await this.browser.createBrowserContext(); + page = await dedicatedContext.newPage(); + } + catch (err) { + this.logger.warn(`Failed to create page ${sn}`, { err }); + this.browser.process()?.kill('SIGKILL'); + throw new errors_1.ServiceNodeResourceDrainError(`This specific worker node failed to open a new page, try again.`); + } + const preparations = []; + preparations.push(page.setUserAgent(this.effectiveUA)); + // preparations.push(page.setUserAgent(`Slackbot-LinkExpanding 1.0 (+https://api.slack.com/robots)`)); + // preparations.push(page.setUserAgent(`Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; GPTBot/1.0; +https://openai.com/gptbot)`)); + preparations.push(page.setBypassCSP(true)); + preparations.push(page.setViewport({ width: 1024, height: 1024 })); + preparations.push(page.exposeFunction(this._REPORT_FUNCTION_NAME, (thing) => { + page.emit(this._REPORT_FUNCTION_NAME, thing); + })); + preparations.push(page.exposeFunction('setViewport', (viewport) => { + page.setViewport(viewport).catch(() => undefined); + })); + preparations.push(page.evaluateOnNewDocument(SCRIPT_TO_INJECT_INTO_FRAME)); + await Promise.all(preparations); + this.snMap.set(page, sn); + this.logger.debug(`Page ${sn} created.`); + this.lastPageCratedAt = Date.now(); + this.livePages.add(page); + return page; + } + async getNextPage() { + let thePage; + if (this.__loadedPage.length) { + thePage = this.__loadedPage.shift(); + if (this.__loadedPage.length <= 1) { + process.nextTick(() => { + this.newPage() + .then((r) => this.__loadedPage.push(r)) + .catch((err) => { + this.logger.warn(`Failed to load new page ahead of time`, { err }); + }); + }); + } + } + if (!thePage) { + thePage = await this.newPage(); + } + const timer = setTimeout(() => { + this.logger.warn(`Page is not allowed to live past 5 minutes, ditching page ${this.snMap.get(thePage)}...`); + this.ditchPage(thePage); + }, 300 * 1000); + this.finalizerMap.set(thePage, timer); + return thePage; + } + async ditchPage(page) { + if (this.finalizerMap.has(page)) { + clearTimeout(this.finalizerMap.get(page)); + this.finalizerMap.delete(page); + } + if (page.isClosed()) { + return; + } + const sn = this.snMap.get(page); + this.logger.debug(`Closing page ${sn}`); + await Promise.race([ + (async () => { + const ctx = page.browserContext(); + try { + await page.close(); + } + finally { + await ctx.close(); + } + })(), + (0, timeout_1.delay)(5000) + ]).catch((err) => { + this.logger.error(`Failed to destroy page ${sn}`, { err }); + }); + this.livePages.delete(page); + } + async controlledScrap(parsedUrl, func, options = {}) { + // parsedUrl.search = ''; + const url = parsedUrl.toString(); + const page = await this.getNextPage(); + this.lifeCycleTrack.set(page, this.asyncLocalContext.ctx); + page.on('response', (_resp) => { + this.blackHoleDetector.itWorked(); + }); + page.on('request', async (req) => { + if (req.isInterceptResolutionHandled()) { + return; + } + ; + const reqUrlParsed = new URL(req.url()); + if (!reqUrlParsed.protocol.startsWith('http')) { + const overrides = req.continueRequestOverrides(); + return req.continue(overrides, 0); + } + const typ = req.resourceType(); + if (typ === 'media' || typ === 'font' || typ === 'image' || typ === 'stylesheet') { + // Non-cooperative answer to block all media requests. + return req.abort('blockedbyclient'); + } + if (!options.proxyResources) { + const isDocRequest = ['document', 'xhr', 'fetch', 'websocket', 'prefetch', 'eventsource', 'ping'].includes(typ); + if (!isDocRequest) { + if (options.extraHeaders) { + const overrides = req.continueRequestOverrides(); + const continueArgs = [{ + ...overrides, + headers: { + ...req.headers(), + ...overrides?.headers, + ...options.extraHeaders, + } + }, 1]; + return req.continue(continueArgs[0], continueArgs[1]); + } + const overrides = req.continueRequestOverrides(); + return req.continue(overrides, 0); + } + } + const sideload = options.sideLoad; + const impersonate = sideload?.impersonate[reqUrlParsed.href]; + if (impersonate) { + let body; + if (impersonate.body) { + body = await (0, promises_1.readFile)(await impersonate.body.filePath); + if (req.isInterceptResolutionHandled()) { + return; + } + } + return req.respond({ + status: impersonate.status, + headers: impersonate.headers, + contentType: impersonate.contentType, + body: body ? Uint8Array.from(body) : undefined, + }, 999); + } + const proxy = options.proxyUrl || sideload?.proxyOrigin?.[reqUrlParsed.origin]; + const ctx = this.lifeCycleTrack.get(page); + if (proxy && ctx) { + return await this.asyncLocalContext.bridge(ctx, async () => { + try { + const curled = await this.curlControl.sideLoad(reqUrlParsed, { + ...options, + method: req.method(), + body: req.postData(), + extraHeaders: { + ...req.headers(), + ...options.extraHeaders, + }, + proxyUrl: proxy + }); + if (req.isInterceptResolutionHandled()) { + return; + } + ; + if (curled.chain.length === 1) { + if (!curled.file) { + return req.respond({ + status: curled.status, + headers: lodash_1.default.omit(curled.headers, 'result'), + contentType: curled.contentType, + }, 3); + } + const body = await (0, promises_1.readFile)(await curled.file.filePath); + if (req.isInterceptResolutionHandled()) { + return; + } + ; + return req.respond({ + status: curled.status, + headers: lodash_1.default.omit(curled.headers, 'result'), + contentType: curled.contentType, + body: Uint8Array.from(body), + }, 3); + } + options.sideLoad ??= curled.sideLoadOpts; + lodash_1.default.merge(options.sideLoad, curled.sideLoadOpts); + const firstReq = curled.chain[0]; + return req.respond({ + status: firstReq.result.code, + headers: lodash_1.default.omit(firstReq, 'result'), + }, 3); + } + catch (err) { + this.logger.warn(`Failed to sideload browser request ${reqUrlParsed.origin}`, { href: reqUrlParsed.href, err, proxy }); + } + if (req.isInterceptResolutionHandled()) { + return; + } + ; + const overrides = req.continueRequestOverrides(); + const continueArgs = [{ + ...overrides, + headers: { + ...req.headers(), + ...overrides?.headers, + ...options.extraHeaders, + } + }, 1]; + return req.continue(continueArgs[0], continueArgs[1]); + }); + } + if (req.isInterceptResolutionHandled()) { + return; + } + ; + const overrides = req.continueRequestOverrides(); + const continueArgs = [{ + ...overrides, + headers: { + ...req.headers(), + ...overrides?.headers, + ...options.extraHeaders, + } + }, 1]; + return req.continue(continueArgs[0], continueArgs[1]); + }); + await page.setRequestInterception(true); + const sn = this.snMap.get(page); + this.logger.info(`Page ${sn}: Scraping ${url}`, { url }); + await page.evaluateOnNewDocument(`(function () { +if (window.top !== window.self) { + return; +} +const func = ${func.toString()}; + +func().then((result) => { + window.${this._REPORT_FUNCTION_NAME}({data: result}); +}).catch((err) => { + window.${this._REPORT_FUNCTION_NAME}({err: err}); +}); + +})();`); + if (options.locale) { + // Add headers via request interception to walk around this bug + // https://github.com/puppeteer/puppeteer/issues/10235 + // await page.setExtraHTTPHeaders({ + // 'Accept-Language': options.locale + // }); + await page.evaluateOnNewDocument(() => { + Object.defineProperty(navigator, "language", { + get: function () { + return options.locale; + } + }); + Object.defineProperty(navigator, "languages", { + get: function () { + return [options.locale]; + } + }); + }); + } + if (options.cookies) { + const mapped = options.cookies.map((x) => { + const draft = { + name: x.name, + value: encodeURIComponent(x.value), + secure: x.secure, + domain: x.domain, + path: x.path, + expires: x.expires ? Math.floor(x.expires.valueOf() / 1000) : undefined, + sameSite: x.sameSite, + }; + if (!draft.expires && x.maxAge) { + draft.expires = Math.floor(Date.now() / 1000) + x.maxAge; + } + if (!draft.domain) { + draft.url = parsedUrl.toString(); + } + return draft; + }); + try { + await page.setCookie(...mapped); + } + catch (err) { + this.logger.warn(`Page ${sn}: Failed to set cookies`, { err }); + throw new civ_rpc_1.ParamValidationError({ + path: 'cookies', + message: `Failed to set cookies: ${err?.message}` + }); + } + } + if (options.overrideUserAgent) { + await page.setUserAgent(options.overrideUserAgent); + } + if (options.viewport) { + await page.setViewport(options.viewport); + } + const resultDeferred = (0, defer_1.Defer)(); + const crippleListener = () => resultDeferred.reject(new errors_1.ServiceCrashedError({ message: `Browser crashed, try again` })); + this.once('crippled', crippleListener); + resultDeferred.promise.finally(() => { + this.off('crippled', crippleListener); + }); + const hdl = (s) => { + if (s.err) { + resultDeferred.reject(s.err); + } + resultDeferred.resolve(s.data); + }; + page.on(this._REPORT_FUNCTION_NAME, hdl); + page.once('abuse', (event) => { + this.emit('abuse', { ...event, url: parsedUrl }); + resultDeferred.reject(new errors_1.SecurityCompromiseError(`Abuse detected: ${event.reason}`)); + }); + const timeout = options.timeoutMs || 30_000; + const goToOptions = { + waitUntil: ['load', 'domcontentloaded', 'networkidle0'], + timeout, + }; + if (options.referer) { + goToOptions.referer = options.referer; + } + const gotoPromise = page.goto(url, goToOptions) + .catch((err) => { + if (err instanceof puppeteer_1.TimeoutError) { + this.logger.warn(`Page ${sn}: Browsing of ${url} timed out`, { err }); + return new civ_rpc_1.AssertionFailureError({ + message: `Failed to goto ${url}: ${err}`, + cause: err, + }); + } + this.logger.warn(`Page ${sn}: Browsing of ${url} aborted`, { err }); + return undefined; + }).then(async (r) => { + await (0, timeout_1.delay)(5000); + resultDeferred.reject(new puppeteer_1.TimeoutError(`Control function did not respond in time`)); + return r; + }); + try { + await Promise.race([resultDeferred.promise, gotoPromise]); + return resultDeferred.promise; + } + finally { + page.off(this._REPORT_FUNCTION_NAME, hdl); + this.ditchPage(page); + resultDeferred.resolve(); + } + } +}; +exports.SERPSpecializedPuppeteerControl = SERPSpecializedPuppeteerControl; +exports.SERPSpecializedPuppeteerControl = SERPSpecializedPuppeteerControl = __decorate([ + (0, tsyringe_1.singleton)(), + __metadata("design:paramtypes", [logger_1.GlobalLogger, + async_context_1.AsyncLocalContext, + curl_1.CurlControl, + blackhole_detector_1.BlackHoleDetector]) +], SERPSpecializedPuppeteerControl); +const puppeteerControl = tsyringe_1.container.resolve(SERPSpecializedPuppeteerControl); +exports.default = puppeteerControl; +//# sourceMappingURL=puppeteer.js.map \ No newline at end of file diff --git a/build/services/serp/puppeteer.js.map b/build/services/serp/puppeteer.js.map new file mode 100644 index 0000000000000000000000000000000000000000..d96f63f781f3879d630acd507da8381a2c058de4 --- /dev/null +++ b/build/services/serp/puppeteer.js.map @@ -0,0 +1 @@ +{"version":3,"file":"puppeteer.js","sourceRoot":"","sources":["../../../src/services/serp/puppeteer.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/build/services/snapshot-formatter.js b/build/services/snapshot-formatter.js new file mode 100644 index 0000000000000000000000000000000000000000..bcafa05229396da667cbb65fdbf0f0c070a03bd3 --- /dev/null +++ b/build/services/snapshot-formatter.js @@ -0,0 +1,750 @@ +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +var _a; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.SnapshotFormatter = exports.md5Hasher = void 0; +exports.highlightedCodeBlock = highlightedCodeBlock; +const crypto_1 = require("crypto"); +const tsyringe_1 = require("tsyringe"); +const civkit_1 = require("civkit"); +const turndown_1 = __importDefault(require("turndown")); +const logger_1 = require("./logger"); +const firebase_storage_bucket_1 = require("../shared/services/firebase-storage-bucket"); +const async_context_1 = require("../shared/services/async-context"); +const threaded_1 = require("../services/threaded"); +const jsdom_1 = require("./jsdom"); +const alt_text_1 = require("./alt-text"); +const pdf_extract_1 = require("./pdf-extract"); +const misc_1 = require("../utils/misc"); +const lodash_1 = __importDefault(require("lodash")); +const http_1 = require("http"); +const encoding_1 = require("../utils/encoding"); +const url_1 = require("url"); +const openai_1 = require("../shared/utils/openai"); +exports.md5Hasher = new civkit_1.HashManager('md5', 'hex'); +const gfmPlugin = require('turndown-plugin-gfm'); +const highlightRegExp = /highlight-(?:text|source)-([a-z0-9]+)/; +function highlightedCodeBlock(turndownService) { + turndownService.addRule('highlightedCodeBlock', { + filter: (node) => { + return (node.nodeName === 'DIV' && + node.firstChild?.nodeName === 'PRE' && + highlightRegExp.test(node.className)); + }, + replacement: (_content, node, options) => { + const className = node.className || ''; + const language = (className.match(highlightRegExp) || [null, ''])[1]; + return ('\n\n' + options.fence + language + '\n' + + node.firstChild.textContent + + '\n' + options.fence + '\n\n'); + } + }); +} +let SnapshotFormatter = class SnapshotFormatter extends civkit_1.AsyncService { + constructor(globalLogger, jsdomControl, altTextService, pdfExtractor, threadLocal, firebaseObjectStorage) { + super(...arguments); + this.globalLogger = globalLogger; + this.jsdomControl = jsdomControl; + this.altTextService = altTextService; + this.pdfExtractor = pdfExtractor; + this.threadLocal = threadLocal; + this.firebaseObjectStorage = firebaseObjectStorage; + this.logger = this.globalLogger.child({ service: this.constructor.name }); + this.gfmPlugin = [gfmPlugin.tables, highlightedCodeBlock, gfmPlugin.strikethrough, gfmPlugin.taskListItems]; + this.gfmNoTable = [highlightedCodeBlock, gfmPlugin.strikethrough, gfmPlugin.taskListItems]; + } + async init() { + await this.dependencyReady(); + this.emit('ready'); + } + async formatSnapshot(mode, snapshot, nominalUrl, urlValidMs = 3600 * 1000 * 4) { + const t0 = Date.now(); + const f = { + ...(await this.getGeneralSnapshotMixins(snapshot)), + }; + let modeOK = false; + if (mode.includes('screenshot')) { + modeOK = true; + if (snapshot.screenshot && !snapshot.screenshotUrl) { + const fid = `instant-screenshots/${(0, crypto_1.randomUUID)()}`; + await this.firebaseObjectStorage.saveFile(fid, snapshot.screenshot, { + metadata: { + contentType: 'image/png', + } + }); + snapshot.screenshotUrl = await this.firebaseObjectStorage.signDownloadUrl(fid, Date.now() + urlValidMs); + } + Object.assign(f, { + screenshotUrl: snapshot.screenshotUrl, + }); + Object.defineProperty(f, 'textRepresentation', { value: `${f.screenshotUrl}\n`, enumerable: false, configurable: true }); + } + if (mode.includes('pageshot')) { + modeOK = true; + if (snapshot.pageshot && !snapshot.pageshotUrl) { + const fid = `instant-screenshots/${(0, crypto_1.randomUUID)()}`; + await this.firebaseObjectStorage.saveFile(fid, snapshot.pageshot, { + metadata: { + contentType: 'image/png', + } + }); + snapshot.pageshotUrl = await this.firebaseObjectStorage.signDownloadUrl(fid, Date.now() + urlValidMs); + } + Object.assign(f, { + html: snapshot.html, + pageshotUrl: snapshot.pageshotUrl, + }); + Object.defineProperty(f, 'textRepresentation', { value: `${f.pageshotUrl}\n`, enumerable: false, configurable: true }); + } + if (mode.includes('html')) { + modeOK = true; + Object.assign(f, { + html: snapshot.html, + }); + Object.defineProperty(f, 'textRepresentation', { value: snapshot.html, enumerable: false, configurable: true }); + } + let pdfMode = false; + // in case of Google Web Cache content + if (snapshot.pdfs?.length && (!snapshot.title || snapshot.title.startsWith('cache:'))) { + const pdf = await this.pdfExtractor.cachedExtract(snapshot.pdfs[0], this.threadLocal.get('cacheTolerance'), snapshot.pdfs[0].startsWith('http') ? undefined : snapshot.href); + if (pdf) { + pdfMode = true; + snapshot.title = pdf.meta?.Title; + snapshot.text = pdf.text || snapshot.text; + snapshot.parsed = { + content: pdf.content, + textContent: pdf.content, + length: pdf.content?.length, + byline: pdf.meta?.Author, + lang: pdf.meta?.Language || undefined, + title: pdf.meta?.Title, + publishedTime: this.pdfExtractor.parsePdfDate(pdf.meta?.ModDate || pdf.meta?.CreationDate)?.toISOString(), + }; + } + } + if (mode.includes('text')) { + modeOK = true; + Object.assign(f, { + text: snapshot.text, + }); + Object.defineProperty(f, 'textRepresentation', { value: snapshot.text, enumerable: false, configurable: true }); + } + if (mode.includes('lm')) { + modeOK = true; + f.content = snapshot.parsed?.textContent; + } + if (modeOK && (mode.includes('lm') || + (!mode.includes('markdown') && !mode.includes('content')))) { + const dt = Date.now() - t0; + this.logger.debug(`Formatting took ${dt}ms`, { mode, url: nominalUrl?.toString(), dt }); + const formatted = { + title: (snapshot.parsed?.title || snapshot.title || '').trim(), + description: (snapshot.description || '').trim(), + url: nominalUrl?.toString() || snapshot.href?.trim(), + publishedTime: snapshot.parsed?.publishedTime || undefined, + }; + Object.assign(f, formatted); + return f; + } + const imgDataUrlToObjectUrl = !Boolean(this.threadLocal.get('keepImgDataUrl')); + let contentText = ''; + const imageSummary = {}; + const imageIdxTrack = new Map(); + const uid = this.threadLocal.get('uid'); + do { + if (pdfMode) { + contentText = (snapshot.parsed?.content || snapshot.text || '').trim(); + break; + } + if (snapshot.maxElemDepth > 256 || + (!uid && snapshot.elemCount > 10_000) || + snapshot.elemCount > 80_000) { + this.logger.warn('Degrading to text to protect the server', { url: snapshot.href, elemDepth: snapshot.maxElemDepth, elemCount: snapshot.elemCount }); + contentText = (snapshot.text || '').trimEnd(); + break; + } + const noGFMOpts = this.threadLocal.get('noGfm'); + const imageRetention = this.threadLocal.get('retainImages'); + let imgIdx = 0; + const urlToAltMap = {}; + const customRules = { + 'img-retention': { + filter: 'img', + replacement: (_content, node) => { + if (imageRetention === 'none') { + return ''; + } + const alt = (0, misc_1.cleanAttribute)(node.getAttribute('alt')); + if (imageRetention === 'alt') { + return alt ? `(Image ${++imgIdx}: ${alt})` : ''; + } + const originalSrc = (node.getAttribute('src') || '').trim(); + let linkPreferredSrc = originalSrc; + const maybeSrcSet = (node.getAttribute('srcset') || '').trim(); + if (!linkPreferredSrc && maybeSrcSet) { + linkPreferredSrc = maybeSrcSet.split(',').map((x) => x.trim()).filter(Boolean)[0]; + } + if (!linkPreferredSrc || linkPreferredSrc.startsWith('data:')) { + const dataSrc = (node.getAttribute('data-src') || '').trim(); + if (dataSrc && !dataSrc.startsWith('data:')) { + linkPreferredSrc = dataSrc; + } + } + let src; + try { + src = new URL(linkPreferredSrc, snapshot.rebase || nominalUrl).toString(); + } + catch (_err) { + void 0; + } + if (!src) { + return ''; + } + const keySrc = (originalSrc.startsWith('data:') ? this.dataUrlToBlobUrl(originalSrc, snapshot.rebase) : src).trim(); + const mapped = urlToAltMap[keySrc]; + const imgSerial = ++imgIdx; + const idxArr = imageIdxTrack.has(keySrc) ? imageIdxTrack.get(keySrc) : []; + idxArr.push(imgSerial); + imageIdxTrack.set(keySrc, idxArr); + if (mapped) { + imageSummary[keySrc] = mapped || alt; + if (imageRetention === 'alt_p') { + return `(Image ${imgSerial}: ${mapped || alt})`; + } + if (imgDataUrlToObjectUrl) { + return `![Image ${imgSerial}: ${mapped || alt}](${keySrc})`; + } + return `![Image ${imgSerial}: ${mapped || alt}](${src})`; + } + else if (imageRetention === 'alt_p') { + return alt ? `(Image ${imgSerial}: ${alt})` : ''; + } + imageSummary[keySrc] = alt || ''; + if (imgDataUrlToObjectUrl) { + return alt ? `![Image ${imgSerial}: ${alt}](${keySrc})` : `![Image ${imgSerial}](${keySrc})`; + } + return alt ? `![Image ${imgSerial}: ${alt}](${src})` : `![Image ${imgSerial}](${src})`; + } + } + }; + const optsMixin = { + url: snapshot.rebase || nominalUrl, + customRules, + customKeep: noGFMOpts === 'table' ? 'table' : undefined, + imgDataUrlToObjectUrl, + }; + const jsDomElementOfHTML = this.jsdomControl.snippetToElement(snapshot.html, snapshot.href); + let toBeTurnedToMd = jsDomElementOfHTML; + let turnDownService = this.getTurndown({ ...optsMixin }); + if (!mode.includes('markdown') && snapshot.parsed?.content) { + const jsDomElementOfParsed = this.jsdomControl.snippetToElement(snapshot.parsed.content, snapshot.href); + const par1 = this.jsdomControl.runTurndown(turnDownService, jsDomElementOfHTML); + imgIdx = 0; + const par2 = snapshot.parsed.content ? this.jsdomControl.runTurndown(turnDownService, jsDomElementOfParsed) : ''; + // If Readability did its job + if (par2.length >= 0.3 * par1.length) { + turnDownService = this.getTurndown({ noRules: true, ...optsMixin }); + imgIdx = 0; + if (snapshot.parsed.content) { + toBeTurnedToMd = jsDomElementOfParsed; + } + } + } + if (!noGFMOpts) { + turnDownService = turnDownService.use(noGFMOpts === 'table' ? this.gfmNoTable : this.gfmPlugin); + } + // _p is the special suffix for withGeneratedAlt + if (snapshot.imgs?.length && imageRetention?.endsWith('_p')) { + const tasks = lodash_1.default.uniqBy((snapshot.imgs || []), 'src').map(async (x) => { + const r = await this.altTextService.getAltText(x).catch((err) => { + this.logger.warn(`Failed to get alt text for ${x.src}`, { err: (0, civkit_1.marshalErrorLike)(err) }); + return undefined; + }); + if (r && x.src) { + // note x.src here is already rebased to absolute url by browser/upstream. + const keySrc = (x.src.startsWith('data:') ? this.dataUrlToBlobUrl(x.src, snapshot.rebase) : x.src).trim(); + urlToAltMap[keySrc] = r; + } + }); + await Promise.all(tasks); + } + if (toBeTurnedToMd) { + try { + contentText = this.jsdomControl.runTurndown(turnDownService, toBeTurnedToMd).trim(); + imgIdx = 0; + } + catch (err) { + this.logger.warn(`Turndown failed to run, retrying without plugins`, { err }); + const vanillaTurnDownService = this.getTurndown({ ...optsMixin }); + try { + contentText = this.jsdomControl.runTurndown(vanillaTurnDownService, toBeTurnedToMd).trim(); + imgIdx = 0; + } + catch (err2) { + this.logger.warn(`Turndown failed to run, giving up`, { err: err2 }); + } + } + } + if (this.isPoorlyTransformed(contentText, toBeTurnedToMd) + && toBeTurnedToMd !== jsDomElementOfHTML) { + toBeTurnedToMd = jsDomElementOfHTML; + try { + contentText = this.jsdomControl.runTurndown(turnDownService, jsDomElementOfHTML).trim(); + imgIdx = 0; + } + catch (err) { + this.logger.warn(`Turndown failed to run, retrying without plugins`, { err }); + const vanillaTurnDownService = this.getTurndown({ ...optsMixin }); + try { + contentText = this.jsdomControl.runTurndown(vanillaTurnDownService, jsDomElementOfHTML).trim(); + imgIdx = 0; + } + catch (err2) { + this.logger.warn(`Turndown failed to run, giving up`, { err: err2 }); + } + } + } + if (mode === 'content' && this.isPoorlyTransformed(contentText, toBeTurnedToMd)) { + contentText = (snapshot.text || '').trimEnd(); + } + } while (false); + const formatted = { + title: (snapshot.parsed?.title || snapshot.title || '').trim(), + description: (snapshot.description || '').trim(), + url: nominalUrl?.toString() || snapshot.href?.trim(), + content: contentText, + publishedTime: snapshot.parsed?.publishedTime || undefined, + }; + if (snapshot.status) { + const code = snapshot.status; + const n = code - 200; + if (n < 0 || n >= 200) { + const text = snapshot.statusText || http_1.STATUS_CODES[code]; + formatted.warning ??= ''; + const msg = `Target URL returned error ${code}${text ? `: ${text}` : ''}`; + formatted.warning = `${formatted.warning}${formatted.warning ? '\n' : ''}${msg}`; + } + } + if (this.threadLocal.get('withImagesSummary')) { + formatted.images = + (0, lodash_1.default)(imageSummary) + .toPairs() + .map(([url, alt], i) => { + const idxTrack = imageIdxTrack.get(url); + const tag = idxTrack?.length ? `Image ${lodash_1.default.uniq(idxTrack).join(',')}` : `Hidden Image ${i + 1}`; + return [`${tag}${alt ? `: ${alt}` : ''}`, url]; + }).fromPairs() + .value(); + } + if (this.threadLocal.get('withLinksSummary')) { + const links = (await this.jsdomControl.inferSnapshot(snapshot)).links; + if (this.threadLocal.get('withLinksSummary') === 'all') { + formatted.links = links; + } + else { + formatted.links = (0, lodash_1.default)(links).filter(([_label, href]) => !href.startsWith('file:') && !href.startsWith('javascript:')).uniqBy(1).fromPairs().value(); + } + } + if ((0, openai_1.countGPTToken)(formatted.content) < 200) { + formatted.warning ??= ''; + if (snapshot.isIntermediate) { + const msg = 'This page maybe not yet fully loaded, consider explicitly specify a timeout.'; + formatted.warning = `${formatted.warning}${formatted.warning ? '\n' : ''}${msg}`; + } + if (snapshot.childFrames?.length && !this.threadLocal.get('withIframe')) { + const msg = 'This page contains iframe that are currently hidden, consider enabling iframe processing.'; + formatted.warning = `${formatted.warning}${formatted.warning ? '\n' : ''}${msg}`; + } + if (snapshot.shadowExpanded && !this.threadLocal.get('withShadowDom')) { + const msg = 'This page contains shadow DOM that are currently hidden, consider enabling shadow DOM processing.'; + formatted.warning = `${formatted.warning}${formatted.warning ? '\n' : ''}${msg}`; + } + if (snapshot.html.includes('captcha') || snapshot.html.includes('cf-turnstile-response')) { + const msg = 'This page maybe requiring CAPTCHA, please make sure you are authorized to access this page.'; + formatted.warning = `${formatted.warning}${formatted.warning ? '\n' : ''}${msg}`; + } + if (snapshot.isFromCache) { + const msg = 'This is a cached snapshot of the original page, consider retry with caching opt-out.'; + formatted.warning = `${formatted.warning}${formatted.warning ? '\n' : ''}${msg}`; + } + } + Object.assign(f, formatted); + const textRepresentation = (function () { + const mixins = []; + if (this.publishedTime) { + mixins.push(`Published Time: ${this.publishedTime}`); + } + const suffixMixins = []; + if (this.images) { + const imageSummaryChunks = ['Images:']; + for (const [k, v] of Object.entries(this.images)) { + imageSummaryChunks.push(`- ![${k}](${v})`); + } + if (imageSummaryChunks.length === 1) { + imageSummaryChunks.push('This page does not seem to contain any images.'); + } + suffixMixins.push(imageSummaryChunks.join('\n')); + } + if (this.links) { + const linkSummaryChunks = ['Links/Buttons:']; + if (Array.isArray(this.links)) { + for (const [k, v] of this.links) { + linkSummaryChunks.push(`- [${k}](${v})`); + } + } + else { + for (const [k, v] of Object.entries(this.links)) { + linkSummaryChunks.push(`- [${k}](${v})`); + } + } + if (linkSummaryChunks.length === 1) { + linkSummaryChunks.push('This page does not seem to contain any buttons/links.'); + } + suffixMixins.push(linkSummaryChunks.join('\n')); + } + if (this.warning) { + mixins.push(this.warning.split('\n').map((v) => `Warning: ${v}`).join('\n')); + } + if (mode.includes('markdown')) { + return `${mixins.length ? `${mixins.join('\n\n')}\n\n` : ''}${this.content} +${suffixMixins.length ? `\n${suffixMixins.join('\n\n')}\n` : ''}`; + } + return `Title: ${this.title} + +URL Source: ${this.url} +${mixins.length ? `\n${mixins.join('\n\n')}\n` : ''} +Markdown Content: +${this.content} +${suffixMixins.length ? `\n${suffixMixins.join('\n\n')}\n` : ''}`; + }).call(formatted); + Object.defineProperty(f, 'textRepresentation', { value: textRepresentation, enumerable: false }); + const dt = Date.now() - t0; + this.logger.debug(`Formatting took ${dt}ms`, { mode, url: nominalUrl?.toString(), dt }); + return f; + } + dataUrlToBlobUrl(dataUrl, baseUrl = 'http://localhost/') { + const refUrl = new URL(baseUrl); + const mappedUrl = new URL(`blob:${refUrl.origin || 'localhost'}/${exports.md5Hasher.hash(dataUrl)}`); + return mappedUrl.href; + } + async getGeneralSnapshotMixins(snapshot) { + let inferred; + const mixin = {}; + if (this.threadLocal.get('withImagesSummary')) { + inferred ??= await this.jsdomControl.inferSnapshot(snapshot); + const imageSummary = {}; + const imageIdxTrack = new Map(); + let imgIdx = 0; + for (const img of inferred.imgs) { + const imgSerial = ++imgIdx; + const keySrc = (img.src.startsWith('data:') ? this.dataUrlToBlobUrl(img.src, snapshot.rebase) : img.src).trim(); + const idxArr = imageIdxTrack.has(keySrc) ? imageIdxTrack.get(keySrc) : []; + idxArr.push(imgSerial); + imageIdxTrack.set(keySrc, idxArr); + imageSummary[keySrc] = img.alt || ''; + } + mixin.images = + (0, lodash_1.default)(imageSummary) + .toPairs() + .map(([url, alt], i) => { + const idxTrack = imageIdxTrack.get(url); + const tag = idxTrack?.length ? `Image ${lodash_1.default.uniq(idxTrack).join(',')}` : `Hidden Image ${i + 1}`; + return [`${tag}${alt ? `: ${alt}` : ''}`, url]; + }).fromPairs() + .value(); + } + if (this.threadLocal.get('withLinksSummary')) { + inferred ??= await this.jsdomControl.inferSnapshot(snapshot); + if (this.threadLocal.get('withLinksSummary') === 'all') { + mixin.links = inferred.links; + } + else { + mixin.links = (0, lodash_1.default)(inferred.links).filter(([_label, href]) => !href.startsWith('file:') && !href.startsWith('javascript:')).uniqBy(1).fromPairs().value(); + } + } + if (snapshot.status) { + const code = snapshot.status; + const n = code - 200; + if (n < 0 || n >= 200) { + const text = snapshot.statusText || http_1.STATUS_CODES[code]; + mixin.warning ??= ''; + const msg = `Target URL returned error ${code}${text ? `: ${text}` : ''}`; + mixin.warning = `${mixin.warning}${mixin.warning ? '\n' : ''}${msg}`; + } + } + return mixin; + } + getTurndown(options) { + const turndownOpts = this.threadLocal.get('turndownOpts'); + const turnDownService = new turndown_1.default({ + ...turndownOpts, + codeBlockStyle: 'fenced', + preformattedCode: true, + }); + if (options?.customKeep) { + turnDownService.keep(options.customKeep); + } + if (!options?.noRules) { + turnDownService.addRule('remove-irrelevant', { + filter: ['meta', 'style', 'script', 'noscript', 'link', 'textarea', 'select'], + replacement: () => '' + }); + turnDownService.addRule('truncate-svg', { + filter: 'svg', + replacement: () => '' + }); + turnDownService.addRule('title-as-h1', { + filter: ['title'], + replacement: (innerText) => `${innerText}\n===============\n` + }); + } + if (options?.imgDataUrlToObjectUrl) { + turnDownService.addRule('data-url-to-pseudo-object-url', { + filter: (node) => Boolean(node.tagName === 'IMG' && node.getAttribute('src')?.startsWith('data:')), + replacement: (_content, node) => { + const src = (node.getAttribute('src') || '').trim(); + const alt = (0, misc_1.cleanAttribute)(node.getAttribute('alt')) || ''; + const blobUrl = this.dataUrlToBlobUrl(src, options.url?.toString()); + return `![${alt}](${blobUrl})`; + } + }); + } + if (options?.customRules) { + for (const [k, v] of Object.entries(options.customRules)) { + turnDownService.addRule(k, v); + } + } + turnDownService.addRule('improved-heading', { + filter: ['h1', 'h2', 'h3', 'h4', 'h5', 'h6'], + replacement: (content, node, options) => { + const hLevel = Number(node.nodeName.charAt(1)); + if (options.headingStyle === 'setext' && hLevel < 3) { + const underline = lodash_1.default.repeat((hLevel === 1 ? '=' : '-'), Math.min(128, content.length)); + return ('\n\n' + content + '\n' + underline + '\n\n'); + } + else { + return '\n\n' + lodash_1.default.repeat('#', hLevel) + ' ' + content + '\n\n'; + } + } + }); + turnDownService.addRule('improved-paragraph', { + filter: 'p', + replacement: (innerText) => { + const trimmed = innerText.trim(); + if (!trimmed) { + return ''; + } + return `${trimmed.replace(/\n{3,}/g, '\n\n')}\n\n`; + } + }); + let realLinkStyle = 'inlined'; + if (turndownOpts?.linkStyle === 'referenced' || turndownOpts?.linkReferenceStyle) { + realLinkStyle = 'referenced'; + if (turndownOpts?.linkReferenceStyle === 'collapsed') { + realLinkStyle = 'collapsed'; + } + else if (turndownOpts?.linkReferenceStyle === 'shortcut') { + realLinkStyle = 'shortcut'; + } + else if (turndownOpts?.linkReferenceStyle === 'discarded') { + realLinkStyle = 'discarded'; + } + } + else if (turndownOpts?.linkStyle === 'discarded') { + realLinkStyle = 'discarded'; + } + turnDownService.addRule('improved-link', { + filter: function (node, _options) { + return Boolean(node.nodeName === 'A' && + node.getAttribute('href')); + }, + replacement: function (content, node) { + var href = node.getAttribute('href'); + let title = (0, misc_1.cleanAttribute)(node.getAttribute('title')); + if (title) + title = ` "${title.replace(/"/g, '\\"')}"`; + let replacement; + let reference; + const fixedContent = content.replace(/\s+/g, ' ').trim(); + let fixedHref = href; + if (options?.url) { + try { + fixedHref = new URL(fixedHref, options.url).toString(); + } + catch (_err) { + void 0; + } + } + switch (realLinkStyle) { + case 'inlined': + replacement = `[${fixedContent}](${fixedHref}${title || ''})`; + reference = undefined; + break; + case 'collapsed': + replacement = `[${fixedContent}][]`; + reference = `[${fixedContent}]: ${fixedHref}${title}`; + break; + case 'shortcut': + replacement = `[${fixedContent}]`; + reference = `[${fixedContent}]: ${fixedHref}${title}`; + break; + case 'discarded': + replacement = content; + reference = undefined; + break; + default: + const id = this.references.length + 1; + replacement = `[${fixedContent}][${id}]`; + reference = `[${id}]${fixedHref}${title}`; + } + if (reference) { + this.references.push(reference); + } + return replacement; + }, + // @ts-ignore + references: [], + append: function () { + let references = ''; + if (this.references.length) { + references = `\n\n${this.references.join('\n')}\n\n`; + this.references = []; // Reset references + } + return references; + } + }); + turnDownService.addRule('improved-code', { + filter: function (node) { + let hasSiblings = node.previousSibling || node.nextSibling; + let isCodeBlock = node.parentNode.nodeName === 'PRE' && !hasSiblings; + return node.nodeName === 'CODE' && !isCodeBlock; + }, + replacement: function (inputContent) { + if (!inputContent) + return ''; + let content = inputContent; + let delimiter = '`'; + let matches = content.match(/`+/gm) || []; + while (matches.indexOf(delimiter) !== -1) + delimiter = delimiter + '`'; + if (content.includes('\n')) { + delimiter = '```'; + } + let extraSpace = delimiter === '```' ? '\n' : /^`|^ .*?[^ ].* $|`$/.test(content) ? ' ' : ''; + return delimiter + extraSpace + content + (delimiter === '```' && !content.endsWith(extraSpace) ? extraSpace : '') + delimiter; + } + }); + return turnDownService; + } + isPoorlyTransformed(content, node) { + if (!content) { + return true; + } + if (content.startsWith('<') && content.endsWith('>')) { + return true; + } + if (!this.threadLocal.get('noGfm') && content.includes('')) { + if (node?.textContent && content.length > node.textContent.length * 0.8) { + return true; + } + const tableElms = node?.querySelectorAll('table') || []; + const deepTableElms = node?.querySelectorAll('table table'); + if (node && tableElms.length) { + const wrappingTables = lodash_1.default.without(tableElms, ...Array.from(deepTableElms || [])); + const tableTextsLength = lodash_1.default.sum(wrappingTables.map((x) => (x.innerHTML?.length || 0))); + if (tableTextsLength / (content.length) > 0.6) { + return true; + } + } + const tbodyElms = node?.querySelectorAll('tbody') || []; + const deepTbodyElms = node?.querySelectorAll('tbody tbody'); + if ((deepTbodyElms?.length || 0) / tbodyElms.length > 0.6) { + return true; + } + } + return false; + } + async createSnapshotFromFile(url, file, overrideContentType, overrideFileName) { + if (overrideContentType === 'application/octet-stream') { + overrideContentType = undefined; + } + const contentType = (overrideContentType || await file.mimeType).toLowerCase(); + const fileName = overrideFileName || `${url.origin}${url.pathname}`; + const snapshot = { + title: '', + href: url.href, + html: '', + text: '' + }; + if (contentType.startsWith('image/')) { + snapshot.html = `${fileName}`; + snapshot.title = fileName; + snapshot.imgs = [{ src: url.href }]; + return snapshot; + } + try { + const encoding = contentType.includes('charset=') ? contentType.split('charset=')[1]?.trim().toLowerCase() : 'utf-8'; + if (contentType.startsWith('text/html')) { + if ((await file.size) > 1024 * 1024 * 32) { + throw new civkit_1.AssertionFailureError(`Failed to access ${url}: file too large`); + } + snapshot.html = await (0, encoding_1.readFile)(await file.filePath, encoding); + let innerCharset; + const peek = snapshot.html.slice(0, 1024); + innerCharset ??= peek.match(/]+text\/html;\s*?charset=([^>"]+)/i)?.[1]?.toLowerCase(); + innerCharset ??= peek.match(/]+charset="([^>"]+)\"/i)?.[1]?.toLowerCase(); + if (innerCharset && innerCharset !== encoding) { + snapshot.html = await (0, encoding_1.readFile)(await file.filePath, innerCharset); + } + return snapshot; + } + if (contentType.startsWith('text/') || contentType.startsWith('application/json')) { + if ((await file.size) > 1024 * 1024 * 32) { + throw new civkit_1.AssertionFailureError(`Failed to access ${url}: file too large`); + } + snapshot.text = await (0, encoding_1.readFile)(await file.filePath, encoding); + snapshot.html = `
${snapshot.text}
`; + return snapshot; + } + if (contentType.startsWith('application/pdf')) { + snapshot.pdfs = [(0, url_1.pathToFileURL)(await file.filePath).href]; + return snapshot; + } + } + catch (err) { + this.logger.warn(`Failed to read from file: ${url}`, { err, url }); + throw new civkit_1.DataStreamBrokenError(`Failed to access ${url}: ${err?.message}`); + } + throw new civkit_1.AssertionFailureError(`Failed to access ${url}: unexpected type ${contentType}`); + } +}; +exports.SnapshotFormatter = SnapshotFormatter; +__decorate([ + (0, threaded_1.Threaded)(), + __metadata("design:type", Function), + __metadata("design:paramtypes", [String, Object, typeof (_a = typeof URL !== "undefined" && URL) === "function" ? _a : Object, Object]), + __metadata("design:returntype", Promise) +], SnapshotFormatter.prototype, "formatSnapshot", null); +exports.SnapshotFormatter = SnapshotFormatter = __decorate([ + (0, tsyringe_1.singleton)(), + __metadata("design:paramtypes", [logger_1.GlobalLogger, + jsdom_1.JSDomControl, + alt_text_1.AltTextService, + pdf_extract_1.PDFExtractor, + async_context_1.AsyncContext, + firebase_storage_bucket_1.FirebaseStorageBucketControl]) +], SnapshotFormatter); +const snapshotFormatter = tsyringe_1.container.resolve(SnapshotFormatter); +exports.default = snapshotFormatter; +//# sourceMappingURL=snapshot-formatter.js.map \ No newline at end of file diff --git a/build/services/snapshot-formatter.js.map b/build/services/snapshot-formatter.js.map new file mode 100644 index 0000000000000000000000000000000000000000..7c3f7f52529a2d6f834c2390d327d3feb49cf743 --- /dev/null +++ b/build/services/snapshot-formatter.js.map @@ -0,0 +1 @@ +{"version":3,"file":"snapshot-formatter.js","sourceRoot":"","sources":["../../src/services/snapshot-formatter.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/build/services/temp-file.js b/build/services/temp-file.js new file mode 100644 index 0000000000000000000000000000000000000000..e363ea8a394f4a70cb13419a709c6077b3718841 --- /dev/null +++ b/build/services/temp-file.js @@ -0,0 +1,42 @@ +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.TempFileManager = void 0; +const temp_1 = require("civkit/temp"); +const promises_1 = require("fs/promises"); +const tsyringe_1 = require("tsyringe"); +const finalizer_1 = require("./finalizer"); +let TempFileManager = class TempFileManager extends temp_1.AbstractTempFileManger { + constructor() { + super(...arguments); + this.rootDir = ''; + } + async init() { + await this.dependencyReady(); + await super.init(); + this.emit('ready'); + } + async standDown() { + await super.standDown(); + await (0, promises_1.rm)(this.rootDir, { recursive: true, force: true }); + } +}; +exports.TempFileManager = TempFileManager; +__decorate([ + (0, finalizer_1.Finalizer)(), + __metadata("design:type", Function), + __metadata("design:paramtypes", []), + __metadata("design:returntype", Promise) +], TempFileManager.prototype, "standDown", null); +exports.TempFileManager = TempFileManager = __decorate([ + (0, tsyringe_1.singleton)() +], TempFileManager); +//# sourceMappingURL=temp-file.js.map \ No newline at end of file diff --git a/build/services/temp-file.js.map b/build/services/temp-file.js.map new file mode 100644 index 0000000000000000000000000000000000000000..b425e01be51569bf25e92fc6c50e680466448a79 --- /dev/null +++ b/build/services/temp-file.js.map @@ -0,0 +1 @@ +{"version":3,"file":"temp-file.js","sourceRoot":"","sources":["../../src/services/temp-file.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,sCAAqD;AACrD,0CAAiC;AACjC,uCAAqC;AACrC,2CAAwC;AAGjC,IAAM,eAAe,GAArB,MAAM,eAAgB,SAAQ,6BAAsB;IAApD;;QAEH,YAAO,GAAG,EAAE,CAAC;IAcjB,CAAC;IAZY,KAAK,CAAC,IAAI;QACf,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;QAC7B,MAAM,KAAK,CAAC,IAAI,EAAE,CAAC;QACnB,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACvB,CAAC;IAGc,AAAN,KAAK,CAAC,SAAS;QACpB,MAAM,KAAK,CAAC,SAAS,EAAE,CAAC;QAExB,MAAM,IAAA,aAAE,EAAC,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7D,CAAC;CACJ,CAAA;AAhBY,0CAAe;AAWT;IADd,IAAA,qBAAS,GAAE;;;;gDAKX;0BAfQ,eAAe;IAD3B,IAAA,oBAAS,GAAE;GACC,eAAe,CAgB3B"} \ No newline at end of file diff --git a/build/services/threaded.js b/build/services/threaded.js new file mode 100644 index 0000000000000000000000000000000000000000..b4ad9a36820ff78292182ab7ffeca7f4fecc7c8a --- /dev/null +++ b/build/services/threaded.js @@ -0,0 +1,66 @@ +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +var _a; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Threaded = exports.RPCReflect = exports.Ctx = exports.Param = exports.Method = exports.ThreadedServiceRegistry = void 0; +require("reflect-metadata"); +const tsyringe_1 = require("tsyringe"); +const threaded_1 = require("civkit/threaded"); +const lodash_1 = __importDefault(require("lodash")); +const logger_1 = require("./logger"); +const async_context_1 = require("./async-context"); +const pseudo_transfer_1 = require("./pseudo-transfer"); +const os_1 = require("os"); +const worker_threads_1 = require("worker_threads"); +let ThreadedServiceRegistry = class ThreadedServiceRegistry extends threaded_1.AbstractThreadedServiceRegistry { + constructor(globalLogger, asyncContext, pseudoTransfer) { + super(...arguments); + this.globalLogger = globalLogger; + this.asyncContext = asyncContext; + this.pseudoTransfer = pseudoTransfer; + this.container = tsyringe_1.container; + this.logger = this.globalLogger.child({ service: this.constructor.name }); + } + setMaxWorkersByCpu() { + const cpuStat = (0, os_1.cpus)(); + const evenCpuCycles = cpuStat.filter((_cpu, i) => i % 2 === 0).reduce((acc, cpu) => acc + cpu.times.user + cpu.times.sys, 0); + const oddCpuCycles = cpuStat.filter((_cpu, i) => i % 2 === 1).reduce((acc, cpu) => acc + cpu.times.user + cpu.times.sys, 0); + const isLikelyHyperThreaded = (oddCpuCycles / evenCpuCycles) < 0.5; + this.maxWorkers = isLikelyHyperThreaded ? cpuStat.length / 2 : cpuStat.length; + } + async init() { + await this.dependencyReady(); + await super.init(); + if (worker_threads_1.isMainThread) { + this.setMaxWorkersByCpu(); + await Promise.all(lodash_1.default.range(0, 2).map((_n) => new Promise((resolve, reject) => { + this.createWorker() + .once('message', resolve) + .once('error', reject); + }))); + } + this.emit('ready'); + } +}; +exports.ThreadedServiceRegistry = ThreadedServiceRegistry; +exports.ThreadedServiceRegistry = ThreadedServiceRegistry = __decorate([ + (0, tsyringe_1.singleton)(), + __metadata("design:paramtypes", [logger_1.GlobalLogger, + async_context_1.AsyncLocalContext, + pseudo_transfer_1.PseudoTransfer]) +], ThreadedServiceRegistry); +const instance = tsyringe_1.container.resolve(ThreadedServiceRegistry); +exports.default = instance; +_a = instance.decorators(), exports.Method = _a.Method, exports.Param = _a.Param, exports.Ctx = _a.Ctx, exports.RPCReflect = _a.RPCReflect, exports.Threaded = _a.Threaded; +//# sourceMappingURL=threaded.js.map \ No newline at end of file diff --git a/build/services/threaded.js.map b/build/services/threaded.js.map new file mode 100644 index 0000000000000000000000000000000000000000..2a106c3365dea520b3891bb9653a2e5743789bad --- /dev/null +++ b/build/services/threaded.js.map @@ -0,0 +1 @@ +{"version":3,"file":"threaded.js","sourceRoot":"","sources":["../../src/services/threaded.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,4BAA0B;AAE1B,uCAAgD;AAChD,8CAAkE;AAClE,oDAAuB;AAEvB,qCAAwC;AACxC,mDAAoD;AACpD,uDAAmD;AACnD,2BAA0B;AAC1B,mDAA8C;AAGvC,IAAM,uBAAuB,GAA7B,MAAM,uBAAwB,SAAQ,0CAA+B;IAKxE,YACc,YAA0B,EAC7B,YAA+B,EAC/B,cAA8B;QAErC,KAAK,CAAC,GAAG,SAAS,CAAC,CAAC;QAJV,iBAAY,GAAZ,YAAY,CAAc;QAC7B,iBAAY,GAAZ,YAAY,CAAmB;QAC/B,mBAAc,GAAd,cAAc,CAAgB;QAPzC,cAAS,GAAG,oBAAS,CAAC;QAEtB,WAAM,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC;IAQrE,CAAC;IAED,kBAAkB;QACd,MAAM,OAAO,GAAG,IAAA,SAAI,GAAE,CAAC;QAEvB,MAAM,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QAC7H,MAAM,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QAE5H,MAAM,qBAAqB,GAAG,CAAC,YAAY,GAAG,aAAa,CAAC,GAAG,GAAG,CAAC;QAEnE,IAAI,CAAC,UAAU,GAAG,qBAAqB,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC;IAClF,CAAC;IAEQ,KAAK,CAAC,IAAI;QACf,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;QAC7B,MAAM,KAAK,CAAC,IAAI,EAAE,CAAC;QAEnB,IAAI,6BAAY,EAAE,CAAC;YACf,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAC1B,MAAM,OAAO,CAAC,GAAG,CACb,gBAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CACb,CAAC,EAAE,EAAE,EAAE,CACH,IAAI,OAAO,CACP,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;gBAChB,IAAI,CAAC,YAAY,EAAE;qBACd,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC;qBACxB,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YAC/B,CAAC,CACJ,CACR,CACJ,CAAC;QACN,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACvB,CAAC;CAEJ,CAAA;AA/CY,0DAAuB;kCAAvB,uBAAuB;IADnC,IAAA,oBAAS,GAAE;qCAOoB,qBAAY;QACf,iCAAiB;QACf,gCAAc;GARhC,uBAAuB,CA+CnC;AAGD,MAAM,QAAQ,GAAG,oBAAS,CAAC,OAAO,CAAC,uBAAuB,CAAC,CAAC;AAC5D,kBAAe,QAAQ,CAAC;AACX,KAA+C,QAAQ,CAAC,UAAU,EAAE,EAAlE,cAAM,cAAE,aAAK,aAAE,WAAG,WAAE,kBAAU,kBAAE,gBAAQ,eAA2B"} \ No newline at end of file diff --git a/build/shared-stubs/index.js b/build/shared-stubs/index.js new file mode 100644 index 0000000000000000000000000000000000000000..aa219d8f2aa44dc7fe6633d1ecf87ab5354ab072 --- /dev/null +++ b/build/shared-stubs/index.js @@ -0,0 +1,3 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/build/shared-stubs/index.js.map b/build/shared-stubs/index.js.map new file mode 100644 index 0000000000000000000000000000000000000000..dc3a42339024e8e0b34c043cd9f390f5d623a221 --- /dev/null +++ b/build/shared-stubs/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/shared-stubs/index.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/build/shared-stubs/lib/errors.js b/build/shared-stubs/lib/errors.js new file mode 100644 index 0000000000000000000000000000000000000000..d4d3fba00293596f6c2251c585ed1763cdcfb8cd --- /dev/null +++ b/build/shared-stubs/lib/errors.js @@ -0,0 +1,3 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +//# sourceMappingURL=errors.js.map \ No newline at end of file diff --git a/build/shared-stubs/lib/errors.js.map b/build/shared-stubs/lib/errors.js.map new file mode 100644 index 0000000000000000000000000000000000000000..62379309b18c365d102a72c4714d04a74014e271 --- /dev/null +++ b/build/shared-stubs/lib/errors.js.map @@ -0,0 +1 @@ +{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../src/shared-stubs/lib/errors.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/build/shared-stubs/services/secrets.js b/build/shared-stubs/services/secrets.js new file mode 100644 index 0000000000000000000000000000000000000000..657b43cf530cf9f12b85005f1dceff266c461d29 --- /dev/null +++ b/build/shared-stubs/services/secrets.js @@ -0,0 +1,3 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +//# sourceMappingURL=secrets.js.map \ No newline at end of file diff --git a/build/shared-stubs/services/secrets.js.map b/build/shared-stubs/services/secrets.js.map new file mode 100644 index 0000000000000000000000000000000000000000..b58d8567c85fc0b0737dce7fe6c4504b1e2eeea4 --- /dev/null +++ b/build/shared-stubs/services/secrets.js.map @@ -0,0 +1 @@ +{"version":3,"file":"secrets.js","sourceRoot":"","sources":["../../../src/shared-stubs/services/secrets.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/build/shared/3rd-party/cloud-flare.js b/build/shared/3rd-party/cloud-flare.js new file mode 100644 index 0000000000000000000000000000000000000000..cf88069daa08c51e530d926ae654d3a3fa57861e --- /dev/null +++ b/build/shared/3rd-party/cloud-flare.js @@ -0,0 +1,3 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +//# sourceMappingURL=cloud-flare.js.map \ No newline at end of file diff --git a/build/shared/3rd-party/cloud-flare.js.map b/build/shared/3rd-party/cloud-flare.js.map new file mode 100644 index 0000000000000000000000000000000000000000..ac11aa93b338d8759df3b500bb3e1286dbe4a41a --- /dev/null +++ b/build/shared/3rd-party/cloud-flare.js.map @@ -0,0 +1 @@ +{"version":3,"file":"cloud-flare.js","sourceRoot":"","sources":["../../../src/shared/3rd-party/cloud-flare.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/build/shared/3rd-party/internal-serp.js b/build/shared/3rd-party/internal-serp.js new file mode 100644 index 0000000000000000000000000000000000000000..cfde9c31fba084f6ce34c077eb503191a9b92863 --- /dev/null +++ b/build/shared/3rd-party/internal-serp.js @@ -0,0 +1,3 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +//# sourceMappingURL=internal-serp.js.map \ No newline at end of file diff --git a/build/shared/3rd-party/internal-serp.js.map b/build/shared/3rd-party/internal-serp.js.map new file mode 100644 index 0000000000000000000000000000000000000000..d2b5b35995709c106e12900124b32376ca10c088 --- /dev/null +++ b/build/shared/3rd-party/internal-serp.js.map @@ -0,0 +1 @@ +{"version":3,"file":"internal-serp.js","sourceRoot":"","sources":["../../../src/shared/3rd-party/internal-serp.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/build/shared/3rd-party/jina-embeddings.js b/build/shared/3rd-party/jina-embeddings.js new file mode 100644 index 0000000000000000000000000000000000000000..a3c4c1ea5b188f8ec1509bfe869d5830525801b8 --- /dev/null +++ b/build/shared/3rd-party/jina-embeddings.js @@ -0,0 +1,3 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +//# sourceMappingURL=jina-embeddings.js.map \ No newline at end of file diff --git a/build/shared/3rd-party/jina-embeddings.js.map b/build/shared/3rd-party/jina-embeddings.js.map new file mode 100644 index 0000000000000000000000000000000000000000..52a81ca5762131759ba7d81b18b0491b068333c7 --- /dev/null +++ b/build/shared/3rd-party/jina-embeddings.js.map @@ -0,0 +1 @@ +{"version":3,"file":"jina-embeddings.js","sourceRoot":"","sources":["../../../src/shared/3rd-party/jina-embeddings.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/build/shared/db/api-roll.js b/build/shared/db/api-roll.js new file mode 100644 index 0000000000000000000000000000000000000000..287cf8cb5b9102d7d8408e4bedc3001353868be6 --- /dev/null +++ b/build/shared/db/api-roll.js @@ -0,0 +1,3 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +//# sourceMappingURL=api-roll.js.map \ No newline at end of file diff --git a/build/shared/db/api-roll.js.map b/build/shared/db/api-roll.js.map new file mode 100644 index 0000000000000000000000000000000000000000..892bad86cf7fa30c25b4ddf7db6bdd2d9eb0ac98 --- /dev/null +++ b/build/shared/db/api-roll.js.map @@ -0,0 +1 @@ +{"version":3,"file":"api-roll.js","sourceRoot":"","sources":["../../../src/shared/db/api-roll.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/build/shared/db/jina-embeddings-token-account.js b/build/shared/db/jina-embeddings-token-account.js new file mode 100644 index 0000000000000000000000000000000000000000..6eceaa93cb8f67763e296aa4b3835391d5a772db --- /dev/null +++ b/build/shared/db/jina-embeddings-token-account.js @@ -0,0 +1,3 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +//# sourceMappingURL=jina-embeddings-token-account.js.map \ No newline at end of file diff --git a/build/shared/db/jina-embeddings-token-account.js.map b/build/shared/db/jina-embeddings-token-account.js.map new file mode 100644 index 0000000000000000000000000000000000000000..aca9007b2a30ecbd8a38bc6925e18a2e3a2d95be --- /dev/null +++ b/build/shared/db/jina-embeddings-token-account.js.map @@ -0,0 +1 @@ +{"version":3,"file":"jina-embeddings-token-account.js","sourceRoot":"","sources":["../../../src/shared/db/jina-embeddings-token-account.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/build/shared/index.js b/build/shared/index.js new file mode 100644 index 0000000000000000000000000000000000000000..4022dadcbb608f1b30391f72d056f179bb027dcd --- /dev/null +++ b/build/shared/index.js @@ -0,0 +1,22 @@ +"use strict"; +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __exportStar = (this && this.__exportStar) || function(m, exports) { + for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.SecretExposer = void 0; +// HF-compatible stub for shared module entry +__exportStar(require("./lib/errors"), exports); +var secrets_1 = require("./services/secrets"); +Object.defineProperty(exports, "SecretExposer", { enumerable: true, get: function () { return secrets_1.SecretExposer; } }); +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/build/shared/index.js.map b/build/shared/index.js.map new file mode 100644 index 0000000000000000000000000000000000000000..ea5247fb20402d9d48fcc91860a67532b55deb41 --- /dev/null +++ b/build/shared/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/shared/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,6CAA6C;AAC7C,+CAA6B;AAC7B,8CAAmD;AAA1C,wGAAA,aAAa,OAAA"} \ No newline at end of file diff --git a/build/shared/lib/errors.js b/build/shared/lib/errors.js new file mode 100644 index 0000000000000000000000000000000000000000..5df4231185ae90884b2313bcd690af4b15c2772c --- /dev/null +++ b/build/shared/lib/errors.js @@ -0,0 +1,33 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ServiceNodeResourceDrainError = exports.ServiceCrashedError = exports.SecurityCompromiseError = exports.ServiceBadAttemptError = void 0; +// HF-compatible stub for error handling +class ServiceBadAttemptError extends Error { + constructor(message) { + super(message); + this.name = 'ServiceBadAttemptError'; + } +} +exports.ServiceBadAttemptError = ServiceBadAttemptError; +class SecurityCompromiseError extends Error { + constructor(message) { + super(message); + this.name = 'SecurityCompromiseError'; + } +} +exports.SecurityCompromiseError = SecurityCompromiseError; +class ServiceCrashedError extends Error { + constructor(message) { + super(message); + this.name = 'ServiceCrashedError'; + } +} +exports.ServiceCrashedError = ServiceCrashedError; +class ServiceNodeResourceDrainError extends Error { + constructor(message) { + super(message); + this.name = 'ServiceNodeResourceDrainError'; + } +} +exports.ServiceNodeResourceDrainError = ServiceNodeResourceDrainError; +//# sourceMappingURL=errors.js.map \ No newline at end of file diff --git a/build/shared/lib/errors.js.map b/build/shared/lib/errors.js.map new file mode 100644 index 0000000000000000000000000000000000000000..78d7eb60fc34bc384db20e57bd28bd2c16a164ed --- /dev/null +++ b/build/shared/lib/errors.js.map @@ -0,0 +1 @@ +{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../src/shared/lib/errors.ts"],"names":[],"mappings":";;;AAAA,wCAAwC;AACxC,MAAa,sBAAuB,SAAQ,KAAK;IAC/C,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,wBAAwB,CAAC;IACvC,CAAC;CACF;AALD,wDAKC;AAED,MAAa,uBAAwB,SAAQ,KAAK;IAChD,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,yBAAyB,CAAC;IACxC,CAAC;CACF;AALD,0DAKC;AAED,MAAa,mBAAoB,SAAQ,KAAK;IAC5C,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAC;IACpC,CAAC;CACF;AALD,kDAKC;AAED,MAAa,6BAA8B,SAAQ,KAAK;IACtD,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,+BAA+B,CAAC;IAC9C,CAAC;CACF;AALD,sEAKC"} \ No newline at end of file diff --git a/build/shared/services/async-context.js b/build/shared/services/async-context.js new file mode 100644 index 0000000000000000000000000000000000000000..3c7f0d6925480cbea3058ddae15741eb9879734d --- /dev/null +++ b/build/shared/services/async-context.js @@ -0,0 +1,14 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.AsyncContext = void 0; +// Stub implementation for AsyncContext +class AsyncContext { + get(key) { + return undefined; + } + set(key, value) { + // Do nothing + } +} +exports.AsyncContext = AsyncContext; +//# sourceMappingURL=async-context.js.map \ No newline at end of file diff --git a/build/shared/services/async-context.js.map b/build/shared/services/async-context.js.map new file mode 100644 index 0000000000000000000000000000000000000000..7571a793f1db94200be17217f93456456cfc49bc --- /dev/null +++ b/build/shared/services/async-context.js.map @@ -0,0 +1 @@ +{"version":3,"file":"async-context.js","sourceRoot":"","sources":["../../../src/shared/services/async-context.ts"],"names":[],"mappings":";;;AAAA,uCAAuC;AACvC,MAAa,YAAY;IACvB,GAAG,CAAC,GAAW;QACb,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,GAAG,CAAC,GAAW,EAAE,KAAU;QACzB,aAAa;IACf,CAAC;CACF;AARD,oCAQC"} \ No newline at end of file diff --git a/build/shared/services/common-llm.js b/build/shared/services/common-llm.js new file mode 100644 index 0000000000000000000000000000000000000000..50c53df02f0c28737d90ac0733e4635608212011 --- /dev/null +++ b/build/shared/services/common-llm.js @@ -0,0 +1,3 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +//# sourceMappingURL=common-llm.js.map \ No newline at end of file diff --git a/build/shared/services/common-llm.js.map b/build/shared/services/common-llm.js.map new file mode 100644 index 0000000000000000000000000000000000000000..1a0dffaea166a5fdbbac295569425a9a0e9f3ff5 --- /dev/null +++ b/build/shared/services/common-llm.js.map @@ -0,0 +1 @@ +{"version":3,"file":"common-llm.js","sourceRoot":"","sources":["../../../src/shared/services/common-llm.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/build/shared/services/firebase-storage-bucket.js b/build/shared/services/firebase-storage-bucket.js new file mode 100644 index 0000000000000000000000000000000000000000..32183fd46af7f84682ae889ca2fab12f39cbaf8c --- /dev/null +++ b/build/shared/services/firebase-storage-bucket.js @@ -0,0 +1,23 @@ +"use strict"; +// Stub implementation for Firebase Storage Bucket +Object.defineProperty(exports, "__esModule", { value: true }); +exports.FirebaseStorageBucketControl = void 0; +class FirebaseStorageBucketControl { + async upload(data, path) { + // Stub implementation - returns a mock URL + return `https://storage.googleapis.com/mock-bucket/${path}`; + } + async download(path) { + // Stub implementation - returns empty buffer + return Buffer.alloc(0); + } + async downloadFile(path) { + // Stub implementation - returns empty buffer + return Buffer.alloc(0); + } + async saveFile(path, data, options) { + // Do nothing - storage disabled + } +} +exports.FirebaseStorageBucketControl = FirebaseStorageBucketControl; +//# sourceMappingURL=firebase-storage-bucket.js.map \ No newline at end of file diff --git a/build/shared/services/firebase-storage-bucket.js.map b/build/shared/services/firebase-storage-bucket.js.map new file mode 100644 index 0000000000000000000000000000000000000000..db2dfec4408c82d52d6d9ecdc31725dd4ca2d203 --- /dev/null +++ b/build/shared/services/firebase-storage-bucket.js.map @@ -0,0 +1 @@ +{"version":3,"file":"firebase-storage-bucket.js","sourceRoot":"","sources":["../../../src/shared/services/firebase-storage-bucket.ts"],"names":[],"mappings":";AAAA,kDAAkD;;;AAElD,MAAa,4BAA4B;IACvC,KAAK,CAAC,MAAM,CAAC,IAAS,EAAE,IAAY;QAClC,2CAA2C;QAC3C,OAAO,8CAA8C,IAAI,EAAE,CAAC;IAC9D,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,IAAY;QACzB,6CAA6C;QAC7C,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACzB,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,IAAY;QAC7B,6CAA6C;QAC7C,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACzB,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,IAAY,EAAE,IAAY,EAAE,OAAa;QACtD,gCAAgC;IAClC,CAAC;CACF;AAnBD,oEAmBC"} \ No newline at end of file diff --git a/build/shared/services/proxy-provider.js b/build/shared/services/proxy-provider.js new file mode 100644 index 0000000000000000000000000000000000000000..dc74498f5423a1b84ac74a2651fc9947a82e7c60 --- /dev/null +++ b/build/shared/services/proxy-provider.js @@ -0,0 +1,3 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +//# sourceMappingURL=proxy-provider.js.map \ No newline at end of file diff --git a/build/shared/services/proxy-provider.js.map b/build/shared/services/proxy-provider.js.map new file mode 100644 index 0000000000000000000000000000000000000000..cc3fca0cf3d1e81e23d45a5dd232c3e04b80c56c --- /dev/null +++ b/build/shared/services/proxy-provider.js.map @@ -0,0 +1 @@ +{"version":3,"file":"proxy-provider.js","sourceRoot":"","sources":["../../../src/shared/services/proxy-provider.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/build/shared/services/secrets.js b/build/shared/services/secrets.js new file mode 100644 index 0000000000000000000000000000000000000000..37988400f7349a3281bc966779751e584c4fb6b8 --- /dev/null +++ b/build/shared/services/secrets.js @@ -0,0 +1,18 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.SecretExposer = void 0; +// HF-compatible stub for secrets management +class SecretExposer { + static get(key) { + return process.env[key] || ''; + } + get SERPER_SEARCH_API_KEY() { + return process.env.SERPER_SEARCH_API_KEY || ''; + } +} +exports.SecretExposer = SecretExposer; +const envConfig = { + get: (key) => process.env[key] || '' +}; +exports.default = envConfig; +//# sourceMappingURL=secrets.js.map \ No newline at end of file diff --git a/build/shared/services/secrets.js.map b/build/shared/services/secrets.js.map new file mode 100644 index 0000000000000000000000000000000000000000..b98953435772033c9cebe9892eee01fd6f62f1e7 --- /dev/null +++ b/build/shared/services/secrets.js.map @@ -0,0 +1 @@ +{"version":3,"file":"secrets.js","sourceRoot":"","sources":["../../../src/shared/services/secrets.ts"],"names":[],"mappings":";;;AAAA,4CAA4C;AAC5C,MAAa,aAAa;IACxB,MAAM,CAAC,GAAG,CAAC,GAAW;QACpB,OAAO,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;IAChC,CAAC;IAED,IAAI,qBAAqB;QACvB,OAAO,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,EAAE,CAAC;IACjD,CAAC;CACF;AARD,sCAQC;AAED,MAAM,SAAS,GAAG;IAChB,GAAG,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE;CAC7C,CAAC;AAEF,kBAAe,SAAS,CAAC"} \ No newline at end of file diff --git a/build/shared/utils/audition.js b/build/shared/utils/audition.js new file mode 100644 index 0000000000000000000000000000000000000000..dfb60b38640158d625c7b6557c516d0588e03700 --- /dev/null +++ b/build/shared/utils/audition.js @@ -0,0 +1,9 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.getAuditionMiddleware = getAuditionMiddleware; +// Stub implementation for audition middleware +function getAuditionMiddleware() { + // Return a no-op middleware function + return (req, res, next) => next(); +} +//# sourceMappingURL=audition.js.map \ No newline at end of file diff --git a/build/shared/utils/audition.js.map b/build/shared/utils/audition.js.map new file mode 100644 index 0000000000000000000000000000000000000000..36a8c62b5e9c14ec8b149438d64a3cfd6a0d61a7 --- /dev/null +++ b/build/shared/utils/audition.js.map @@ -0,0 +1 @@ +{"version":3,"file":"audition.js","sourceRoot":"","sources":["../../../src/shared/utils/audition.ts"],"names":[],"mappings":";;AACA,sDAGC;AAJD,8CAA8C;AAC9C,SAAgB,qBAAqB;IACnC,qCAAqC;IACrC,OAAO,CAAC,GAAQ,EAAE,GAAQ,EAAE,IAAS,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC;AACnD,CAAC"} \ No newline at end of file diff --git a/build/shared/utils/openai.js b/build/shared/utils/openai.js new file mode 100644 index 0000000000000000000000000000000000000000..fcd5639834364737d7cfefbf371c48cec569bbc3 --- /dev/null +++ b/build/shared/utils/openai.js @@ -0,0 +1,9 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.countGPTToken = countGPTToken; +// Stub implementation for OpenAI utils +function countGPTToken(text) { + // Simple approximation: roughly 4 characters per token + return Math.ceil(text.length / 4); +} +//# sourceMappingURL=openai.js.map \ No newline at end of file diff --git a/build/shared/utils/openai.js.map b/build/shared/utils/openai.js.map new file mode 100644 index 0000000000000000000000000000000000000000..4a147884d3a68569ef6b6726ec2d5d08636c4975 --- /dev/null +++ b/build/shared/utils/openai.js.map @@ -0,0 +1 @@ +{"version":3,"file":"openai.js","sourceRoot":"","sources":["../../../src/shared/utils/openai.ts"],"names":[],"mappings":";;AACA,sCAGC;AAJD,uCAAuC;AACvC,SAAgB,aAAa,CAAC,IAAY;IACxC,uDAAuD;IACvD,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AACpC,CAAC"} \ No newline at end of file diff --git a/build/stand-alone/crawl.js b/build/stand-alone/crawl.js new file mode 100644 index 0000000000000000000000000000000000000000..c50c4331346a5ab81cc74a35f8bcdf1d86c0b0c5 --- /dev/null +++ b/build/stand-alone/crawl.js @@ -0,0 +1,207 @@ +"use strict"; +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __importStar = (this && this.__importStar) || (function () { + var ownKeys = function(o) { + ownKeys = Object.getOwnPropertyNames || function (o) { + var ar = []; + for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; + return ar; + }; + return ownKeys(o); + }; + return function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); + __setModuleDefault(result, mod); + return result; + }; +})(); +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.CrawlStandAloneServer = void 0; +require("reflect-metadata"); +const tsyringe_1 = require("tsyringe"); +const koa_1 = require("civkit/civ-rpc/koa"); +const http2_1 = __importDefault(require("http2")); +const crawler_1 = require("../api/crawler"); +const fswalk_1 = require("civkit/fswalk"); +const path_1 = __importDefault(require("path")); +const fs_1 = __importDefault(require("fs")); +const mime_1 = require("civkit/mime"); +const registry_1 = require("../services/registry"); +const async_hooks_1 = require("async_hooks"); +const decorators_1 = require("civkit/decorators"); +const crypto_1 = require("crypto"); +const threaded_1 = require("../services/threaded"); +const logger_1 = require("../services/logger"); +const async_context_1 = require("../services/async-context"); +const finalizer_1 = __importStar(require("../services/finalizer")); +const koa_compress_1 = __importDefault(require("koa-compress")); +let CrawlStandAloneServer = class CrawlStandAloneServer extends koa_1.KoaServer { + constructor(globalLogger, registry, crawlerHost, threadLocal, threads) { + super(...arguments); + this.globalLogger = globalLogger; + this.registry = registry; + this.crawlerHost = crawlerHost; + this.threadLocal = threadLocal; + this.threads = threads; + this.logger = this.globalLogger.child({ service: this.constructor.name }); + this.assets = new Map(); + } + h2c() { + this.httpAlternativeServer = this.httpServer; + const fn = this.koaApp.callback(); + this.httpServer = http2_1.default.createServer((req, res) => { + const ar = new async_hooks_1.AsyncResource('HTTP2ServerRequest'); + ar.runInAsyncScope(fn, this.koaApp, req, res); + }); + // useResourceBasedDefaultTracker(); + return this; + } + async init() { + await this.walkForAssets(); + await super.init(); + } + async walkForAssets() { + const files = await fswalk_1.FsWalk.walkOut(path_1.default.resolve(__dirname, '..', '..', 'public')); + for (const file of files) { + if (file.type !== 'file') { + continue; + } + this.assets.set(file.relativePath.toString(), file); + } + } + listen(port) { + const r = super.listen(port); + if (this.httpAlternativeServer) { + const altPort = port + 1; + this.httpAlternativeServer.listen(altPort, () => { + this.logger.info(`Alternative ${this.httpAlternativeServer.constructor.name} listening on port ${altPort}`); + }); + } + return r; + } + makeAssetsServingController() { + return (ctx, next) => { + const requestPath = ctx.path; + const file = requestPath.slice(1); + if (!file) { + return next(); + } + const asset = this.assets.get(file); + if (asset?.type !== 'file') { + return next(); + } + ctx.body = fs_1.default.createReadStream(asset.path); + ctx.type = (0, mime_1.mimeOfExt)(path_1.default.extname(asset.path.toString())) || 'application/octet-stream'; + ctx.set('Content-Length', asset.stats.size.toString()); + return; + }; + } + registerRoutes() { + this.koaApp.use((0, koa_compress_1.default)({ + filter(type) { + if (type.startsWith('text/')) { + return true; + } + if (type.includes('application/json') || type.includes('+json') || type.includes('+xml')) { + return true; + } + if (type.includes('application/x-ndjson')) { + return true; + } + return false; + } + })); + this.koaApp.use(this.makeAssetsServingController()); + this.koaApp.use(this.registry.makeShimController()); + } + // Using h2c server has an implication that multiple requests may share the same connection and x-cloud-trace-context + // TraceId is expected to be request-bound and unique. So these two has to be distinguished. + insertAsyncHookMiddleware() { + const asyncHookMiddleware = async (ctx, next) => { + const googleTraceId = ctx.get('x-cloud-trace-context').split('/')?.[0]; + this.threadLocal.setup({ + traceId: (0, crypto_1.randomUUID)(), + traceT0: new Date(), + googleTraceId, + }); + return next(); + }; + this.koaApp.use(asyncHookMiddleware); + } + async standDown() { + const tasks = []; + if (this.httpAlternativeServer?.listening) { + this.httpAlternativeServer.closeIdleConnections?.(); + this.httpAlternativeServer.close(); + tasks.push(new Promise((resolve, reject) => { + this.httpAlternativeServer.close((err) => { + if (err) { + return reject(err); + } + resolve(); + }); + })); + } + tasks.push(super.standDown()); + await Promise.all(tasks); + } +}; +exports.CrawlStandAloneServer = CrawlStandAloneServer; +__decorate([ + (0, decorators_1.runOnce)(), + __metadata("design:type", Function), + __metadata("design:paramtypes", []), + __metadata("design:returntype", void 0) +], CrawlStandAloneServer.prototype, "insertAsyncHookMiddleware", null); +__decorate([ + (0, finalizer_1.Finalizer)(), + __metadata("design:type", Function), + __metadata("design:paramtypes", []), + __metadata("design:returntype", Promise) +], CrawlStandAloneServer.prototype, "standDown", null); +exports.CrawlStandAloneServer = CrawlStandAloneServer = __decorate([ + (0, tsyringe_1.singleton)(), + __metadata("design:paramtypes", [logger_1.GlobalLogger, + registry_1.RPCRegistry, + crawler_1.CrawlerHost, + async_context_1.AsyncLocalContext, + threaded_1.ThreadedServiceRegistry]) +], CrawlStandAloneServer); +const instance = tsyringe_1.container.resolve(CrawlStandAloneServer); +exports.default = instance; +if (process.env.NODE_ENV?.includes('dry-run')) { + instance.serviceReady().then(() => finalizer_1.default.terminate()); +} +else { + instance.serviceReady().then((s) => s.h2c().listen(parseInt(process.env.PORT || '') || 3000)); +} +//# sourceMappingURL=crawl.js.map \ No newline at end of file diff --git a/build/stand-alone/crawl.js.map b/build/stand-alone/crawl.js.map new file mode 100644 index 0000000000000000000000000000000000000000..c66f13d0be66ea3dbbdbed6d531217f787a882c6 --- /dev/null +++ b/build/stand-alone/crawl.js.map @@ -0,0 +1 @@ +{"version":3,"file":"crawl.js","sourceRoot":"","sources":["../../src/stand-alone/crawl.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/build/stand-alone/search.js b/build/stand-alone/search.js new file mode 100644 index 0000000000000000000000000000000000000000..f62b897e75c652e57ce079aa03163ebc6ca15e30 --- /dev/null +++ b/build/stand-alone/search.js @@ -0,0 +1,213 @@ +"use strict"; +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __importStar = (this && this.__importStar) || (function () { + var ownKeys = function(o) { + ownKeys = Object.getOwnPropertyNames || function (o) { + var ar = []; + for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; + return ar; + }; + return ownKeys(o); + }; + return function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); + __setModuleDefault(result, mod); + return result; + }; +})(); +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.SearchStandAloneServer = void 0; +require("reflect-metadata"); +const tsyringe_1 = require("tsyringe"); +const koa_1 = require("civkit/civ-rpc/koa"); +const http2_1 = __importDefault(require("http2")); +const searcher_1 = require("../api/searcher"); +const fswalk_1 = require("civkit/fswalk"); +const path_1 = __importDefault(require("path")); +const fs_1 = __importDefault(require("fs")); +const mime_1 = require("civkit/mime"); +const registry_1 = require("../services/registry"); +const async_hooks_1 = require("async_hooks"); +const decorators_1 = require("civkit/decorators"); +const crypto_1 = require("crypto"); +const threaded_1 = require("../services/threaded"); +const logger_1 = require("../services/logger"); +const async_context_1 = require("../services/async-context"); +const finalizer_1 = __importStar(require("../services/finalizer")); +const koa_compress_1 = __importDefault(require("koa-compress")); +let SearchStandAloneServer = class SearchStandAloneServer extends koa_1.KoaServer { + constructor(globalLogger, registry, searcherHost, threadLocal, threads) { + super(...arguments); + this.globalLogger = globalLogger; + this.registry = registry; + this.searcherHost = searcherHost; + this.threadLocal = threadLocal; + this.threads = threads; + this.logger = this.globalLogger.child({ service: this.constructor.name }); + this.assets = new Map(); + } + h2c() { + this.httpAlternativeServer = this.httpServer; + const fn = this.koaApp.callback(); + this.httpServer = http2_1.default.createServer((req, res) => { + const ar = new async_hooks_1.AsyncResource('HTTP2ServerRequest'); + ar.runInAsyncScope(fn, this.koaApp, req, res); + }); + // useResourceBasedDefaultTracker(); + return this; + } + async init() { + await this.walkForAssets(); + await this.dependencyReady(); + for (const [k, v] of this.registry.conf.entries()) { + if (v.tags?.includes('crawl')) { + this.registry.conf.delete(k); + } + } + await super.init(); + } + async walkForAssets() { + const files = await fswalk_1.FsWalk.walkOut(path_1.default.resolve(__dirname, '..', '..', 'public')); + for (const file of files) { + if (file.type !== 'file') { + continue; + } + this.assets.set(file.relativePath.toString(), file); + } + } + listen(port) { + const r = super.listen(port); + if (this.httpAlternativeServer) { + const altPort = port + 1; + this.httpAlternativeServer.listen(altPort, () => { + this.logger.info(`Alternative ${this.httpAlternativeServer.constructor.name} listening on port ${altPort}`); + }); + } + return r; + } + makeAssetsServingController() { + return (ctx, next) => { + const requestPath = ctx.path; + const file = requestPath.slice(1); + if (!file) { + return next(); + } + const asset = this.assets.get(file); + if (asset?.type !== 'file') { + return next(); + } + ctx.body = fs_1.default.createReadStream(asset.path); + ctx.type = (0, mime_1.mimeOfExt)(path_1.default.extname(asset.path.toString())) || 'application/octet-stream'; + ctx.set('Content-Length', asset.stats.size.toString()); + return; + }; + } + registerRoutes() { + this.koaApp.use((0, koa_compress_1.default)({ + filter(type) { + if (type.startsWith('text/')) { + return true; + } + if (type.includes('application/json') || type.includes('+json') || type.includes('+xml')) { + return true; + } + if (type.includes('application/x-ndjson')) { + return true; + } + return false; + } + })); + this.koaApp.use(this.makeAssetsServingController()); + this.koaApp.use(this.registry.makeShimController()); + } + // Using h2c server has an implication that multiple requests may share the same connection and x-cloud-trace-context + // TraceId is expected to be request-bound and unique. So these two has to be distinguished. + insertAsyncHookMiddleware() { + const asyncHookMiddleware = async (ctx, next) => { + const googleTraceId = ctx.get('x-cloud-trace-context').split('/')?.[0]; + this.threadLocal.setup({ + traceId: (0, crypto_1.randomUUID)(), + traceT0: new Date(), + googleTraceId, + }); + return next(); + }; + this.koaApp.use(asyncHookMiddleware); + } + async standDown() { + const tasks = []; + if (this.httpAlternativeServer?.listening) { + this.httpAlternativeServer.closeIdleConnections?.(); + this.httpAlternativeServer.close(); + tasks.push(new Promise((resolve, reject) => { + this.httpAlternativeServer.close((err) => { + if (err) { + return reject(err); + } + resolve(); + }); + })); + } + tasks.push(super.standDown()); + await Promise.all(tasks); + } +}; +exports.SearchStandAloneServer = SearchStandAloneServer; +__decorate([ + (0, decorators_1.runOnce)(), + __metadata("design:type", Function), + __metadata("design:paramtypes", []), + __metadata("design:returntype", void 0) +], SearchStandAloneServer.prototype, "insertAsyncHookMiddleware", null); +__decorate([ + (0, finalizer_1.Finalizer)(), + __metadata("design:type", Function), + __metadata("design:paramtypes", []), + __metadata("design:returntype", Promise) +], SearchStandAloneServer.prototype, "standDown", null); +exports.SearchStandAloneServer = SearchStandAloneServer = __decorate([ + (0, tsyringe_1.singleton)(), + __metadata("design:paramtypes", [logger_1.GlobalLogger, + registry_1.RPCRegistry, + searcher_1.SearcherHost, + async_context_1.AsyncLocalContext, + threaded_1.ThreadedServiceRegistry]) +], SearchStandAloneServer); +const instance = tsyringe_1.container.resolve(SearchStandAloneServer); +exports.default = instance; +if (process.env.NODE_ENV?.includes('dry-run')) { + instance.serviceReady().then(() => finalizer_1.default.terminate()); +} +else { + instance.serviceReady().then((s) => s.h2c().listen(parseInt(process.env.PORT || '') || 3000)); +} +//# sourceMappingURL=search.js.map \ No newline at end of file diff --git a/build/stand-alone/search.js.map b/build/stand-alone/search.js.map new file mode 100644 index 0000000000000000000000000000000000000000..3b5e3350d05f761b42420fc64f87c8cf02ab783a --- /dev/null +++ b/build/stand-alone/search.js.map @@ -0,0 +1 @@ +{"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/stand-alone/search.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/build/stand-alone/serp.js b/build/stand-alone/serp.js new file mode 100644 index 0000000000000000000000000000000000000000..36f44bd45f3e1515a06191c3f9837be17370aedb --- /dev/null +++ b/build/stand-alone/serp.js @@ -0,0 +1,215 @@ +"use strict"; +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __importStar = (this && this.__importStar) || (function () { + var ownKeys = function(o) { + ownKeys = Object.getOwnPropertyNames || function (o) { + var ar = []; + for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; + return ar; + }; + return ownKeys(o); + }; + return function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); + __setModuleDefault(result, mod); + return result; + }; +})(); +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.SERPStandAloneServer = void 0; +require("reflect-metadata"); +const tsyringe_1 = require("tsyringe"); +const koa_1 = require("civkit/civ-rpc/koa"); +const http2_1 = __importDefault(require("http2")); +const fswalk_1 = require("civkit/fswalk"); +const path_1 = __importDefault(require("path")); +const fs_1 = __importDefault(require("fs")); +const mime_1 = require("civkit/mime"); +const registry_1 = require("../services/registry"); +const async_hooks_1 = require("async_hooks"); +const decorators_1 = require("civkit/decorators"); +const crypto_1 = require("crypto"); +const threaded_1 = require("../services/threaded"); +const logger_1 = require("../services/logger"); +const async_context_1 = require("../services/async-context"); +const finalizer_1 = __importStar(require("../services/finalizer")); +const serp_1 = require("../api/serp"); +const koa_compress_1 = __importDefault(require("koa-compress")); +const audition_1 = require("../shared/utils/audition"); +let SERPStandAloneServer = class SERPStandAloneServer extends koa_1.KoaServer { + constructor(globalLogger, registry, serpHost, threadLocal, threads) { + super(...arguments); + this.globalLogger = globalLogger; + this.registry = registry; + this.serpHost = serpHost; + this.threadLocal = threadLocal; + this.threads = threads; + this.logger = this.globalLogger.child({ service: this.constructor.name }); + this.assets = new Map(); + } + h2c() { + this.httpAlternativeServer = this.httpServer; + const fn = this.koaApp.callback(); + this.httpServer = http2_1.default.createServer((req, res) => { + const ar = new async_hooks_1.AsyncResource('HTTP2ServerRequest'); + ar.runInAsyncScope(fn, this.koaApp, req, res); + }); + // useResourceBasedDefaultTracker(); + return this; + } + async init() { + await this.walkForAssets(); + await this.dependencyReady(); + for (const [k, v] of this.registry.conf.entries()) { + if (v.tags?.includes('crawl')) { + this.registry.conf.delete(k); + } + } + await super.init(); + } + async walkForAssets() { + const files = await fswalk_1.FsWalk.walkOut(path_1.default.resolve(__dirname, '..', '..', 'public')); + for (const file of files) { + if (file.type !== 'file') { + continue; + } + this.assets.set(file.relativePath.toString(), file); + } + } + listen(port) { + const r = super.listen(port); + if (this.httpAlternativeServer) { + const altPort = port + 1; + this.httpAlternativeServer.listen(altPort, () => { + this.logger.info(`Alternative ${this.httpAlternativeServer.constructor.name} listening on port ${altPort}`); + }); + } + return r; + } + makeAssetsServingController() { + return (ctx, next) => { + const requestPath = ctx.path; + const file = requestPath.slice(1); + if (!file) { + return next(); + } + const asset = this.assets.get(file); + if (asset?.type !== 'file') { + return next(); + } + ctx.body = fs_1.default.createReadStream(asset.path); + ctx.type = (0, mime_1.mimeOfExt)(path_1.default.extname(asset.path.toString())) || 'application/octet-stream'; + ctx.set('Content-Length', asset.stats.size.toString()); + return; + }; + } + registerRoutes() { + this.koaApp.use((0, audition_1.getAuditionMiddleware)()); + this.koaApp.use((0, koa_compress_1.default)({ + filter(type) { + if (type.startsWith('text/')) { + return true; + } + if (type.includes('application/json') || type.includes('+json') || type.includes('+xml')) { + return true; + } + if (type.includes('application/x-ndjson')) { + return true; + } + return false; + } + })); + this.koaApp.use(this.makeAssetsServingController()); + this.koaApp.use(this.registry.makeShimController()); + } + // Using h2c server has an implication that multiple requests may share the same connection and x-cloud-trace-context + // TraceId is expected to be request-bound and unique. So these two has to be distinguished. + insertAsyncHookMiddleware() { + const asyncHookMiddleware = async (ctx, next) => { + const googleTraceId = ctx.get('x-cloud-trace-context').split('/')?.[0]; + this.threadLocal.setup({ + traceId: (0, crypto_1.randomUUID)(), + traceT0: new Date(), + googleTraceId, + }); + return next(); + }; + this.koaApp.use(asyncHookMiddleware); + } + async standDown() { + const tasks = []; + if (this.httpAlternativeServer?.listening) { + this.httpAlternativeServer.closeIdleConnections?.(); + this.httpAlternativeServer.close(); + tasks.push(new Promise((resolve, reject) => { + this.httpAlternativeServer.close((err) => { + if (err) { + return reject(err); + } + resolve(); + }); + })); + } + tasks.push(super.standDown()); + await Promise.all(tasks); + } +}; +exports.SERPStandAloneServer = SERPStandAloneServer; +__decorate([ + (0, decorators_1.runOnce)(), + __metadata("design:type", Function), + __metadata("design:paramtypes", []), + __metadata("design:returntype", void 0) +], SERPStandAloneServer.prototype, "insertAsyncHookMiddleware", null); +__decorate([ + (0, finalizer_1.Finalizer)(), + __metadata("design:type", Function), + __metadata("design:paramtypes", []), + __metadata("design:returntype", Promise) +], SERPStandAloneServer.prototype, "standDown", null); +exports.SERPStandAloneServer = SERPStandAloneServer = __decorate([ + (0, tsyringe_1.singleton)(), + __metadata("design:paramtypes", [logger_1.GlobalLogger, + registry_1.RPCRegistry, + serp_1.SerpHost, + async_context_1.AsyncLocalContext, + threaded_1.ThreadedServiceRegistry]) +], SERPStandAloneServer); +const instance = tsyringe_1.container.resolve(SERPStandAloneServer); +exports.default = instance; +if (process.env.NODE_ENV?.includes('dry-run')) { + instance.serviceReady().then(() => finalizer_1.default.terminate()); +} +else { + instance.serviceReady().then((s) => s.h2c().listen(parseInt(process.env.PORT || '') || 3000)); +} +//# sourceMappingURL=serp.js.map \ No newline at end of file diff --git a/build/stand-alone/serp.js.map b/build/stand-alone/serp.js.map new file mode 100644 index 0000000000000000000000000000000000000000..ca6236afa18c8dfb9f4631e783d732da9d1b973b --- /dev/null +++ b/build/stand-alone/serp.js.map @@ -0,0 +1 @@ +{"version":3,"file":"serp.js","sourceRoot":"","sources":["../../src/stand-alone/serp.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/build/utils/encoding.js b/build/utils/encoding.js new file mode 100644 index 0000000000000000000000000000000000000000..2a30f801d3a9cf8e960d13ea1a294efb3ea1700f --- /dev/null +++ b/build/utils/encoding.js @@ -0,0 +1,26 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.decodeFileStream = decodeFileStream; +exports.readFile = readFile; +const fs_1 = require("fs"); +const stream_1 = require("stream"); +const web_1 = require("stream/web"); +async function decodeFileStream(fileStream, encoding = 'utf-8') { + const decodeStream = new web_1.TextDecoderStream(encoding, { fatal: false, ignoreBOM: false }); + stream_1.Readable.toWeb(fileStream).pipeThrough(decodeStream); + const chunks = []; + for await (const chunk of decodeStream.readable) { + chunks.push(chunk); + } + return chunks.join(''); +} +async function readFile(filePath, encoding = 'utf-8') { + const decodeStream = new web_1.TextDecoderStream(encoding, { fatal: false, ignoreBOM: false }); + stream_1.Readable.toWeb((0, fs_1.createReadStream)(filePath)).pipeThrough(decodeStream); + const chunks = []; + for await (const chunk of decodeStream.readable) { + chunks.push(chunk); + } + return chunks.join(''); +} +//# sourceMappingURL=encoding.js.map \ No newline at end of file diff --git a/build/utils/encoding.js.map b/build/utils/encoding.js.map new file mode 100644 index 0000000000000000000000000000000000000000..f0e154ddfb80b75682c1c96c8d9cfd7108e9873f --- /dev/null +++ b/build/utils/encoding.js.map @@ -0,0 +1 @@ +{"version":3,"file":"encoding.js","sourceRoot":"","sources":["../../src/utils/encoding.ts"],"names":[],"mappings":";;AAIA,4CAaC;AAGD,4BAaC;AAjCD,2BAAsC;AACtC,mCAAkC;AAClC,oCAA+C;AAExC,KAAK,UAAU,gBAAgB,CAClC,UAAoB,EACpB,WAAmB,OAAO;IAE1B,MAAM,YAAY,GAAG,IAAI,uBAAiB,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;IACzF,iBAAQ,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;IACrD,MAAM,MAAM,GAAG,EAAE,CAAC;IAElB,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,YAAY,CAAC,QAAQ,EAAE,CAAC;QAC9C,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC;IAED,OAAO,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAC3B,CAAC;AAGM,KAAK,UAAU,QAAQ,CAC1B,QAAgB,EAChB,WAAmB,OAAO;IAE1B,MAAM,YAAY,GAAG,IAAI,uBAAiB,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;IACzF,iBAAQ,CAAC,KAAK,CAAC,IAAA,qBAAgB,EAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;IACrE,MAAM,MAAM,GAAG,EAAE,CAAC;IAElB,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,YAAY,CAAC,QAAQ,EAAE,CAAC;QAC9C,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC;IAED,OAAO,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAC3B,CAAC"} \ No newline at end of file diff --git a/build/utils/get-function-url.js b/build/utils/get-function-url.js new file mode 100644 index 0000000000000000000000000000000000000000..03e52a667d6c38cd5a6bacfd3704ae6211a0e35b --- /dev/null +++ b/build/utils/get-function-url.js @@ -0,0 +1,27 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.getFunctionUrl = getFunctionUrl; +const google_auth_library_1 = require("google-auth-library"); +/** + * Get the URL of a given v2 cloud function. + * + * @param {string} name the function's name + * @param {string} location the function's location + * @return {Promise} The URL of the function + */ +async function getFunctionUrl(name, location = "us-central1") { + const projectId = `reader-6b7dc`; + const url = "https://cloudfunctions.googleapis.com/v2beta/" + + `projects/${projectId}/locations/${location}/functions/${name}`; + const auth = new google_auth_library_1.GoogleAuth({ + scopes: 'https://www.googleapis.com/auth/cloud-platform', + }); + const client = await auth.getClient(); + const res = await client.request({ url }); + const uri = res.data?.serviceConfig?.uri; + if (!uri) { + throw new Error(`Unable to retreive uri for function at ${url}`); + } + return uri; +} +//# sourceMappingURL=get-function-url.js.map \ No newline at end of file diff --git a/build/utils/get-function-url.js.map b/build/utils/get-function-url.js.map new file mode 100644 index 0000000000000000000000000000000000000000..c256fbc91277dd8685ba6ff01dec7b08858ee112 --- /dev/null +++ b/build/utils/get-function-url.js.map @@ -0,0 +1 @@ +{"version":3,"file":"get-function-url.js","sourceRoot":"","sources":["../../src/utils/get-function-url.ts"],"names":[],"mappings":";;AASA,wCAcC;AAvBD,6DAAiD;AAEjD;;;;;;GAMG;AACI,KAAK,UAAU,cAAc,CAAC,IAAY,EAAE,QAAQ,GAAG,aAAa;IACvE,MAAM,SAAS,GAAG,cAAc,CAAC;IACjC,MAAM,GAAG,GAAG,+CAA+C;QACvD,YAAY,SAAS,cAAc,QAAQ,cAAc,IAAI,EAAE,CAAC;IACpE,MAAM,IAAI,GAAG,IAAI,gCAAU,CAAC;QACxB,MAAM,EAAE,gDAAgD;KAC3D,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;IACtC,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,OAAO,CAAM,EAAE,GAAG,EAAE,CAAC,CAAC;IAC/C,MAAM,GAAG,GAAG,GAAG,CAAC,IAAI,EAAE,aAAa,EAAE,GAAG,CAAC;IACzC,IAAI,CAAC,GAAG,EAAE,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,0CAA0C,GAAG,EAAE,CAAC,CAAC;IACrE,CAAC;IACD,OAAO,GAAG,CAAC;AACf,CAAC"} \ No newline at end of file diff --git a/build/utils/ip.js b/build/utils/ip.js new file mode 100644 index 0000000000000000000000000000000000000000..027a7cf21b80bc8fa2f99504e130ce3eac3216a7 --- /dev/null +++ b/build/utils/ip.js @@ -0,0 +1,138 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.CIDR = void 0; +exports.parseIp = parseIp; +exports.parseCIDR = parseCIDR; +exports.isIPInNonPublicRange = isIPInNonPublicRange; +const net_1 = require("net"); +function parseIp(ip) { + if ((0, net_1.isIPv4)(ip)) { + const [a, b, c, d] = ip.split('.').map(Number); + const buf = Buffer.alloc(4); + buf.writeUInt8(a, 0); + buf.writeUInt8(b, 1); + buf.writeUInt8(c, 2); + buf.writeUInt8(d, 3); + return buf; + } + if ((0, net_1.isIPv6)(ip)) { + if (ip.includes('.')) { + const parts = ip.split(':'); + const ipv4Part = parts.pop(); + if (!ipv4Part) + throw new Error('Invalid IPv6 address'); + const ipv4Bytes = parseIp(ipv4Part); + parts.push('0'); + const ipv6Bytes = parseIp(parts.join(':')); + ipv6Bytes.writeUInt32BE(ipv4Bytes.readUInt32BE(0), 12); + return ipv6Bytes; + } + const buf = Buffer.alloc(16); + // Expand :: notation + let expanded = ip; + if (ip.includes('::')) { + const sides = ip.split('::'); + const left = sides[0] ? sides[0].split(':') : []; + const right = sides[1] ? sides[1].split(':') : []; + const middle = Array(8 - left.length - right.length).fill('0'); + expanded = [...left, ...middle, ...right].join(':'); + } + // Convert to buffer + const parts = expanded.split(':'); + let offset = 0; + for (const part of parts) { + buf.writeUInt16BE(parseInt(part, 16), offset); + offset += 2; + } + return buf; + } + throw new Error('Invalid IP address'); +} +function parseCIDR(cidr) { + const [ip, prefixTxt] = cidr.split('/'); + const buf = parseIp(ip); + const maskBuf = Buffer.alloc(buf.byteLength, 0xff); + const prefixBits = parseInt(prefixTxt); + let offsetBits = 0; + while (offsetBits < (buf.byteLength * 8)) { + if (offsetBits <= (prefixBits - 8)) { + offsetBits += 8; + continue; + } + const bitsRemain = prefixBits - offsetBits; + const byteOffset = Math.floor(offsetBits / 8); + if (bitsRemain > 0) { + const theByte = buf[byteOffset]; + const mask = 0xff << (8 - bitsRemain); + maskBuf[byteOffset] = mask; + buf[byteOffset] = theByte & mask; + offsetBits += 8; + continue; + } + ; + buf[byteOffset] = 0; + maskBuf[byteOffset] = 0; + offsetBits += 8; + } + return [buf, maskBuf]; +} +class CIDR { + constructor(cidr) { + this.text = cidr; + [this.buff, this.mask] = parseCIDR(cidr); + } + toString() { + return this.text; + } + get family() { + return this.buff.byteLength === 4 ? 4 : 6; + } + test(ip) { + const parsedIp = typeof ip === 'string' ? parseIp(ip) : ip; + if (parsedIp.byteLength !== this.buff.byteLength) { + return false; + } + for (const i of Array(this.buff.byteLength).keys()) { + const t = parsedIp[i]; + const m = this.mask[i]; + if (m === 0) { + return true; + } + const r = this.buff[i]; + if ((t & m) !== r) { + return false; + } + } + return true; + } +} +exports.CIDR = CIDR; +const nonPublicNetworks4 = [ + '10.0.0.0/8', + '172.16.0.0/12', + '192.168.0.0/16', + '127.0.0.0/8', + '255.255.255.255/32', + '169.254.0.0/16', + '224.0.0.0/4', + '100.64.0.0/10', + '0.0.0.0/32', +]; +const nonPublicNetworks6 = [ + 'fc00::/7', + 'fe80::/10', + 'ff00::/8', + '::127.0.0.0/104', + '::/128', +]; +const nonPublicCIDRs = [...nonPublicNetworks4, ...nonPublicNetworks6].map(cidr => new CIDR(cidr)); +function isIPInNonPublicRange(ip) { + const parsed = parseIp(ip); + for (const cidr of nonPublicCIDRs) { + if (cidr.test(parsed)) { + return true; + } + } + return false; +} +//# sourceMappingURL=ip.js.map \ No newline at end of file diff --git a/build/utils/ip.js.map b/build/utils/ip.js.map new file mode 100644 index 0000000000000000000000000000000000000000..47de5e44838f5aad80c32236ca9cc054d7621c69 --- /dev/null +++ b/build/utils/ip.js.map @@ -0,0 +1 @@ +{"version":3,"file":"ip.js","sourceRoot":"","sources":["../../src/utils/ip.ts"],"names":[],"mappings":";;;AAEA,0BAkDC;AAGD,8BA+BC;AAsED,oDAUC;AAtKD,6BAAqC;AAErC,SAAgB,OAAO,CAAC,EAAU;IAC9B,IAAI,IAAA,YAAM,EAAC,EAAE,CAAC,EAAE,CAAC;QACb,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAE/C,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC5B,GAAG,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACrB,GAAG,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACrB,GAAG,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACrB,GAAG,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAErB,OAAO,GAAG,CAAC;IACf,CAAC;IAED,IAAI,IAAA,YAAM,EAAC,EAAE,CAAC,EAAE,CAAC;QACb,IAAI,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YACnB,MAAM,KAAK,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC5B,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC;YAC7B,IAAI,CAAC,QAAQ;gBAAE,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;YACvD,MAAM,SAAS,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;YACpC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAChB,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;YAC3C,SAAS,CAAC,aAAa,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAEvD,OAAO,SAAS,CAAC;QACrB,CAAC;QAED,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAE7B,qBAAqB;QACrB,IAAI,QAAQ,GAAG,EAAE,CAAC;QAClB,IAAI,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YACpB,MAAM,KAAK,GAAG,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC7B,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACjD,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAClD,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAC/D,QAAQ,GAAG,CAAC,GAAG,IAAI,EAAE,GAAG,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACxD,CAAC;QAED,oBAAoB;QACpB,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAClC,IAAI,MAAM,GAAG,CAAC,CAAC;QACf,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACvB,GAAG,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;YAC9C,MAAM,IAAI,CAAC,CAAC;QAChB,CAAC;QAED,OAAO,GAAG,CAAC;IACf,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;AAC1C,CAAC;AAGD,SAAgB,SAAS,CAAC,IAAY;IAClC,MAAM,CAAC,EAAE,EAAE,SAAS,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACxC,MAAM,GAAG,GAAG,OAAO,CAAC,EAAE,CAAC,CAAC;IACxB,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;IACnD,MAAM,UAAU,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC;IAEvC,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,OAAO,UAAU,GAAG,CAAC,GAAG,CAAC,UAAU,GAAG,CAAC,CAAC,EAAE,CAAC;QACvC,IAAI,UAAU,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC,EAAE,CAAC;YACjC,UAAU,IAAI,CAAC,CAAC;YAChB,SAAS;QACb,CAAC;QACD,MAAM,UAAU,GAAG,UAAU,GAAG,UAAU,CAAC;QAC3C,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC;QAE9C,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;YACjB,MAAM,OAAO,GAAG,GAAG,CAAC,UAAU,CAAC,CAAC;YAChC,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC;YACtC,OAAO,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC;YAC3B,GAAG,CAAC,UAAU,CAAC,GAAG,OAAO,GAAG,IAAI,CAAC;YAEjC,UAAU,IAAI,CAAC,CAAC;YAChB,SAAS;QACb,CAAC;QAAA,CAAC;QACF,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;QACpB,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;QAExB,UAAU,IAAI,CAAC,CAAC;IACpB,CAAC;IAED,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;AAC1B,CAAC;AAED,MAAa,IAAI;IAIb,YAAY,IAAY;QACpB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IAC7C,CAAC;IAED,QAAQ;QACJ,OAAO,IAAI,CAAC,IAAI,CAAC;IACrB,CAAC;IAED,IAAI,MAAM;QACN,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9C,CAAC;IAED,IAAI,CAAC,EAAmB;QACpB,MAAM,QAAQ,GAAG,OAAO,EAAE,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAE3D,IAAI,QAAQ,CAAC,UAAU,KAAK,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YAC/C,OAAO,KAAK,CAAC;QACjB,CAAC;QAED,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;YACjD,MAAM,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;YACtB,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAEvB,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;gBACV,OAAO,IAAI,CAAC;YAChB,CAAC;YAED,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACvB,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;gBAChB,OAAO,KAAK,CAAC;YACjB,CAAC;QACL,CAAC;QAED,OAAO,IAAI,CAAC;IAChB,CAAC;CACJ;AAxCD,oBAwCC;AAED,MAAM,kBAAkB,GAAG;IACvB,YAAY;IACZ,eAAe;IACf,gBAAgB;IAEhB,aAAa;IACb,oBAAoB;IACpB,gBAAgB;IAChB,aAAa;IAEb,eAAe;IACf,YAAY;CACf,CAAC;AAGF,MAAM,kBAAkB,GAAG;IACvB,UAAU;IACV,WAAW;IACX,UAAU;IAEV,iBAAiB;IACjB,QAAQ;CACX,CAAC;AAEF,MAAM,cAAc,GAAG,CAAC,GAAG,kBAAkB,EAAE,GAAG,kBAAkB,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AAElG,SAAgB,oBAAoB,CAAC,EAAU;IAC3C,MAAM,MAAM,GAAG,OAAO,CAAC,EAAE,CAAC,CAAC;IAE3B,KAAK,MAAM,IAAI,IAAI,cAAc,EAAE,CAAC;QAChC,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;YACpB,OAAO,IAAI,CAAC;QAChB,CAAC;IACL,CAAC;IAED,OAAO,KAAK,CAAC;AACjB,CAAC"} \ No newline at end of file diff --git a/build/utils/markdown.js b/build/utils/markdown.js new file mode 100644 index 0000000000000000000000000000000000000000..bb31e59088eba6f6c7f7781f07e2efb94d745092 --- /dev/null +++ b/build/utils/markdown.js @@ -0,0 +1,37 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.tidyMarkdown = tidyMarkdown; +function tidyMarkdown(markdown) { + // Step 1: Handle complex broken links with text and optional images spread across multiple lines + let normalizedMarkdown = markdown.replace(/\[\s*([^\]\n]+?)\s*\]\s*\(\s*([^)]+)\s*\)/g, (match, text, url) => { + // Remove internal new lines and excessive spaces within the text + text = text.replace(/\s+/g, ' ').trim(); + url = url.replace(/\s+/g, '').trim(); + return `[${text}](${url})`; + }); + normalizedMarkdown = normalizedMarkdown.replace(/\[\s*([^\]\n!]*?)\s*\n*(?:!\[([^\]]*)\]\((.*?)\))?\s*\n*\]\s*\(\s*([^)]+)\s*\)/g, (match, text, alt, imgUrl, linkUrl) => { + // Normalize by removing excessive spaces and new lines + text = text.replace(/\s+/g, ' ').trim(); + alt = alt ? alt.replace(/\s+/g, ' ').trim() : ''; + imgUrl = imgUrl ? imgUrl.replace(/\s+/g, '').trim() : ''; + linkUrl = linkUrl.replace(/\s+/g, '').trim(); + if (imgUrl) { + return `[${text} ![${alt}](${imgUrl})](${linkUrl})`; + } + else { + return `[${text}](${linkUrl})`; + } + }); + // Step 2: Normalize regular links that may be broken across lines + normalizedMarkdown = normalizedMarkdown.replace(/\[\s*([^\]]+)\]\s*\(\s*([^)]+)\)/g, (match, text, url) => { + text = text.replace(/\s+/g, ' ').trim(); + url = url.replace(/\s+/g, '').trim(); + return `[${text}](${url})`; + }); + // Step 3: Replace more than two consecutive empty lines with exactly two empty lines + normalizedMarkdown = normalizedMarkdown.replace(/\n{3,}/g, '\n\n'); + // Step 4: Remove leading spaces from each line + normalizedMarkdown = normalizedMarkdown.replace(/^[ \t]+/gm, ''); + return normalizedMarkdown.trim(); +} +//# sourceMappingURL=markdown.js.map \ No newline at end of file diff --git a/build/utils/markdown.js.map b/build/utils/markdown.js.map new file mode 100644 index 0000000000000000000000000000000000000000..b5b34d53e87608c995bb346e4edfeabff1698842 --- /dev/null +++ b/build/utils/markdown.js.map @@ -0,0 +1 @@ +{"version":3,"file":"markdown.js","sourceRoot":"","sources":["../../src/utils/markdown.ts"],"names":[],"mappings":";;AACA,oCAqCC;AArCD,SAAgB,YAAY,CAAC,QAAgB;IAEzC,iGAAiG;IACjG,IAAI,kBAAkB,GAAG,QAAQ,CAAC,OAAO,CAAC,4CAA4C,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE;QACzG,iEAAiE;QACjE,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;QACxC,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QACrC,OAAO,IAAI,IAAI,KAAK,GAAG,GAAG,CAAC;IAC/B,CAAC,CAAC,CAAC;IAEH,kBAAkB,GAAG,kBAAkB,CAAC,OAAO,CAAC,iFAAiF,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE;QACrK,uDAAuD;QACvD,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;QACxC,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACjD,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACzD,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QAC7C,IAAI,MAAM,EAAE,CAAC;YACT,OAAO,IAAI,IAAI,MAAM,GAAG,KAAK,MAAM,MAAM,OAAO,GAAG,CAAC;QACxD,CAAC;aAAM,CAAC;YACJ,OAAO,IAAI,IAAI,KAAK,OAAO,GAAG,CAAC;QACnC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,kEAAkE;IAClE,kBAAkB,GAAG,kBAAkB,CAAC,OAAO,CAAC,mCAAmC,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE;QACtG,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;QACxC,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QACrC,OAAO,IAAI,IAAI,KAAK,GAAG,GAAG,CAAC;IAC/B,CAAC,CAAC,CAAC;IAEH,qFAAqF;IACrF,kBAAkB,GAAG,kBAAkB,CAAC,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IAEnE,+CAA+C;IAC/C,kBAAkB,GAAG,kBAAkB,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;IAEjE,OAAO,kBAAkB,CAAC,IAAI,EAAE,CAAC;AACrC,CAAC"} \ No newline at end of file diff --git a/build/utils/misc.js b/build/utils/misc.js new file mode 100644 index 0000000000000000000000000000000000000000..d0d495178b7f94179299613b3b825eca235f7289 --- /dev/null +++ b/build/utils/misc.js @@ -0,0 +1,28 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.cleanAttribute = cleanAttribute; +exports.tryDecodeURIComponent = tryDecodeURIComponent; +exports.toAsyncGenerator = toAsyncGenerator; +exports.toGenerator = toGenerator; +const civkit_1 = require("civkit"); +function cleanAttribute(attribute) { + return attribute ? attribute.replace(/(\n+\s*)+/g, '\n') : ''; +} +function tryDecodeURIComponent(input) { + try { + return decodeURIComponent(input); + } + catch (err) { + if (URL.canParse(input, 'http://localhost:3000')) { + return input; + } + throw new civkit_1.ParamValidationError(`Invalid URIComponent: ${input}`); + } +} +async function* toAsyncGenerator(val) { + yield val; +} +async function* toGenerator(val) { + yield val; +} +//# sourceMappingURL=misc.js.map \ No newline at end of file diff --git a/build/utils/misc.js.map b/build/utils/misc.js.map new file mode 100644 index 0000000000000000000000000000000000000000..7dec0e81005803e940fd4f7f848848bf8290e2ac --- /dev/null +++ b/build/utils/misc.js.map @@ -0,0 +1 @@ +{"version":3,"file":"misc.js","sourceRoot":"","sources":["../../src/utils/misc.ts"],"names":[],"mappings":";;AAEA,wCAEC;AAGD,sDAUC;AAGD,4CAEC;AAED,kCAEC;AA1BD,mCAA8C;AAE9C,SAAgB,cAAc,CAAC,SAAwB;IACnD,OAAO,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AAClE,CAAC;AAGD,SAAgB,qBAAqB,CAAC,KAAa;IAC/C,IAAI,CAAC;QACD,OAAO,kBAAkB,CAAC,KAAK,CAAC,CAAC;IACrC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACX,IAAI,GAAG,CAAC,QAAQ,CAAC,KAAK,EAAE,uBAAuB,CAAC,EAAE,CAAC;YAC/C,OAAO,KAAK,CAAC;QACjB,CAAC;QAED,MAAM,IAAI,6BAAoB,CAAC,yBAAyB,KAAK,EAAE,CAAC,CAAC;IACrE,CAAC;AACL,CAAC;AAGM,KAAK,SAAS,CAAC,CAAC,gBAAgB,CAAI,GAAM;IAC7C,MAAM,GAAG,CAAC;AACd,CAAC;AAEM,KAAK,SAAS,CAAC,CAAC,WAAW,CAAI,GAAM;IACxC,MAAM,GAAG,CAAC;AACd,CAAC"} \ No newline at end of file diff --git a/build/utils/tailwind-classes.js b/build/utils/tailwind-classes.js new file mode 100644 index 0000000000000000000000000000000000000000..1abba7b98bd8cef0f982c525501bf714ebd74b54 --- /dev/null +++ b/build/utils/tailwind-classes.js @@ -0,0 +1,9629 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.tailwindClasses = void 0; +exports.tailwindClasses = new Set([ + "aspect-auto", + "aspect-square", + "aspect-video", + "container", + "columns-1", + "columns-2", + "columns-3", + "columns-4", + "columns-5", + "columns-6", + "columns-7", + "columns-8", + "columns-9", + "columns-10", + "columns-11", + "columns-12", + "columns-auto", + "columns-3xs", + "columns-2xs", + "columns-xs", + "columns-sm", + "columns-md", + "columns-lg", + "columns-xl", + "columns-2xl", + "columns-3xl", + "columns-4xl", + "columns-5xl", + "columns-6xl", + "columns-7xl", + "break-after-auto", + "break-after-avoid", + "break-after-all", + "break-after-avoid-page", + "break-after-page", + "break-after-left", + "break-after-right", + "break-after-column", + "break-before-auto", + "break-before-avoid", + "break-before-all", + "break-before-avoid-page", + "break-before-page", + "break-before-left", + "break-before-right", + "break-before-column", + "break-inside-auto", + "break-inside-avoid", + "break-inside-avoid-page", + "break-inside-avoid-column", + "box-decoration-clone", + "box-decoration-slice", + "box-border", + "box-content", + "block", + "inline-block", + "inline", + "flex", + "inline-flex", + "table", + "inline-table", + "table-caption", + "table-cell", + "table-column", + "table-column-group", + "table-footer-group", + "table-header-group", + "table-row-group", + "table-row", + "flow-root", + "grid", + "inline-grid", + "contents", + "list-item", + // "hidden", + "float-start", + "float-end", + "float-right", + "float-left", + "float-none", + "clear-start", + "clear-end", + "clear-left", + "clear-right", + "clear-both", + "clear-none", + "isolate", + "isolation-auto", + "object-contain", + "object-cover", + "object-fill", + "object-none", + "object-scale-down", + "object-bottom", + "object-center", + "object-left", + "object-left-bottom", + "object-left-top", + "object-right", + "object-right-bottom", + "object-right-top", + "object-top", + "overflow-auto", + "overflow-hidden", + "overflow-clip", + "overflow-visible", + "overflow-scroll", + "overflow-x-auto", + "overflow-y-auto", + "overflow-x-hidden", + "overflow-y-hidden", + "overflow-x-clip", + "overflow-y-clip", + "overflow-x-visible", + "overflow-y-visible", + "overflow-x-scroll", + "overflow-y-scroll", + "overscroll-auto", + "overscroll-contain", + "overscroll-none", + "overscroll-y-auto", + "overscroll-y-contain", + "overscroll-y-none", + "overscroll-x-auto", + "overscroll-x-contain", + "overscroll-x-none", + "static", + "fixed", + "absolute", + "relative", + "sticky", + "inset-0", + "inset-x-0", + "inset-y-0", + "start-0", + "end-0", + "top-0", + "right-0", + "bottom-0", + "left-0", + "inset-px", + "inset-x-px", + "inset-y-px", + "start-px", + "end-px", + "top-px", + "right-px", + "bottom-px", + "left-px", + "inset-0.5", + "inset-x-0.5", + "inset-y-0.5", + "start-0.5", + "end-0.5", + "top-0.5", + "right-0.5", + "bottom-0.5", + "left-0.5", + "inset-1", + "inset-x-1", + "inset-y-1", + "start-1", + "end-1", + "top-1", + "right-1", + "bottom-1", + "left-1", + "inset-1.5", + "inset-x-1.5", + "inset-y-1.5", + "start-1.5", + "end-1.5", + "top-1.5", + "right-1.5", + "bottom-1.5", + "left-1.5", + "inset-2", + "inset-x-2", + "inset-y-2", + "start-2", + "end-2", + "top-2", + "right-2", + "bottom-2", + "left-2", + "inset-2.5", + "inset-x-2.5", + "inset-y-2.5", + "start-2.5", + "end-2.5", + "top-2.5", + "right-2.5", + "bottom-2.5", + "left-2.5", + "inset-3", + "inset-x-3", + "inset-y-3", + "start-3", + "end-3", + "top-3", + "right-3", + "bottom-3", + "left-3", + "inset-3.5", + "inset-x-3.5", + "inset-y-3.5", + "start-3.5", + "end-3.5", + "top-3.5", + "right-3.5", + "bottom-3.5", + "left-3.5", + "inset-4", + "inset-x-4", + "inset-y-4", + "start-4", + "end-4", + "top-4", + "right-4", + "bottom-4", + "left-4", + "inset-5", + "inset-x-5", + "inset-y-5", + "start-5", + "end-5", + "top-5", + "right-5", + "bottom-5", + "left-5", + "inset-6", + "inset-x-6", + "inset-y-6", + "start-6", + "end-6", + "top-6", + "right-6", + "bottom-6", + "left-6", + "inset-7", + "inset-x-7", + "inset-y-7", + "start-7", + "end-7", + "top-7", + "right-7", + "bottom-7", + "left-7", + "inset-8", + "inset-x-8", + "inset-y-8", + "start-8", + "end-8", + "top-8", + "right-8", + "bottom-8", + "left-8", + "inset-9", + "inset-x-9", + "inset-y-9", + "start-9", + "end-9", + "top-9", + "right-9", + "bottom-9", + "left-9", + "inset-10", + "inset-x-10", + "inset-y-10", + "start-10", + "end-10", + "top-10", + "right-10", + "bottom-10", + "left-10", + "inset-11", + "inset-x-11", + "inset-y-11", + "start-11", + "end-11", + "top-11", + "right-11", + "bottom-11", + "left-11", + "inset-12", + "inset-x-12", + "inset-y-12", + "start-12", + "end-12", + "top-12", + "right-12", + "bottom-12", + "left-12", + "inset-14", + "inset-x-14", + "inset-y-14", + "start-14", + "end-14", + "top-14", + "right-14", + "bottom-14", + "left-14", + "inset-16", + "inset-x-16", + "inset-y-16", + "start-16", + "end-16", + "top-16", + "right-16", + "bottom-16", + "left-16", + "inset-20", + "inset-x-20", + "inset-y-20", + "start-20", + "end-20", + "top-20", + "right-20", + "bottom-20", + "left-20", + "inset-24", + "inset-x-24", + "inset-y-24", + "start-24", + "end-24", + "top-24", + "right-24", + "bottom-24", + "left-24", + "inset-28", + "inset-x-28", + "inset-y-28", + "start-28", + "end-28", + "top-28", + "right-28", + "bottom-28", + "left-28", + "inset-32", + "inset-x-32", + "inset-y-32", + "start-32", + "end-32", + "top-32", + "right-32", + "bottom-32", + "left-32", + "inset-36", + "inset-x-36", + "inset-y-36", + "start-36", + "end-36", + "top-36", + "right-36", + "bottom-36", + "left-36", + "inset-40", + "inset-x-40", + "inset-y-40", + "start-40", + "end-40", + "top-40", + "right-40", + "bottom-40", + "left-40", + "inset-44", + "inset-x-44", + "inset-y-44", + "start-44", + "end-44", + "top-44", + "right-44", + "bottom-44", + "left-44", + "inset-48", + "inset-x-48", + "inset-y-48", + "start-48", + "end-48", + "top-48", + "right-48", + "bottom-48", + "left-48", + "inset-52", + "inset-x-52", + "inset-y-52", + "start-52", + "end-52", + "top-52", + "right-52", + "bottom-52", + "left-52", + "inset-56", + "inset-x-56", + "inset-y-56", + "start-56", + "end-56", + "top-56", + "right-56", + "bottom-56", + "left-56", + "inset-60", + "inset-x-60", + "inset-y-60", + "start-60", + "end-60", + "top-60", + "right-60", + "bottom-60", + "left-60", + "inset-64", + "inset-x-64", + "inset-y-64", + "start-64", + "end-64", + "top-64", + "right-64", + "bottom-64", + "left-64", + "inset-72", + "inset-x-72", + "inset-y-72", + "start-72", + "end-72", + "top-72", + "right-72", + "bottom-72", + "left-72", + "inset-80", + "inset-x-80", + "inset-y-80", + "start-80", + "end-80", + "top-80", + "right-80", + "bottom-80", + "left-80", + "inset-96", + "inset-x-96", + "inset-y-96", + "start-96", + "end-96", + "top-96", + "right-96", + "bottom-96", + "left-96", + "inset-auto", + "inset-1/2", + "inset-1/3", + "inset-2/3", + "inset-1/4", + "inset-2/4", + "inset-3/4", + "inset-full", + "inset-x-auto", + "inset-x-1/2", + "inset-x-1/3", + "inset-x-2/3", + "inset-x-1/4", + "inset-x-2/4", + "inset-x-3/4", + "inset-x-full", + "inset-y-auto", + "inset-y-1/2", + "inset-y-1/3", + "inset-y-2/3", + "inset-y-1/4", + "inset-y-2/4", + "inset-y-3/4", + "inset-y-full", + "start-auto", + "start-1/2", + "start-1/3", + "start-2/3", + "start-1/4", + "start-2/4", + "start-3/4", + "start-full", + "end-auto", + "end-1/2", + "end-1/3", + "end-2/3", + "end-1/4", + "end-2/4", + "end-3/4", + "end-full", + "top-auto", + "top-1/2", + "top-1/3", + "top-2/3", + "top-1/4", + "top-2/4", + "top-3/4", + "top-full", + "right-auto", + "right-1/2", + "right-1/3", + "right-2/3", + "right-1/4", + "right-2/4", + "right-3/4", + "right-full", + "bottom-auto", + "bottom-1/2", + "bottom-1/3", + "bottom-2/3", + "bottom-1/4", + "bottom-2/4", + "bottom-3/4", + "bottom-full", + "left-auto", + "left-1/2", + "left-1/3", + "left-2/3", + "left-1/4", + "left-2/4", + "left-3/4", + "left-full", + "visible", + "invisible", + "collapse", + "z-0", + "z-10", + "z-20", + "z-30", + "z-40", + "z-50", + "z-auto", + "basis-0", + "basis-1", + "basis-2", + "basis-3", + "basis-4", + "basis-5", + "basis-6", + "basis-7", + "basis-8", + "basis-9", + "basis-10", + "basis-11", + "basis-12", + "basis-14", + "basis-16", + "basis-20", + "basis-24", + "basis-28", + "basis-32", + "basis-36", + "basis-40", + "basis-44", + "basis-48", + "basis-52", + "basis-56", + "basis-60", + "basis-64", + "basis-72", + "basis-80", + "basis-96", + "basis-auto", + "basis-px", + "basis-0.5", + "basis-1.5", + "basis-2.5", + "basis-3.5", + "basis-1/2", + "basis-1/3", + "basis-2/3", + "basis-1/4", + "basis-2/4", + "basis-3/4", + "basis-1/5", + "basis-2/5", + "basis-3/5", + "basis-4/5", + "basis-1/6", + "basis-2/6", + "basis-3/6", + "basis-4/6", + "basis-5/6", + "basis-1/12", + "basis-2/12", + "basis-3/12", + "basis-4/12", + "basis-5/12", + "basis-6/12", + "basis-7/12", + "basis-8/12", + "basis-9/12", + "basis-10/12", + "basis-11/12", + "basis-full", + "flex-row", + "flex-row-reverse", + "flex-col", + "flex-col-reverse", + "flex-wrap", + "flex-wrap-reverse", + "flex-nowrap", + "flex-1", + "flex-auto", + "flex-initial", + "flex-none", + "grow", + "grow-0", + "shrink", + "shrink-0", + "order-1", + "order-2", + "order-3", + "order-4", + "order-5", + "order-6", + "order-7", + "order-8", + "order-9", + "order-10", + "order-11", + "order-12", + "order-first", + "order-last", + "order-none", + "grid-cols-1", + "grid-cols-2", + "grid-cols-3", + "grid-cols-4", + "grid-cols-5", + "grid-cols-6", + "grid-cols-7", + "grid-cols-8", + "grid-cols-9", + "grid-cols-10", + "grid-cols-11", + "grid-cols-12", + "grid-cols-none", + "grid-cols-subgrid", + "col-auto", + "col-span-1", + "col-span-2", + "col-span-3", + "col-span-4", + "col-span-5", + "col-span-6", + "col-span-7", + "col-span-8", + "col-span-9", + "col-span-10", + "col-span-11", + "col-span-12", + "col-span-full", + "col-start-1", + "col-start-2", + "col-start-3", + "col-start-4", + "col-start-5", + "col-start-6", + "col-start-7", + "col-start-8", + "col-start-9", + "col-start-10", + "col-start-11", + "col-start-12", + "col-start-13", + "col-start-auto", + "col-end-1", + "col-end-2", + "col-end-3", + "col-end-4", + "col-end-5", + "col-end-6", + "col-end-7", + "col-end-8", + "col-end-9", + "col-end-10", + "col-end-11", + "col-end-12", + "col-end-13", + "col-end-auto", + "grid-rows-1", + "grid-rows-2", + "grid-rows-3", + "grid-rows-4", + "grid-rows-5", + "grid-rows-6", + "grid-rows-7", + "grid-rows-8", + "grid-rows-9", + "grid-rows-10", + "grid-rows-11", + "grid-rows-12", + "grid-rows-none", + "grid-rows-subgrid", + "row-auto", + "row-span-1", + "row-span-2", + "row-span-3", + "row-span-4", + "row-span-5", + "row-span-6", + "row-span-7", + "row-span-8", + "row-span-9", + "row-span-10", + "row-span-11", + "row-span-12", + "row-span-full", + "row-start-1", + "row-start-2", + "row-start-3", + "row-start-4", + "row-start-5", + "row-start-6", + "row-start-7", + "row-start-8", + "row-start-9", + "row-start-10", + "row-start-11", + "row-start-12", + "row-start-13", + "row-start-auto", + "row-end-1", + "row-end-2", + "row-end-3", + "row-end-4", + "row-end-5", + "row-end-6", + "row-end-7", + "row-end-8", + "row-end-9", + "row-end-10", + "row-end-11", + "row-end-12", + "row-end-13", + "row-end-auto", + "grid-flow-row", + "grid-flow-col", + "grid-flow-dense", + "grid-flow-row-dense", + "grid-flow-col-dense", + "auto-cols-auto", + "auto-cols-min", + "auto-cols-max", + "auto-cols-fr", + "auto-rows-auto", + "auto-rows-min", + "auto-rows-max", + "auto-rows-fr", + "gap-0", + "gap-x-0", + "gap-y-0", + "gap-px", + "gap-x-px", + "gap-y-px", + "gap-0.5", + "gap-x-0.5", + "gap-y-0.5", + "gap-1", + "gap-x-1", + "gap-y-1", + "gap-1.5", + "gap-x-1.5", + "gap-y-1.5", + "gap-2", + "gap-x-2", + "gap-y-2", + "gap-2.5", + "gap-x-2.5", + "gap-y-2.5", + "gap-3", + "gap-x-3", + "gap-y-3", + "gap-3.5", + "gap-x-3.5", + "gap-y-3.5", + "gap-4", + "gap-x-4", + "gap-y-4", + "gap-5", + "gap-x-5", + "gap-y-5", + "gap-6", + "gap-x-6", + "gap-y-6", + "gap-7", + "gap-x-7", + "gap-y-7", + "gap-8", + "gap-x-8", + "gap-y-8", + "gap-9", + "gap-x-9", + "gap-y-9", + "gap-10", + "gap-x-10", + "gap-y-10", + "gap-11", + "gap-x-11", + "gap-y-11", + "gap-12", + "gap-x-12", + "gap-y-12", + "gap-14", + "gap-x-14", + "gap-y-14", + "gap-16", + "gap-x-16", + "gap-y-16", + "gap-20", + "gap-x-20", + "gap-y-20", + "gap-24", + "gap-x-24", + "gap-y-24", + "gap-28", + "gap-x-28", + "gap-y-28", + "gap-32", + "gap-x-32", + "gap-y-32", + "gap-36", + "gap-x-36", + "gap-y-36", + "gap-40", + "gap-x-40", + "gap-y-40", + "gap-44", + "gap-x-44", + "gap-y-44", + "gap-48", + "gap-x-48", + "gap-y-48", + "gap-52", + "gap-x-52", + "gap-y-52", + "gap-56", + "gap-x-56", + "gap-y-56", + "gap-60", + "gap-x-60", + "gap-y-60", + "gap-64", + "gap-x-64", + "gap-y-64", + "gap-72", + "gap-x-72", + "gap-y-72", + "gap-80", + "gap-x-80", + "gap-y-80", + "gap-96", + "gap-x-96", + "gap-y-96", + "justify-normal", + "justify-start", + "justify-end", + "justify-center", + "justify-between", + "justify-around", + "justify-evenly", + "justify-stretch", + "justify-items-start", + "justify-items-end", + "justify-items-center", + "justify-items-stretch", + "justify-self-auto", + "justify-self-start", + "justify-self-end", + "justify-self-center", + "justify-self-stretch", + "content-normal", + "content-center", + "content-start", + "content-end", + "content-between", + "content-around", + "content-evenly", + "content-baseline", + "content-stretch", + "items-start", + "items-end", + "items-center", + "items-baseline", + "items-stretch", + "self-auto", + "self-start", + "self-end", + "self-center", + "self-stretch", + "self-baseline", + "place-content-center", + "place-content-start", + "place-content-end", + "place-content-between", + "place-content-around", + "place-content-evenly", + "place-content-baseline", + "place-content-stretch", + "place-items-start", + "place-items-end", + "place-items-center", + "place-items-baseline", + "place-items-stretch", + "place-self-auto", + "place-self-start", + "place-self-end", + "place-self-center", + "place-self-stretch", + "p-0", + "px-0", + "py-0", + "ps-0", + "pe-0", + "pt-0", + "pr-0", + "pb-0", + "pl-0", + "p-px", + "px-px", + "py-px", + "ps-px", + "pe-px", + "pt-px", + "pr-px", + "pb-px", + "pl-px", + "p-0.5", + "px-0.5", + "py-0.5", + "ps-0.5", + "pe-0.5", + "pt-0.5", + "pr-0.5", + "pb-0.5", + "pl-0.5", + "p-1", + "px-1", + "py-1", + "ps-1", + "pe-1", + "pt-1", + "pr-1", + "pb-1", + "pl-1", + "p-1.5", + "px-1.5", + "py-1.5", + "ps-1.5", + "pe-1.5", + "pt-1.5", + "pr-1.5", + "pb-1.5", + "pl-1.5", + "p-2", + "px-2", + "py-2", + "ps-2", + "pe-2", + "pt-2", + "pr-2", + "pb-2", + "pl-2", + "p-2.5", + "px-2.5", + "py-2.5", + "ps-2.5", + "pe-2.5", + "pt-2.5", + "pr-2.5", + "pb-2.5", + "pl-2.5", + "p-3", + "px-3", + "py-3", + "ps-3", + "pe-3", + "pt-3", + "pr-3", + "pb-3", + "pl-3", + "p-3.5", + "px-3.5", + "py-3.5", + "ps-3.5", + "pe-3.5", + "pt-3.5", + "pr-3.5", + "pb-3.5", + "pl-3.5", + "p-4", + "px-4", + "py-4", + "ps-4", + "pe-4", + "pt-4", + "pr-4", + "pb-4", + "pl-4", + "p-5", + "px-5", + "py-5", + "ps-5", + "pe-5", + "pt-5", + "pr-5", + "pb-5", + "pl-5", + "p-6", + "px-6", + "py-6", + "ps-6", + "pe-6", + "pt-6", + "pr-6", + "pb-6", + "pl-6", + "p-7", + "px-7", + "py-7", + "ps-7", + "pe-7", + "pt-7", + "pr-7", + "pb-7", + "pl-7", + "p-8", + "px-8", + "py-8", + "ps-8", + "pe-8", + "pt-8", + "pr-8", + "pb-8", + "pl-8", + "p-9", + "px-9", + "py-9", + "ps-9", + "pe-9", + "pt-9", + "pr-9", + "pb-9", + "pl-9", + "p-10", + "px-10", + "py-10", + "ps-10", + "pe-10", + "pt-10", + "pr-10", + "pb-10", + "pl-10", + "p-11", + "px-11", + "py-11", + "ps-11", + "pe-11", + "pt-11", + "pr-11", + "pb-11", + "pl-11", + "p-12", + "px-12", + "py-12", + "ps-12", + "pe-12", + "pt-12", + "pr-12", + "pb-12", + "pl-12", + "p-14", + "px-14", + "py-14", + "ps-14", + "pe-14", + "pt-14", + "pr-14", + "pb-14", + "pl-14", + "p-16", + "px-16", + "py-16", + "ps-16", + "pe-16", + "pt-16", + "pr-16", + "pb-16", + "pl-16", + "p-20", + "px-20", + "py-20", + "ps-20", + "pe-20", + "pt-20", + "pr-20", + "pb-20", + "pl-20", + "p-24", + "px-24", + "py-24", + "ps-24", + "pe-24", + "pt-24", + "pr-24", + "pb-24", + "pl-24", + "p-28", + "px-28", + "py-28", + "ps-28", + "pe-28", + "pt-28", + "pr-28", + "pb-28", + "pl-28", + "p-32", + "px-32", + "py-32", + "ps-32", + "pe-32", + "pt-32", + "pr-32", + "pb-32", + "pl-32", + "p-36", + "px-36", + "py-36", + "ps-36", + "pe-36", + "pt-36", + "pr-36", + "pb-36", + "pl-36", + "p-40", + "px-40", + "py-40", + "ps-40", + "pe-40", + "pt-40", + "pr-40", + "pb-40", + "pl-40", + "p-44", + "px-44", + "py-44", + "ps-44", + "pe-44", + "pt-44", + "pr-44", + "pb-44", + "pl-44", + "p-48", + "px-48", + "py-48", + "ps-48", + "pe-48", + "pt-48", + "pr-48", + "pb-48", + "pl-48", + "p-52", + "px-52", + "py-52", + "ps-52", + "pe-52", + "pt-52", + "pr-52", + "pb-52", + "pl-52", + "p-56", + "px-56", + "py-56", + "ps-56", + "pe-56", + "pt-56", + "pr-56", + "pb-56", + "pl-56", + "p-60", + "px-60", + "py-60", + "ps-60", + "pe-60", + "pt-60", + "pr-60", + "pb-60", + "pl-60", + "p-64", + "px-64", + "py-64", + "ps-64", + "pe-64", + "pt-64", + "pr-64", + "pb-64", + "pl-64", + "p-72", + "px-72", + "py-72", + "ps-72", + "pe-72", + "pt-72", + "pr-72", + "pb-72", + "pl-72", + "p-80", + "px-80", + "py-80", + "ps-80", + "pe-80", + "pt-80", + "pr-80", + "pb-80", + "pl-80", + "p-96", + "px-96", + "py-96", + "ps-96", + "pe-96", + "pt-96", + "pr-96", + "pb-96", + "pl-96", + "m-0", + "mx-0", + "my-0", + "ms-0", + "me-0", + "mt-0", + "mr-0", + "mb-0", + "ml-0", + "m-px", + "mx-px", + "my-px", + "ms-px", + "me-px", + "mt-px", + "mr-px", + "mb-px", + "ml-px", + "m-0.5", + "mx-0.5", + "my-0.5", + "ms-0.5", + "me-0.5", + "mt-0.5", + "mr-0.5", + "mb-0.5", + "ml-0.5", + "m-1", + "mx-1", + "my-1", + "ms-1", + "me-1", + "mt-1", + "mr-1", + "mb-1", + "ml-1", + "m-1.5", + "mx-1.5", + "my-1.5", + "ms-1.5", + "me-1.5", + "mt-1.5", + "mr-1.5", + "mb-1.5", + "ml-1.5", + "m-2", + "mx-2", + "my-2", + "ms-2", + "me-2", + "mt-2", + "mr-2", + "mb-2", + "ml-2", + "m-2.5", + "mx-2.5", + "my-2.5", + "ms-2.5", + "me-2.5", + "mt-2.5", + "mr-2.5", + "mb-2.5", + "ml-2.5", + "m-3", + "mx-3", + "my-3", + "ms-3", + "me-3", + "mt-3", + "mr-3", + "mb-3", + "ml-3", + "m-3.5", + "mx-3.5", + "my-3.5", + "ms-3.5", + "me-3.5", + "mt-3.5", + "mr-3.5", + "mb-3.5", + "ml-3.5", + "m-4", + "mx-4", + "my-4", + "ms-4", + "me-4", + "mt-4", + "mr-4", + "mb-4", + "ml-4", + "m-5", + "mx-5", + "my-5", + "ms-5", + "me-5", + "mt-5", + "mr-5", + "mb-5", + "ml-5", + "m-6", + "mx-6", + "my-6", + "ms-6", + "me-6", + "mt-6", + "mr-6", + "mb-6", + "ml-6", + "m-7", + "mx-7", + "my-7", + "ms-7", + "me-7", + "mt-7", + "mr-7", + "mb-7", + "ml-7", + "m-8", + "mx-8", + "my-8", + "ms-8", + "me-8", + "mt-8", + "mr-8", + "mb-8", + "ml-8", + "m-9", + "mx-9", + "my-9", + "ms-9", + "me-9", + "mt-9", + "mr-9", + "mb-9", + "ml-9", + "m-10", + "mx-10", + "my-10", + "ms-10", + "me-10", + "mt-10", + "mr-10", + "mb-10", + "ml-10", + "m-11", + "mx-11", + "my-11", + "ms-11", + "me-11", + "mt-11", + "mr-11", + "mb-11", + "ml-11", + "m-12", + "mx-12", + "my-12", + "ms-12", + "me-12", + "mt-12", + "mr-12", + "mb-12", + "ml-12", + "m-14", + "mx-14", + "my-14", + "ms-14", + "me-14", + "mt-14", + "mr-14", + "mb-14", + "ml-14", + "m-16", + "mx-16", + "my-16", + "ms-16", + "me-16", + "mt-16", + "mr-16", + "mb-16", + "ml-16", + "m-20", + "mx-20", + "my-20", + "ms-20", + "me-20", + "mt-20", + "mr-20", + "mb-20", + "ml-20", + "m-24", + "mx-24", + "my-24", + "ms-24", + "me-24", + "mt-24", + "mr-24", + "mb-24", + "ml-24", + "m-28", + "mx-28", + "my-28", + "ms-28", + "me-28", + "mt-28", + "mr-28", + "mb-28", + "ml-28", + "m-32", + "mx-32", + "my-32", + "ms-32", + "me-32", + "mt-32", + "mr-32", + "mb-32", + "ml-32", + "m-36", + "mx-36", + "my-36", + "ms-36", + "me-36", + "mt-36", + "mr-36", + "mb-36", + "ml-36", + "m-40", + "mx-40", + "my-40", + "ms-40", + "me-40", + "mt-40", + "mr-40", + "mb-40", + "ml-40", + "m-44", + "mx-44", + "my-44", + "ms-44", + "me-44", + "mt-44", + "mr-44", + "mb-44", + "ml-44", + "m-48", + "mx-48", + "my-48", + "ms-48", + "me-48", + "mt-48", + "mr-48", + "mb-48", + "ml-48", + "m-52", + "mx-52", + "my-52", + "ms-52", + "me-52", + "mt-52", + "mr-52", + "mb-52", + "ml-52", + "m-56", + "mx-56", + "my-56", + "ms-56", + "me-56", + "mt-56", + "mr-56", + "mb-56", + "ml-56", + "m-60", + "mx-60", + "my-60", + "ms-60", + "me-60", + "mt-60", + "mr-60", + "mb-60", + "ml-60", + "m-64", + "mx-64", + "my-64", + "ms-64", + "me-64", + "mt-64", + "mr-64", + "mb-64", + "ml-64", + "m-72", + "mx-72", + "my-72", + "ms-72", + "me-72", + "mt-72", + "mr-72", + "mb-72", + "ml-72", + "m-80", + "mx-80", + "my-80", + "ms-80", + "me-80", + "mt-80", + "mr-80", + "mb-80", + "ml-80", + "m-96", + "mx-96", + "my-96", + "ms-96", + "me-96", + "mt-96", + "mr-96", + "mb-96", + "ml-96", + "m-auto", + "mx-auto", + "my-auto", + "ms-auto", + "me-auto", + "mt-auto", + "mr-auto", + "mb-auto", + "ml-auto", + "space-x-0", + "space-y-0", + "space-x-0.5", + "space-y-0.5", + "space-x-1", + "space-y-1", + "space-x-1.5", + "space-y-1.5", + "space-x-2", + "space-y-2", + "space-x-2.5", + "space-y-2.5", + "space-x-3", + "space-y-3", + "space-x-3.5", + "space-y-3.5", + "space-x-4", + "space-y-4", + "space-x-5", + "space-y-5", + "space-x-6", + "space-y-6", + "space-x-7", + "space-y-7", + "space-x-8", + "space-y-8", + "space-x-9", + "space-y-9", + "space-x-10", + "space-y-10", + "space-x-11", + "space-y-11", + "space-x-12", + "space-y-12", + "space-x-14", + "space-y-14", + "space-x-16", + "space-y-16", + "space-x-20", + "space-y-20", + "space-x-24", + "space-y-24", + "space-x-28", + "space-y-28", + "space-x-32", + "space-y-32", + "space-x-36", + "space-y-36", + "space-x-40", + "space-y-40", + "space-x-44", + "space-y-44", + "space-x-48", + "space-y-48", + "space-x-52", + "space-y-52", + "space-x-56", + "space-y-56", + "space-x-60", + "space-y-60", + "space-x-64", + "space-y-64", + "space-x-72", + "space-y-72", + "space-x-80", + "space-y-80", + "space-x-96", + "space-y-96", + "space-x-px", + "space-y-px", + "space-y-reverse", + "space-x-reverse", + "w-0", + "w-px", + "w-0.5", + "w-1", + "w-1.5", + "w-2", + "w-2.5", + "w-3", + "w-3.5", + "w-4", + "w-5", + "w-6", + "w-7", + "w-8", + "w-9", + "w-10", + "w-11", + "w-12", + "w-14", + "w-16", + "w-20", + "w-24", + "w-28", + "w-32", + "w-36", + "w-40", + "w-44", + "w-48", + "w-52", + "w-56", + "w-60", + "w-64", + "w-72", + "w-80", + "w-96", + "w-auto", + "w-1/2", + "w-1/3", + "w-2/3", + "w-1/4", + "w-2/4", + "w-3/4", + "w-1/5", + "w-2/5", + "w-3/5", + "w-4/5", + "w-1/6", + "w-2/6", + "w-3/6", + "w-4/6", + "w-5/6", + "w-1/12", + "w-2/12", + "w-3/12", + "w-4/12", + "w-5/12", + "w-6/12", + "w-7/12", + "w-8/12", + "w-9/12", + "w-10/12", + "w-11/12", + "w-full", + "w-screen", + "w-svw", + "w-lvw", + "w-dvw", + "w-min", + "w-max", + "w-fit", + "min-w-0", + "min-w-1", + "min-w-2", + "min-w-3", + "min-w-4", + "min-w-5", + "min-w-6", + "min-w-7", + "min-w-8", + "min-w-9", + "min-w-10", + "min-w-11", + "min-w-12", + "min-w-14", + "min-w-16", + "min-w-20", + "min-w-24", + "min-w-28", + "min-w-32", + "min-w-36", + "min-w-40", + "min-w-44", + "min-w-48", + "min-w-52", + "min-w-56", + "min-w-60", + "min-w-64", + "min-w-72", + "min-w-80", + "min-w-96", + "min-w-px", + "min-w-0.5", + "min-w-1.5", + "min-w-2.5", + "min-w-3.5", + "min-w-full", + "min-w-min", + "min-w-max", + "min-w-fit", + "max-w-0", + "max-w-px", + "max-w-0.5", + "max-w-1", + "max-w-1.5", + "max-w-2", + "max-w-2.5", + "max-w-3", + "max-w-3.5", + "max-w-4", + "max-w-5", + "max-w-6", + "max-w-7", + "max-w-8", + "max-w-9", + "max-w-10", + "max-w-11", + "max-w-12", + "max-w-14", + "max-w-16", + "max-w-20", + "max-w-24", + "max-w-28", + "max-w-32", + "max-w-36", + "max-w-40", + "max-w-44", + "max-w-48", + "max-w-52", + "max-w-56", + "max-w-60", + "max-w-64", + "max-w-72", + "max-w-80", + "max-w-96", + "max-w-none", + "max-w-xs", + "max-w-sm", + "max-w-md", + "max-w-lg", + "max-w-xl", + "max-w-2xl", + "max-w-3xl", + "max-w-4xl", + "max-w-5xl", + "max-w-6xl", + "max-w-7xl", + "max-w-full", + "max-w-min", + "max-w-max", + "max-w-fit", + "max-w-prose", + "max-w-screen-sm", + "max-w-screen-md", + "max-w-screen-lg", + "max-w-screen-xl", + "max-w-screen-2xl", + "h-0", + "h-px", + "h-0.5", + "h-1", + "h-1.5", + "h-2", + "h-2.5", + "h-3", + "h-3.5", + "h-4", + "h-5", + "h-6", + "h-7", + "h-8", + "h-9", + "h-10", + "h-11", + "h-12", + "h-14", + "h-16", + "h-20", + "h-24", + "h-28", + "h-32", + "h-36", + "h-40", + "h-44", + "h-48", + "h-52", + "h-56", + "h-60", + "h-64", + "h-72", + "h-80", + "h-96", + "h-auto", + "h-1/2", + "h-1/3", + "h-2/3", + "h-1/4", + "h-2/4", + "h-3/4", + "h-1/5", + "h-2/5", + "h-3/5", + "h-4/5", + "h-1/6", + "h-2/6", + "h-3/6", + "h-4/6", + "h-5/6", + "h-full", + "h-screen", + "h-svh", + "h-lvh", + "h-dvh", + "h-min", + "h-max", + "h-fit", + "min-h-0", + "min-h-1", + "min-h-2", + "min-h-3", + "min-h-4", + "min-h-5", + "min-h-6", + "min-h-7", + "min-h-8", + "min-h-9", + "min-h-10", + "min-h-11", + "min-h-12", + "min-h-14", + "min-h-16", + "min-h-20", + "min-h-24", + "min-h-28", + "min-h-32", + "min-h-36", + "min-h-40", + "min-h-44", + "min-h-48", + "min-h-52", + "min-h-56", + "min-h-60", + "min-h-64", + "min-h-72", + "min-h-80", + "min-h-96", + "min-h-px", + "min-h-0.5", + "min-h-1.5", + "min-h-2.5", + "min-h-3.5", + "min-h-full", + "min-h-screen", + "min-h-svh", + "min-h-lvh", + "min-h-dvh", + "min-h-min", + "min-h-max", + "min-h-fit", + "max-h-0", + "max-h-px", + "max-h-0.5", + "max-h-1", + "max-h-1.5", + "max-h-2", + "max-h-2.5", + "max-h-3", + "max-h-3.5", + "max-h-4", + "max-h-5", + "max-h-6", + "max-h-7", + "max-h-8", + "max-h-9", + "max-h-10", + "max-h-11", + "max-h-12", + "max-h-14", + "max-h-16", + "max-h-20", + "max-h-24", + "max-h-28", + "max-h-32", + "max-h-36", + "max-h-40", + "max-h-44", + "max-h-48", + "max-h-52", + "max-h-56", + "max-h-60", + "max-h-64", + "max-h-72", + "max-h-80", + "max-h-96", + "max-h-none", + "max-h-full", + "max-h-screen", + "max-h-svh", + "max-h-lvh", + "max-h-dvh", + "max-h-min", + "max-h-max", + "max-h-fit", + "size-0", + "size-px", + "size-0.5", + "size-1", + "size-1.5", + "size-2", + "size-2.5", + "size-3", + "size-3.5", + "size-4", + "size-5", + "size-6", + "size-7", + "size-8", + "size-9", + "size-10", + "size-11", + "size-12", + "size-14", + "size-16", + "size-20", + "size-24", + "size-28", + "size-32", + "size-36", + "size-40", + "size-44", + "size-48", + "size-52", + "size-56", + "size-60", + "size-64", + "size-72", + "size-80", + "size-96", + "size-auto", + "size-1/2", + "size-1/3", + "size-2/3", + "size-1/4", + "size-2/4", + "size-3/4", + "size-1/5", + "size-2/5", + "size-3/5", + "size-4/5", + "size-1/6", + "size-2/6", + "size-3/6", + "size-4/6", + "size-5/6", + "size-1/12", + "size-2/12", + "size-3/12", + "size-4/12", + "size-5/12", + "size-6/12", + "size-7/12", + "size-8/12", + "size-9/12", + "size-10/12", + "size-11/12", + "size-full", + "size-min", + "size-max", + "size-fit", + "font-sans", + "font-serif", + "font-mono", + "text-xs", + "text-sm", + "text-base", + "text-lg", + "text-xl", + "text-2xl", + "text-3xl", + "text-4xl", + "text-5xl", + "text-6xl", + "text-7xl", + "text-8xl", + "text-9xl", + "antialiased", + "subpixel-antialiased", + "italic", + "not-italic", + "font-thin", + "font-extralight", + "font-light", + "font-normal", + "font-medium", + "font-semibold", + "font-bold", + "font-extrabold", + "font-black", + "normal-nums", + "ordinal", + "slashed-zero", + "lining-nums", + "oldstyle-nums", + "proportional-nums", + "tabular-nums", + "diagonal-fractions", + "stacked-fractions", + "tracking-tighter", + "tracking-tight", + "tracking-normal", + "tracking-wide", + "tracking-wider", + "tracking-widest", + "line-clamp-1", + "line-clamp-2", + "line-clamp-3", + "line-clamp-4", + "line-clamp-5", + "line-clamp-6", + "line-clamp-none", + "leading-3", + "leading-4", + "leading-5", + "leading-6", + "leading-7", + "leading-8", + "leading-9", + "leading-10", + "leading-none", + "leading-tight", + "leading-snug", + "leading-normal", + "leading-relaxed", + "leading-loose", + "list-image-none", + "list-inside", + "list-outside", + "list-none", + "list-disc", + "list-decimal", + "text-left", + "text-center", + "text-right", + "text-justify", + "text-start", + "text-end", + "text-inherit", + "text-current", + "text-transparent", + "text-black", + "text-white", + "text-slate-50", + "text-slate-100", + "text-slate-200", + "text-slate-300", + "text-slate-400", + "text-slate-500", + "text-slate-600", + "text-slate-700", + "text-slate-800", + "text-slate-900", + "text-slate-950", + "text-gray-50", + "text-gray-100", + "text-gray-200", + "text-gray-300", + "text-gray-400", + "text-gray-500", + "text-gray-600", + "text-gray-700", + "text-gray-800", + "text-gray-900", + "text-gray-950", + "text-zinc-50", + "text-zinc-100", + "text-zinc-200", + "text-zinc-300", + "text-zinc-400", + "text-zinc-500", + "text-zinc-600", + "text-zinc-700", + "text-zinc-800", + "text-zinc-900", + "text-zinc-950", + "text-neutral-50", + "text-neutral-100", + "text-neutral-200", + "text-neutral-300", + "text-neutral-400", + "text-neutral-500", + "text-neutral-600", + "text-neutral-700", + "text-neutral-800", + "text-neutral-900", + "text-neutral-950", + "text-stone-50", + "text-stone-100", + "text-stone-200", + "text-stone-300", + "text-stone-400", + "text-stone-500", + "text-stone-600", + "text-stone-700", + "text-stone-800", + "text-stone-900", + "text-stone-950", + "text-red-50", + "text-red-100", + "text-red-200", + "text-red-300", + "text-red-400", + "text-red-500", + "text-red-600", + "text-red-700", + "text-red-800", + "text-red-900", + "text-red-950", + "text-orange-50", + "text-orange-100", + "text-orange-200", + "text-orange-300", + "text-orange-400", + "text-orange-500", + "text-orange-600", + "text-orange-700", + "text-orange-800", + "text-orange-900", + "text-orange-950", + "text-amber-50", + "text-amber-100", + "text-amber-200", + "text-amber-300", + "text-amber-400", + "text-amber-500", + "text-amber-600", + "text-amber-700", + "text-amber-800", + "text-amber-900", + "text-amber-950", + "text-yellow-50", + "text-yellow-100", + "text-yellow-200", + "text-yellow-300", + "text-yellow-400", + "text-yellow-500", + "text-yellow-600", + "text-yellow-700", + "text-yellow-800", + "text-yellow-900", + "text-yellow-950", + "text-lime-50", + "text-lime-100", + "text-lime-200", + "text-lime-300", + "text-lime-400", + "text-lime-500", + "text-lime-600", + "text-lime-700", + "text-lime-800", + "text-lime-900", + "text-lime-950", + "text-green-50", + "text-green-100", + "text-green-200", + "text-green-300", + "text-green-400", + "text-green-500", + "text-green-600", + "text-green-700", + "text-green-800", + "text-green-900", + "text-green-950", + "text-emerald-50", + "text-emerald-100", + "text-emerald-200", + "text-emerald-300", + "text-emerald-400", + "text-emerald-500", + "text-emerald-600", + "text-emerald-700", + "text-emerald-800", + "text-emerald-900", + "text-emerald-950", + "text-teal-50", + "text-teal-100", + "text-teal-200", + "text-teal-300", + "text-teal-400", + "text-teal-500", + "text-teal-600", + "text-teal-700", + "text-teal-800", + "text-teal-900", + "text-teal-950", + "text-cyan-50", + "text-cyan-100", + "text-cyan-200", + "text-cyan-300", + "text-cyan-400", + "text-cyan-500", + "text-cyan-600", + "text-cyan-700", + "text-cyan-800", + "text-cyan-900", + "text-cyan-950", + "text-sky-50", + "text-sky-100", + "text-sky-200", + "text-sky-300", + "text-sky-400", + "text-sky-500", + "text-sky-600", + "text-sky-700", + "text-sky-800", + "text-sky-900", + "text-sky-950", + "text-blue-50", + "text-blue-100", + "text-blue-200", + "text-blue-300", + "text-blue-400", + "text-blue-500", + "text-blue-600", + "text-blue-700", + "text-blue-800", + "text-blue-900", + "text-blue-950", + "text-indigo-50", + "text-indigo-100", + "text-indigo-200", + "text-indigo-300", + "text-indigo-400", + "text-indigo-500", + "text-indigo-600", + "text-indigo-700", + "text-indigo-800", + "text-indigo-900", + "text-indigo-950", + "text-violet-50", + "text-violet-100", + "text-violet-200", + "text-violet-300", + "text-violet-400", + "text-violet-500", + "text-violet-600", + "text-violet-700", + "text-violet-800", + "text-violet-900", + "text-violet-950", + "text-purple-50", + "text-purple-100", + "text-purple-200", + "text-purple-300", + "text-purple-400", + "text-purple-500", + "text-purple-600", + "text-purple-700", + "text-purple-800", + "text-purple-900", + "text-purple-950", + "text-fuchsia-50", + "text-fuchsia-100", + "text-fuchsia-200", + "text-fuchsia-300", + "text-fuchsia-400", + "text-fuchsia-500", + "text-fuchsia-600", + "text-fuchsia-700", + "text-fuchsia-800", + "text-fuchsia-900", + "text-fuchsia-950", + "text-pink-50", + "text-pink-100", + "text-pink-200", + "text-pink-300", + "text-pink-400", + "text-pink-500", + "text-pink-600", + "text-pink-700", + "text-pink-800", + "text-pink-900", + "text-pink-950", + "text-rose-50", + "text-rose-100", + "text-rose-200", + "text-rose-300", + "text-rose-400", + "text-rose-500", + "text-rose-600", + "text-rose-700", + "text-rose-800", + "text-rose-900", + "text-rose-950", + "underline", + "overline", + "line-through", + "no-underline", + "decoration-inherit", + "decoration-current", + "decoration-transparent", + "decoration-black", + "decoration-white", + "decoration-slate-50", + "decoration-slate-100", + "decoration-slate-200", + "decoration-slate-300", + "decoration-slate-400", + "decoration-slate-500", + "decoration-slate-600", + "decoration-slate-700", + "decoration-slate-800", + "decoration-slate-900", + "decoration-slate-950", + "decoration-gray-50", + "decoration-gray-100", + "decoration-gray-200", + "decoration-gray-300", + "decoration-gray-400", + "decoration-gray-500", + "decoration-gray-600", + "decoration-gray-700", + "decoration-gray-800", + "decoration-gray-900", + "decoration-gray-950", + "decoration-zinc-50", + "decoration-zinc-100", + "decoration-zinc-200", + "decoration-zinc-300", + "decoration-zinc-400", + "decoration-zinc-500", + "decoration-zinc-600", + "decoration-zinc-700", + "decoration-zinc-800", + "decoration-zinc-900", + "decoration-zinc-950", + "decoration-neutral-50", + "decoration-neutral-100", + "decoration-neutral-200", + "decoration-neutral-300", + "decoration-neutral-400", + "decoration-neutral-500", + "decoration-neutral-600", + "decoration-neutral-700", + "decoration-neutral-800", + "decoration-neutral-900", + "decoration-neutral-950", + "decoration-stone-50", + "decoration-stone-100", + "decoration-stone-200", + "decoration-stone-300", + "decoration-stone-400", + "decoration-stone-500", + "decoration-stone-600", + "decoration-stone-700", + "decoration-stone-800", + "decoration-stone-900", + "decoration-stone-950", + "decoration-red-50", + "decoration-red-100", + "decoration-red-200", + "decoration-red-300", + "decoration-red-400", + "decoration-red-500", + "decoration-red-600", + "decoration-red-700", + "decoration-red-800", + "decoration-red-900", + "decoration-red-950", + "decoration-orange-50", + "decoration-orange-100", + "decoration-orange-200", + "decoration-orange-300", + "decoration-orange-400", + "decoration-orange-500", + "decoration-orange-600", + "decoration-orange-700", + "decoration-orange-800", + "decoration-orange-900", + "decoration-orange-950", + "decoration-amber-50", + "decoration-amber-100", + "decoration-amber-200", + "decoration-amber-300", + "decoration-amber-400", + "decoration-amber-500", + "decoration-amber-600", + "decoration-amber-700", + "decoration-amber-800", + "decoration-amber-900", + "decoration-amber-950", + "decoration-yellow-50", + "decoration-yellow-100", + "decoration-yellow-200", + "decoration-yellow-300", + "decoration-yellow-400", + "decoration-yellow-500", + "decoration-yellow-600", + "decoration-yellow-700", + "decoration-yellow-800", + "decoration-yellow-900", + "decoration-yellow-950", + "decoration-lime-50", + "decoration-lime-100", + "decoration-lime-200", + "decoration-lime-300", + "decoration-lime-400", + "decoration-lime-500", + "decoration-lime-600", + "decoration-lime-700", + "decoration-lime-800", + "decoration-lime-900", + "decoration-lime-950", + "decoration-green-50", + "decoration-green-100", + "decoration-green-200", + "decoration-green-300", + "decoration-green-400", + "decoration-green-500", + "decoration-green-600", + "decoration-green-700", + "decoration-green-800", + "decoration-green-900", + "decoration-green-950", + "decoration-emerald-50", + "decoration-emerald-100", + "decoration-emerald-200", + "decoration-emerald-300", + "decoration-emerald-400", + "decoration-emerald-500", + "decoration-emerald-600", + "decoration-emerald-700", + "decoration-emerald-800", + "decoration-emerald-900", + "decoration-emerald-950", + "decoration-teal-50", + "decoration-teal-100", + "decoration-teal-200", + "decoration-teal-300", + "decoration-teal-400", + "decoration-teal-500", + "decoration-teal-600", + "decoration-teal-700", + "decoration-teal-800", + "decoration-teal-900", + "decoration-teal-950", + "decoration-cyan-50", + "decoration-cyan-100", + "decoration-cyan-200", + "decoration-cyan-300", + "decoration-cyan-400", + "decoration-cyan-500", + "decoration-cyan-600", + "decoration-cyan-700", + "decoration-cyan-800", + "decoration-cyan-900", + "decoration-cyan-950", + "decoration-sky-50", + "decoration-sky-100", + "decoration-sky-200", + "decoration-sky-300", + "decoration-sky-400", + "decoration-sky-500", + "decoration-sky-600", + "decoration-sky-700", + "decoration-sky-800", + "decoration-sky-900", + "decoration-sky-950", + "decoration-blue-50", + "decoration-blue-100", + "decoration-blue-200", + "decoration-blue-300", + "decoration-blue-400", + "decoration-blue-500", + "decoration-blue-600", + "decoration-blue-700", + "decoration-blue-800", + "decoration-blue-900", + "decoration-blue-950", + "decoration-indigo-50", + "decoration-indigo-100", + "decoration-indigo-200", + "decoration-indigo-300", + "decoration-indigo-400", + "decoration-indigo-500", + "decoration-indigo-600", + "decoration-indigo-700", + "decoration-indigo-800", + "decoration-indigo-900", + "decoration-indigo-950", + "decoration-violet-50", + "decoration-violet-100", + "decoration-violet-200", + "decoration-violet-300", + "decoration-violet-400", + "decoration-violet-500", + "decoration-violet-600", + "decoration-violet-700", + "decoration-violet-800", + "decoration-violet-900", + "decoration-violet-950", + "decoration-purple-50", + "decoration-purple-100", + "decoration-purple-200", + "decoration-purple-300", + "decoration-purple-400", + "decoration-purple-500", + "decoration-purple-600", + "decoration-purple-700", + "decoration-purple-800", + "decoration-purple-900", + "decoration-purple-950", + "decoration-fuchsia-50", + "decoration-fuchsia-100", + "decoration-fuchsia-200", + "decoration-fuchsia-300", + "decoration-fuchsia-400", + "decoration-fuchsia-500", + "decoration-fuchsia-600", + "decoration-fuchsia-700", + "decoration-fuchsia-800", + "decoration-fuchsia-900", + "decoration-fuchsia-950", + "decoration-pink-50", + "decoration-pink-100", + "decoration-pink-200", + "decoration-pink-300", + "decoration-pink-400", + "decoration-pink-500", + "decoration-pink-600", + "decoration-pink-700", + "decoration-pink-800", + "decoration-pink-900", + "decoration-pink-950", + "decoration-rose-50", + "decoration-rose-100", + "decoration-rose-200", + "decoration-rose-300", + "decoration-rose-400", + "decoration-rose-500", + "decoration-rose-600", + "decoration-rose-700", + "decoration-rose-800", + "decoration-rose-900", + "decoration-rose-950", + "decoration-solid", + "decoration-double", + "decoration-dotted", + "decoration-dashed", + "decoration-wavy", + "decoration-auto", + "decoration-from-font", + "decoration-0", + "decoration-1", + "decoration-2", + "decoration-4", + "decoration-8", + "underline-offset-auto", + "underline-offset-0", + "underline-offset-1", + "underline-offset-2", + "underline-offset-4", + "underline-offset-8", + "uppercase", + "lowercase", + "capitalize", + "normal-case", + "truncate", + "text-ellipsis", + "text-clip", + "text-wrap", + "text-nowrap", + "text-balance", + "text-pretty", + "indent-0", + "indent-px", + "indent-0.5", + "indent-1", + "indent-1.5", + "indent-2", + "indent-2.5", + "indent-3", + "indent-3.5", + "indent-4", + "indent-5", + "indent-6", + "indent-7", + "indent-8", + "indent-9", + "indent-10", + "indent-11", + "indent-12", + "indent-14", + "indent-16", + "indent-20", + "indent-24", + "indent-28", + "indent-32", + "indent-36", + "indent-40", + "indent-44", + "indent-48", + "indent-52", + "indent-56", + "indent-60", + "indent-64", + "indent-72", + "indent-80", + "indent-96", + "align-baseline", + "align-top", + "align-middle", + "align-bottom", + "align-text-top", + "align-text-bottom", + "align-sub", + "align-super", + "whitespace-normal", + "whitespace-nowrap", + "whitespace-pre", + "whitespace-pre-line", + "whitespace-pre-wrap", + "whitespace-break-spaces", + "break-normal", + "break-words", + "break-all", + "break-keep", + "hyphens-none", + "hyphens-manual", + "hyphens-auto", + "content-none", + "bg-fixed", + "bg-local", + "bg-scroll", + "bg-clip-border", + "bg-clip-padding", + "bg-clip-content", + "bg-clip-text", + "bg-inherit", + "bg-current", + "bg-transparent", + "bg-black", + "bg-white", + "bg-slate-50", + "bg-slate-100", + "bg-slate-200", + "bg-slate-300", + "bg-slate-400", + "bg-slate-500", + "bg-slate-600", + "bg-slate-700", + "bg-slate-800", + "bg-slate-900", + "bg-slate-950", + "bg-gray-50", + "bg-gray-100", + "bg-gray-200", + "bg-gray-300", + "bg-gray-400", + "bg-gray-500", + "bg-gray-600", + "bg-gray-700", + "bg-gray-800", + "bg-gray-900", + "bg-gray-950", + "bg-zinc-50", + "bg-zinc-100", + "bg-zinc-200", + "bg-zinc-300", + "bg-zinc-400", + "bg-zinc-500", + "bg-zinc-600", + "bg-zinc-700", + "bg-zinc-800", + "bg-zinc-900", + "bg-zinc-950", + "bg-neutral-50", + "bg-neutral-100", + "bg-neutral-200", + "bg-neutral-300", + "bg-neutral-400", + "bg-neutral-500", + "bg-neutral-600", + "bg-neutral-700", + "bg-neutral-800", + "bg-neutral-900", + "bg-neutral-950", + "bg-stone-50", + "bg-stone-100", + "bg-stone-200", + "bg-stone-300", + "bg-stone-400", + "bg-stone-500", + "bg-stone-600", + "bg-stone-700", + "bg-stone-800", + "bg-stone-900", + "bg-stone-950", + "bg-red-50", + "bg-red-100", + "bg-red-200", + "bg-red-300", + "bg-red-400", + "bg-red-500", + "bg-red-600", + "bg-red-700", + "bg-red-800", + "bg-red-900", + "bg-red-950", + "bg-orange-50", + "bg-orange-100", + "bg-orange-200", + "bg-orange-300", + "bg-orange-400", + "bg-orange-500", + "bg-orange-600", + "bg-orange-700", + "bg-orange-800", + "bg-orange-900", + "bg-orange-950", + "bg-amber-50", + "bg-amber-100", + "bg-amber-200", + "bg-amber-300", + "bg-amber-400", + "bg-amber-500", + "bg-amber-600", + "bg-amber-700", + "bg-amber-800", + "bg-amber-900", + "bg-amber-950", + "bg-yellow-50", + "bg-yellow-100", + "bg-yellow-200", + "bg-yellow-300", + "bg-yellow-400", + "bg-yellow-500", + "bg-yellow-600", + "bg-yellow-700", + "bg-yellow-800", + "bg-yellow-900", + "bg-yellow-950", + "bg-lime-50", + "bg-lime-100", + "bg-lime-200", + "bg-lime-300", + "bg-lime-400", + "bg-lime-500", + "bg-lime-600", + "bg-lime-700", + "bg-lime-800", + "bg-lime-900", + "bg-lime-950", + "bg-green-50", + "bg-green-100", + "bg-green-200", + "bg-green-300", + "bg-green-400", + "bg-green-500", + "bg-green-600", + "bg-green-700", + "bg-green-800", + "bg-green-900", + "bg-green-950", + "bg-emerald-50", + "bg-emerald-100", + "bg-emerald-200", + "bg-emerald-300", + "bg-emerald-400", + "bg-emerald-500", + "bg-emerald-600", + "bg-emerald-700", + "bg-emerald-800", + "bg-emerald-900", + "bg-emerald-950", + "bg-teal-50", + "bg-teal-100", + "bg-teal-200", + "bg-teal-300", + "bg-teal-400", + "bg-teal-500", + "bg-teal-600", + "bg-teal-700", + "bg-teal-800", + "bg-teal-900", + "bg-teal-950", + "bg-cyan-50", + "bg-cyan-100", + "bg-cyan-200", + "bg-cyan-300", + "bg-cyan-400", + "bg-cyan-500", + "bg-cyan-600", + "bg-cyan-700", + "bg-cyan-800", + "bg-cyan-900", + "bg-cyan-950", + "bg-sky-50", + "bg-sky-100", + "bg-sky-200", + "bg-sky-300", + "bg-sky-400", + "bg-sky-500", + "bg-sky-600", + "bg-sky-700", + "bg-sky-800", + "bg-sky-900", + "bg-sky-950", + "bg-blue-50", + "bg-blue-100", + "bg-blue-200", + "bg-blue-300", + "bg-blue-400", + "bg-blue-500", + "bg-blue-600", + "bg-blue-700", + "bg-blue-800", + "bg-blue-900", + "bg-blue-950", + "bg-indigo-50", + "bg-indigo-100", + "bg-indigo-200", + "bg-indigo-300", + "bg-indigo-400", + "bg-indigo-500", + "bg-indigo-600", + "bg-indigo-700", + "bg-indigo-800", + "bg-indigo-900", + "bg-indigo-950", + "bg-violet-50", + "bg-violet-100", + "bg-violet-200", + "bg-violet-300", + "bg-violet-400", + "bg-violet-500", + "bg-violet-600", + "bg-violet-700", + "bg-violet-800", + "bg-violet-900", + "bg-violet-950", + "bg-purple-50", + "bg-purple-100", + "bg-purple-200", + "bg-purple-300", + "bg-purple-400", + "bg-purple-500", + "bg-purple-600", + "bg-purple-700", + "bg-purple-800", + "bg-purple-900", + "bg-purple-950", + "bg-fuchsia-50", + "bg-fuchsia-100", + "bg-fuchsia-200", + "bg-fuchsia-300", + "bg-fuchsia-400", + "bg-fuchsia-500", + "bg-fuchsia-600", + "bg-fuchsia-700", + "bg-fuchsia-800", + "bg-fuchsia-900", + "bg-fuchsia-950", + "bg-pink-50", + "bg-pink-100", + "bg-pink-200", + "bg-pink-300", + "bg-pink-400", + "bg-pink-500", + "bg-pink-600", + "bg-pink-700", + "bg-pink-800", + "bg-pink-900", + "bg-pink-950", + "bg-rose-50", + "bg-rose-100", + "bg-rose-200", + "bg-rose-300", + "bg-rose-400", + "bg-rose-500", + "bg-rose-600", + "bg-rose-700", + "bg-rose-800", + "bg-rose-900", + "bg-rose-950", + "bg-origin-border", + "bg-origin-padding", + "bg-origin-content", + "bg-bottom", + "bg-center", + "bg-left", + "bg-left-bottom", + "bg-left-top", + "bg-right", + "bg-right-bottom", + "bg-right-top", + "bg-top", + "bg-repeat", + "bg-no-repeat", + "bg-repeat-x", + "bg-repeat-y", + "bg-repeat-round", + "bg-repeat-space", + "bg-auto", + "bg-cover", + "bg-contain", + "bg-none", + "bg-gradient-to-t", + "bg-gradient-to-tr", + "bg-gradient-to-r", + "bg-gradient-to-br", + "bg-gradient-to-b", + "bg-gradient-to-bl", + "bg-gradient-to-l", + "bg-gradient-to-tl", + "from-inherit", + "from-current", + "from-transparent", + "from-black", + "from-white", + "from-slate-50", + "from-slate-100", + "from-slate-200", + "from-slate-300", + "from-slate-400", + "from-slate-500", + "from-slate-600", + "from-slate-700", + "from-slate-800", + "from-slate-900", + "from-slate-950", + "from-gray-50", + "from-gray-100", + "from-gray-200", + "from-gray-300", + "from-gray-400", + "from-gray-500", + "from-gray-600", + "from-gray-700", + "from-gray-800", + "from-gray-900", + "from-gray-950", + "from-zinc-50", + "from-zinc-100", + "from-zinc-200", + "from-zinc-300", + "from-zinc-400", + "from-zinc-500", + "from-zinc-600", + "from-zinc-700", + "from-zinc-800", + "from-zinc-900", + "from-zinc-950", + "from-neutral-50", + "from-neutral-100", + "from-neutral-200", + "from-neutral-300", + "from-neutral-400", + "from-neutral-500", + "from-neutral-600", + "from-neutral-700", + "from-neutral-800", + "from-neutral-900", + "from-neutral-950", + "from-stone-50", + "from-stone-100", + "from-stone-200", + "from-stone-300", + "from-stone-400", + "from-stone-500", + "from-stone-600", + "from-stone-700", + "from-stone-800", + "from-stone-900", + "from-stone-950", + "from-red-50", + "from-red-100", + "from-red-200", + "from-red-300", + "from-red-400", + "from-red-500", + "from-red-600", + "from-red-700", + "from-red-800", + "from-red-900", + "from-red-950", + "from-orange-50", + "from-orange-100", + "from-orange-200", + "from-orange-300", + "from-orange-400", + "from-orange-500", + "from-orange-600", + "from-orange-700", + "from-orange-800", + "from-orange-900", + "from-orange-950", + "from-amber-50", + "from-amber-100", + "from-amber-200", + "from-amber-300", + "from-amber-400", + "from-amber-500", + "from-amber-600", + "from-amber-700", + "from-amber-800", + "from-amber-900", + "from-amber-950", + "from-yellow-50", + "from-yellow-100", + "from-yellow-200", + "from-yellow-300", + "from-yellow-400", + "from-yellow-500", + "from-yellow-600", + "from-yellow-700", + "from-yellow-800", + "from-yellow-900", + "from-yellow-950", + "from-lime-50", + "from-lime-100", + "from-lime-200", + "from-lime-300", + "from-lime-400", + "from-lime-500", + "from-lime-600", + "from-lime-700", + "from-lime-800", + "from-lime-900", + "from-lime-950", + "from-green-50", + "from-green-100", + "from-green-200", + "from-green-300", + "from-green-400", + "from-green-500", + "from-green-600", + "from-green-700", + "from-green-800", + "from-green-900", + "from-green-950", + "from-emerald-50", + "from-emerald-100", + "from-emerald-200", + "from-emerald-300", + "from-emerald-400", + "from-emerald-500", + "from-emerald-600", + "from-emerald-700", + "from-emerald-800", + "from-emerald-900", + "from-emerald-950", + "from-teal-50", + "from-teal-100", + "from-teal-200", + "from-teal-300", + "from-teal-400", + "from-teal-500", + "from-teal-600", + "from-teal-700", + "from-teal-800", + "from-teal-900", + "from-teal-950", + "from-cyan-50", + "from-cyan-100", + "from-cyan-200", + "from-cyan-300", + "from-cyan-400", + "from-cyan-500", + "from-cyan-600", + "from-cyan-700", + "from-cyan-800", + "from-cyan-900", + "from-cyan-950", + "from-sky-50", + "from-sky-100", + "from-sky-200", + "from-sky-300", + "from-sky-400", + "from-sky-500", + "from-sky-600", + "from-sky-700", + "from-sky-800", + "from-sky-900", + "from-sky-950", + "from-blue-50", + "from-blue-100", + "from-blue-200", + "from-blue-300", + "from-blue-400", + "from-blue-500", + "from-blue-600", + "from-blue-700", + "from-blue-800", + "from-blue-900", + "from-blue-950", + "from-indigo-50", + "from-indigo-100", + "from-indigo-200", + "from-indigo-300", + "from-indigo-400", + "from-indigo-500", + "from-indigo-600", + "from-indigo-700", + "from-indigo-800", + "from-indigo-900", + "from-indigo-950", + "from-violet-50", + "from-violet-100", + "from-violet-200", + "from-violet-300", + "from-violet-400", + "from-violet-500", + "from-violet-600", + "from-violet-700", + "from-violet-800", + "from-violet-900", + "from-violet-950", + "from-purple-50", + "from-purple-100", + "from-purple-200", + "from-purple-300", + "from-purple-400", + "from-purple-500", + "from-purple-600", + "from-purple-700", + "from-purple-800", + "from-purple-900", + "from-purple-950", + "from-fuchsia-50", + "from-fuchsia-100", + "from-fuchsia-200", + "from-fuchsia-300", + "from-fuchsia-400", + "from-fuchsia-500", + "from-fuchsia-600", + "from-fuchsia-700", + "from-fuchsia-800", + "from-fuchsia-900", + "from-fuchsia-950", + "from-pink-50", + "from-pink-100", + "from-pink-200", + "from-pink-300", + "from-pink-400", + "from-pink-500", + "from-pink-600", + "from-pink-700", + "from-pink-800", + "from-pink-900", + "from-pink-950", + "from-rose-50", + "from-rose-100", + "from-rose-200", + "from-rose-300", + "from-rose-400", + "from-rose-500", + "from-rose-600", + "from-rose-700", + "from-rose-800", + "from-rose-900", + "from-rose-950", + "from-0%", + "from-5%", + "from-10%", + "from-15%", + "from-20%", + "from-25%", + "from-30%", + "from-35%", + "from-40%", + "from-45%", + "from-50%", + "from-55%", + "from-60%", + "from-65%", + "from-70%", + "from-75%", + "from-80%", + "from-85%", + "from-90%", + "from-95%", + "from-100%", + "via-inherit", + "via-current", + "via-transparent", + "via-black", + "via-white", + "via-slate-50", + "via-slate-100", + "via-slate-200", + "via-slate-300", + "via-slate-400", + "via-slate-500", + "via-slate-600", + "via-slate-700", + "via-slate-800", + "via-slate-900", + "via-slate-950", + "via-gray-50", + "via-gray-100", + "via-gray-200", + "via-gray-300", + "via-gray-400", + "via-gray-500", + "via-gray-600", + "via-gray-700", + "via-gray-800", + "via-gray-900", + "via-gray-950", + "via-zinc-50", + "via-zinc-100", + "via-zinc-200", + "via-zinc-300", + "via-zinc-400", + "via-zinc-500", + "via-zinc-600", + "via-zinc-700", + "via-zinc-800", + "via-zinc-900", + "via-zinc-950", + "via-neutral-50", + "via-neutral-100", + "via-neutral-200", + "via-neutral-300", + "via-neutral-400", + "via-neutral-500", + "via-neutral-600", + "via-neutral-700", + "via-neutral-800", + "via-neutral-900", + "via-neutral-950", + "via-stone-50", + "via-stone-100", + "via-stone-200", + "via-stone-300", + "via-stone-400", + "via-stone-500", + "via-stone-600", + "via-stone-700", + "via-stone-800", + "via-stone-900", + "via-stone-950", + "via-red-50", + "via-red-100", + "via-red-200", + "via-red-300", + "via-red-400", + "via-red-500", + "via-red-600", + "via-red-700", + "via-red-800", + "via-red-900", + "via-red-950", + "via-orange-50", + "via-orange-100", + "via-orange-200", + "via-orange-300", + "via-orange-400", + "via-orange-500", + "via-orange-600", + "via-orange-700", + "via-orange-800", + "via-orange-900", + "via-orange-950", + "via-amber-50", + "via-amber-100", + "via-amber-200", + "via-amber-300", + "via-amber-400", + "via-amber-500", + "via-amber-600", + "via-amber-700", + "via-amber-800", + "via-amber-900", + "via-amber-950", + "via-yellow-50", + "via-yellow-100", + "via-yellow-200", + "via-yellow-300", + "via-yellow-400", + "via-yellow-500", + "via-yellow-600", + "via-yellow-700", + "via-yellow-800", + "via-yellow-900", + "via-yellow-950", + "via-lime-50", + "via-lime-100", + "via-lime-200", + "via-lime-300", + "via-lime-400", + "via-lime-500", + "via-lime-600", + "via-lime-700", + "via-lime-800", + "via-lime-900", + "via-lime-950", + "via-green-50", + "via-green-100", + "via-green-200", + "via-green-300", + "via-green-400", + "via-green-500", + "via-green-600", + "via-green-700", + "via-green-800", + "via-green-900", + "via-green-950", + "via-emerald-50", + "via-emerald-100", + "via-emerald-200", + "via-emerald-300", + "via-emerald-400", + "via-emerald-500", + "via-emerald-600", + "via-emerald-700", + "via-emerald-800", + "via-emerald-900", + "via-emerald-950", + "via-teal-50", + "via-teal-100", + "via-teal-200", + "via-teal-300", + "via-teal-400", + "via-teal-500", + "via-teal-600", + "via-teal-700", + "via-teal-800", + "via-teal-900", + "via-teal-950", + "via-cyan-50", + "via-cyan-100", + "via-cyan-200", + "via-cyan-300", + "via-cyan-400", + "via-cyan-500", + "via-cyan-600", + "via-cyan-700", + "via-cyan-800", + "via-cyan-900", + "via-cyan-950", + "via-sky-50", + "via-sky-100", + "via-sky-200", + "via-sky-300", + "via-sky-400", + "via-sky-500", + "via-sky-600", + "via-sky-700", + "via-sky-800", + "via-sky-900", + "via-sky-950", + "via-blue-50", + "via-blue-100", + "via-blue-200", + "via-blue-300", + "via-blue-400", + "via-blue-500", + "via-blue-600", + "via-blue-700", + "via-blue-800", + "via-blue-900", + "via-blue-950", + "via-indigo-50", + "via-indigo-100", + "via-indigo-200", + "via-indigo-300", + "via-indigo-400", + "via-indigo-500", + "via-indigo-600", + "via-indigo-700", + "via-indigo-800", + "via-indigo-900", + "via-indigo-950", + "via-violet-50", + "via-violet-100", + "via-violet-200", + "via-violet-300", + "via-violet-400", + "via-violet-500", + "via-violet-600", + "via-violet-700", + "via-violet-800", + "via-violet-900", + "via-violet-950", + "via-purple-50", + "via-purple-100", + "via-purple-200", + "via-purple-300", + "via-purple-400", + "via-purple-500", + "via-purple-600", + "via-purple-700", + "via-purple-800", + "via-purple-900", + "via-purple-950", + "via-fuchsia-50", + "via-fuchsia-100", + "via-fuchsia-200", + "via-fuchsia-300", + "via-fuchsia-400", + "via-fuchsia-500", + "via-fuchsia-600", + "via-fuchsia-700", + "via-fuchsia-800", + "via-fuchsia-900", + "via-fuchsia-950", + "via-pink-50", + "via-pink-100", + "via-pink-200", + "via-pink-300", + "via-pink-400", + "via-pink-500", + "via-pink-600", + "via-pink-700", + "via-pink-800", + "via-pink-900", + "via-pink-950", + "via-rose-50", + "via-rose-100", + "via-rose-200", + "via-rose-300", + "via-rose-400", + "via-rose-500", + "via-rose-600", + "via-rose-700", + "via-rose-800", + "via-rose-900", + "via-rose-950", + "via-0%", + "via-5%", + "via-10%", + "via-15%", + "via-20%", + "via-25%", + "via-30%", + "via-35%", + "via-40%", + "via-45%", + "via-50%", + "via-55%", + "via-60%", + "via-65%", + "via-70%", + "via-75%", + "via-80%", + "via-85%", + "via-90%", + "via-95%", + "via-100%", + "to-inherit", + "to-current", + "to-transparent", + "to-black", + "to-white", + "to-slate-50", + "to-slate-100", + "to-slate-200", + "to-slate-300", + "to-slate-400", + "to-slate-500", + "to-slate-600", + "to-slate-700", + "to-slate-800", + "to-slate-900", + "to-slate-950", + "to-gray-50", + "to-gray-100", + "to-gray-200", + "to-gray-300", + "to-gray-400", + "to-gray-500", + "to-gray-600", + "to-gray-700", + "to-gray-800", + "to-gray-900", + "to-gray-950", + "to-zinc-50", + "to-zinc-100", + "to-zinc-200", + "to-zinc-300", + "to-zinc-400", + "to-zinc-500", + "to-zinc-600", + "to-zinc-700", + "to-zinc-800", + "to-zinc-900", + "to-zinc-950", + "to-neutral-50", + "to-neutral-100", + "to-neutral-200", + "to-neutral-300", + "to-neutral-400", + "to-neutral-500", + "to-neutral-600", + "to-neutral-700", + "to-neutral-800", + "to-neutral-900", + "to-neutral-950", + "to-stone-50", + "to-stone-100", + "to-stone-200", + "to-stone-300", + "to-stone-400", + "to-stone-500", + "to-stone-600", + "to-stone-700", + "to-stone-800", + "to-stone-900", + "to-stone-950", + "to-red-50", + "to-red-100", + "to-red-200", + "to-red-300", + "to-red-400", + "to-red-500", + "to-red-600", + "to-red-700", + "to-red-800", + "to-red-900", + "to-red-950", + "to-orange-50", + "to-orange-100", + "to-orange-200", + "to-orange-300", + "to-orange-400", + "to-orange-500", + "to-orange-600", + "to-orange-700", + "to-orange-800", + "to-orange-900", + "to-orange-950", + "to-amber-50", + "to-amber-100", + "to-amber-200", + "to-amber-300", + "to-amber-400", + "to-amber-500", + "to-amber-600", + "to-amber-700", + "to-amber-800", + "to-amber-900", + "to-amber-950", + "to-yellow-50", + "to-yellow-100", + "to-yellow-200", + "to-yellow-300", + "to-yellow-400", + "to-yellow-500", + "to-yellow-600", + "to-yellow-700", + "to-yellow-800", + "to-yellow-900", + "to-yellow-950", + "to-lime-50", + "to-lime-100", + "to-lime-200", + "to-lime-300", + "to-lime-400", + "to-lime-500", + "to-lime-600", + "to-lime-700", + "to-lime-800", + "to-lime-900", + "to-lime-950", + "to-green-50", + "to-green-100", + "to-green-200", + "to-green-300", + "to-green-400", + "to-green-500", + "to-green-600", + "to-green-700", + "to-green-800", + "to-green-900", + "to-green-950", + "to-emerald-50", + "to-emerald-100", + "to-emerald-200", + "to-emerald-300", + "to-emerald-400", + "to-emerald-500", + "to-emerald-600", + "to-emerald-700", + "to-emerald-800", + "to-emerald-900", + "to-emerald-950", + "to-teal-50", + "to-teal-100", + "to-teal-200", + "to-teal-300", + "to-teal-400", + "to-teal-500", + "to-teal-600", + "to-teal-700", + "to-teal-800", + "to-teal-900", + "to-teal-950", + "to-cyan-50", + "to-cyan-100", + "to-cyan-200", + "to-cyan-300", + "to-cyan-400", + "to-cyan-500", + "to-cyan-600", + "to-cyan-700", + "to-cyan-800", + "to-cyan-900", + "to-cyan-950", + "to-sky-50", + "to-sky-100", + "to-sky-200", + "to-sky-300", + "to-sky-400", + "to-sky-500", + "to-sky-600", + "to-sky-700", + "to-sky-800", + "to-sky-900", + "to-sky-950", + "to-blue-50", + "to-blue-100", + "to-blue-200", + "to-blue-300", + "to-blue-400", + "to-blue-500", + "to-blue-600", + "to-blue-700", + "to-blue-800", + "to-blue-900", + "to-blue-950", + "to-indigo-50", + "to-indigo-100", + "to-indigo-200", + "to-indigo-300", + "to-indigo-400", + "to-indigo-500", + "to-indigo-600", + "to-indigo-700", + "to-indigo-800", + "to-indigo-900", + "to-indigo-950", + "to-violet-50", + "to-violet-100", + "to-violet-200", + "to-violet-300", + "to-violet-400", + "to-violet-500", + "to-violet-600", + "to-violet-700", + "to-violet-800", + "to-violet-900", + "to-violet-950", + "to-purple-50", + "to-purple-100", + "to-purple-200", + "to-purple-300", + "to-purple-400", + "to-purple-500", + "to-purple-600", + "to-purple-700", + "to-purple-800", + "to-purple-900", + "to-purple-950", + "to-fuchsia-50", + "to-fuchsia-100", + "to-fuchsia-200", + "to-fuchsia-300", + "to-fuchsia-400", + "to-fuchsia-500", + "to-fuchsia-600", + "to-fuchsia-700", + "to-fuchsia-800", + "to-fuchsia-900", + "to-fuchsia-950", + "to-pink-50", + "to-pink-100", + "to-pink-200", + "to-pink-300", + "to-pink-400", + "to-pink-500", + "to-pink-600", + "to-pink-700", + "to-pink-800", + "to-pink-900", + "to-pink-950", + "to-rose-50", + "to-rose-100", + "to-rose-200", + "to-rose-300", + "to-rose-400", + "to-rose-500", + "to-rose-600", + "to-rose-700", + "to-rose-800", + "to-rose-900", + "to-rose-950", + "to-0%", + "to-5%", + "to-10%", + "to-15%", + "to-20%", + "to-25%", + "to-30%", + "to-35%", + "to-40%", + "to-45%", + "to-50%", + "to-55%", + "to-60%", + "to-65%", + "to-70%", + "to-75%", + "to-80%", + "to-85%", + "to-90%", + "to-95%", + "to-100%", + "rounded-none", + "rounded-sm", + "rounded", + "rounded-md", + "rounded-lg", + "rounded-xl", + "rounded-2xl", + "rounded-3xl", + "rounded-full", + "rounded-s-none", + "rounded-s-sm", + "rounded-s", + "rounded-s-md", + "rounded-s-lg", + "rounded-s-xl", + "rounded-s-2xl", + "rounded-s-3xl", + "rounded-s-full", + "rounded-e-none", + "rounded-e-sm", + "rounded-e", + "rounded-e-md", + "rounded-e-lg", + "rounded-e-xl", + "rounded-e-2xl", + "rounded-e-3xl", + "rounded-e-full", + "rounded-t-none", + "rounded-t-sm", + "rounded-t", + "rounded-t-md", + "rounded-t-lg", + "rounded-t-xl", + "rounded-t-2xl", + "rounded-t-3xl", + "rounded-t-full", + "rounded-r-none", + "rounded-r-sm", + "rounded-r", + "rounded-r-md", + "rounded-r-lg", + "rounded-r-xl", + "rounded-r-2xl", + "rounded-r-3xl", + "rounded-r-full", + "rounded-b-none", + "rounded-b-sm", + "rounded-b", + "rounded-b-md", + "rounded-b-lg", + "rounded-b-xl", + "rounded-b-2xl", + "rounded-b-3xl", + "rounded-b-full", + "rounded-l-none", + "rounded-l-sm", + "rounded-l", + "rounded-l-md", + "rounded-l-lg", + "rounded-l-xl", + "rounded-l-2xl", + "rounded-l-3xl", + "rounded-l-full", + "rounded-ss-none", + "rounded-ss-sm", + "rounded-ss", + "rounded-ss-md", + "rounded-ss-lg", + "rounded-ss-xl", + "rounded-ss-2xl", + "rounded-ss-3xl", + "rounded-ss-full", + "rounded-se-none", + "rounded-se-sm", + "rounded-se", + "rounded-se-md", + "rounded-se-lg", + "rounded-se-xl", + "rounded-se-2xl", + "rounded-se-3xl", + "rounded-se-full", + "rounded-ee-none", + "rounded-ee-sm", + "rounded-ee", + "rounded-ee-md", + "rounded-ee-lg", + "rounded-ee-xl", + "rounded-ee-2xl", + "rounded-ee-3xl", + "rounded-ee-full", + "rounded-es-none", + "rounded-es-sm", + "rounded-es", + "rounded-es-md", + "rounded-es-lg", + "rounded-es-xl", + "rounded-es-2xl", + "rounded-es-3xl", + "rounded-es-full", + "rounded-tl-none", + "rounded-tl-sm", + "rounded-tl", + "rounded-tl-md", + "rounded-tl-lg", + "rounded-tl-xl", + "rounded-tl-2xl", + "rounded-tl-3xl", + "rounded-tl-full", + "rounded-tr-none", + "rounded-tr-sm", + "rounded-tr", + "rounded-tr-md", + "rounded-tr-lg", + "rounded-tr-xl", + "rounded-tr-2xl", + "rounded-tr-3xl", + "rounded-tr-full", + "rounded-br-none", + "rounded-br-sm", + "rounded-br", + "rounded-br-md", + "rounded-br-lg", + "rounded-br-xl", + "rounded-br-2xl", + "rounded-br-3xl", + "rounded-br-full", + "rounded-bl-none", + "rounded-bl-sm", + "rounded-bl", + "rounded-bl-md", + "rounded-bl-lg", + "rounded-bl-xl", + "rounded-bl-2xl", + "rounded-bl-3xl", + "rounded-bl-full", + "rounded-s-*", + "rounded-e-*", + "rounded-ss-*", + "rounded-se-*", + "rounded-es-*", + "rounded-ee-*", + "border-0", + "border-2", + "border-4", + "border-8", + "border", + "border-x-0", + "border-x-2", + "border-x-4", + "border-x-8", + "border-x", + "border-y-0", + "border-y-2", + "border-y-4", + "border-y-8", + "border-y", + "border-s-0", + "border-s-2", + "border-s-4", + "border-s-8", + "border-s", + "border-e-0", + "border-e-2", + "border-e-4", + "border-e-8", + "border-e", + "border-t-0", + "border-t-2", + "border-t-4", + "border-t-8", + "border-t", + "border-r-0", + "border-r-2", + "border-r-4", + "border-r-8", + "border-r", + "border-b-0", + "border-b-2", + "border-b-4", + "border-b-8", + "border-b", + "border-l-0", + "border-l-2", + "border-l-4", + "border-l-8", + "border-l", + "border-inherit", + "border-current", + "border-transparent", + "border-black", + "border-white", + "border-slate-50", + "border-slate-100", + "border-slate-200", + "border-slate-300", + "border-slate-400", + "border-slate-500", + "border-slate-600", + "border-slate-700", + "border-slate-800", + "border-slate-900", + "border-slate-950", + "border-gray-50", + "border-gray-100", + "border-gray-200", + "border-gray-300", + "border-gray-400", + "border-gray-500", + "border-gray-600", + "border-gray-700", + "border-gray-800", + "border-gray-900", + "border-gray-950", + "border-zinc-50", + "border-zinc-100", + "border-zinc-200", + "border-zinc-300", + "border-zinc-400", + "border-zinc-500", + "border-zinc-600", + "border-zinc-700", + "border-zinc-800", + "border-zinc-900", + "border-zinc-950", + "border-neutral-50", + "border-neutral-100", + "border-neutral-200", + "border-neutral-300", + "border-neutral-400", + "border-neutral-500", + "border-neutral-600", + "border-neutral-700", + "border-neutral-800", + "border-neutral-900", + "border-neutral-950", + "border-stone-50", + "border-stone-100", + "border-stone-200", + "border-stone-300", + "border-stone-400", + "border-stone-500", + "border-stone-600", + "border-stone-700", + "border-stone-800", + "border-stone-900", + "border-stone-950", + "border-red-50", + "border-red-100", + "border-red-200", + "border-red-300", + "border-red-400", + "border-red-500", + "border-red-600", + "border-red-700", + "border-red-800", + "border-red-900", + "border-red-950", + "border-orange-50", + "border-orange-100", + "border-orange-200", + "border-orange-300", + "border-orange-400", + "border-orange-500", + "border-orange-600", + "border-orange-700", + "border-orange-800", + "border-orange-900", + "border-orange-950", + "border-amber-50", + "border-amber-100", + "border-amber-200", + "border-amber-300", + "border-amber-400", + "border-amber-500", + "border-amber-600", + "border-amber-700", + "border-amber-800", + "border-amber-900", + "border-amber-950", + "border-yellow-50", + "border-yellow-100", + "border-yellow-200", + "border-yellow-300", + "border-yellow-400", + "border-yellow-500", + "border-yellow-600", + "border-yellow-700", + "border-yellow-800", + "border-yellow-900", + "border-yellow-950", + "border-lime-50", + "border-lime-100", + "border-lime-200", + "border-lime-300", + "border-lime-400", + "border-lime-500", + "border-lime-600", + "border-lime-700", + "border-lime-800", + "border-lime-900", + "border-lime-950", + "border-green-50", + "border-green-100", + "border-green-200", + "border-green-300", + "border-green-400", + "border-green-500", + "border-green-600", + "border-green-700", + "border-green-800", + "border-green-900", + "border-green-950", + "border-emerald-50", + "border-emerald-100", + "border-emerald-200", + "border-emerald-300", + "border-emerald-400", + "border-emerald-500", + "border-emerald-600", + "border-emerald-700", + "border-emerald-800", + "border-emerald-900", + "border-emerald-950", + "border-teal-50", + "border-teal-100", + "border-teal-200", + "border-teal-300", + "border-teal-400", + "border-teal-500", + "border-teal-600", + "border-teal-700", + "border-teal-800", + "border-teal-900", + "border-teal-950", + "border-cyan-50", + "border-cyan-100", + "border-cyan-200", + "border-cyan-300", + "border-cyan-400", + "border-cyan-500", + "border-cyan-600", + "border-cyan-700", + "border-cyan-800", + "border-cyan-900", + "border-cyan-950", + "border-sky-50", + "border-sky-100", + "border-sky-200", + "border-sky-300", + "border-sky-400", + "border-sky-500", + "border-sky-600", + "border-sky-700", + "border-sky-800", + "border-sky-900", + "border-sky-950", + "border-blue-50", + "border-blue-100", + "border-blue-200", + "border-blue-300", + "border-blue-400", + "border-blue-500", + "border-blue-600", + "border-blue-700", + "border-blue-800", + "border-blue-900", + "border-blue-950", + "border-indigo-50", + "border-indigo-100", + "border-indigo-200", + "border-indigo-300", + "border-indigo-400", + "border-indigo-500", + "border-indigo-600", + "border-indigo-700", + "border-indigo-800", + "border-indigo-900", + "border-indigo-950", + "border-violet-50", + "border-violet-100", + "border-violet-200", + "border-violet-300", + "border-violet-400", + "border-violet-500", + "border-violet-600", + "border-violet-700", + "border-violet-800", + "border-violet-900", + "border-violet-950", + "border-purple-50", + "border-purple-100", + "border-purple-200", + "border-purple-300", + "border-purple-400", + "border-purple-500", + "border-purple-600", + "border-purple-700", + "border-purple-800", + "border-purple-900", + "border-purple-950", + "border-fuchsia-50", + "border-fuchsia-100", + "border-fuchsia-200", + "border-fuchsia-300", + "border-fuchsia-400", + "border-fuchsia-500", + "border-fuchsia-600", + "border-fuchsia-700", + "border-fuchsia-800", + "border-fuchsia-900", + "border-fuchsia-950", + "border-pink-50", + "border-pink-100", + "border-pink-200", + "border-pink-300", + "border-pink-400", + "border-pink-500", + "border-pink-600", + "border-pink-700", + "border-pink-800", + "border-pink-900", + "border-pink-950", + "border-rose-50", + "border-rose-100", + "border-rose-200", + "border-rose-300", + "border-rose-400", + "border-rose-500", + "border-rose-600", + "border-rose-700", + "border-rose-800", + "border-rose-900", + "border-rose-950", + "border-x-inherit", + "border-x-current", + "border-x-transparent", + "border-x-black", + "border-x-white", + "border-x-slate-50", + "border-x-slate-100", + "border-x-slate-200", + "border-x-slate-300", + "border-x-slate-400", + "border-x-slate-500", + "border-x-slate-600", + "border-x-slate-700", + "border-x-slate-800", + "border-x-slate-900", + "border-x-slate-950", + "border-x-gray-50", + "border-x-gray-100", + "border-x-gray-200", + "border-x-gray-300", + "border-x-gray-400", + "border-x-gray-500", + "border-x-gray-600", + "border-x-gray-700", + "border-x-gray-800", + "border-x-gray-900", + "border-x-gray-950", + "border-x-zinc-50", + "border-x-zinc-100", + "border-x-zinc-200", + "border-x-zinc-300", + "border-x-zinc-400", + "border-x-zinc-500", + "border-x-zinc-600", + "border-x-zinc-700", + "border-x-zinc-800", + "border-x-zinc-900", + "border-x-zinc-950", + "border-x-neutral-50", + "border-x-neutral-100", + "border-x-neutral-200", + "border-x-neutral-300", + "border-x-neutral-400", + "border-x-neutral-500", + "border-x-neutral-600", + "border-x-neutral-700", + "border-x-neutral-800", + "border-x-neutral-900", + "border-x-neutral-950", + "border-x-stone-50", + "border-x-stone-100", + "border-x-stone-200", + "border-x-stone-300", + "border-x-stone-400", + "border-x-stone-500", + "border-x-stone-600", + "border-x-stone-700", + "border-x-stone-800", + "border-x-stone-900", + "border-x-stone-950", + "border-x-red-50", + "border-x-red-100", + "border-x-red-200", + "border-x-red-300", + "border-x-red-400", + "border-x-red-500", + "border-x-red-600", + "border-x-red-700", + "border-x-red-800", + "border-x-red-900", + "border-x-red-950", + "border-x-orange-50", + "border-x-orange-100", + "border-x-orange-200", + "border-x-orange-300", + "border-x-orange-400", + "border-x-orange-500", + "border-x-orange-600", + "border-x-orange-700", + "border-x-orange-800", + "border-x-orange-900", + "border-x-orange-950", + "border-x-amber-50", + "border-x-amber-100", + "border-x-amber-200", + "border-x-amber-300", + "border-x-amber-400", + "border-x-amber-500", + "border-x-amber-600", + "border-x-amber-700", + "border-x-amber-800", + "border-x-amber-900", + "border-x-amber-950", + "border-x-yellow-50", + "border-x-yellow-100", + "border-x-yellow-200", + "border-x-yellow-300", + "border-x-yellow-400", + "border-x-yellow-500", + "border-x-yellow-600", + "border-x-yellow-700", + "border-x-yellow-800", + "border-x-yellow-900", + "border-x-yellow-950", + "border-x-lime-50", + "border-x-lime-100", + "border-x-lime-200", + "border-x-lime-300", + "border-x-lime-400", + "border-x-lime-500", + "border-x-lime-600", + "border-x-lime-700", + "border-x-lime-800", + "border-x-lime-900", + "border-x-lime-950", + "border-x-green-50", + "border-x-green-100", + "border-x-green-200", + "border-x-green-300", + "border-x-green-400", + "border-x-green-500", + "border-x-green-600", + "border-x-green-700", + "border-x-green-800", + "border-x-green-900", + "border-x-green-950", + "border-x-emerald-50", + "border-x-emerald-100", + "border-x-emerald-200", + "border-x-emerald-300", + "border-x-emerald-400", + "border-x-emerald-500", + "border-x-emerald-600", + "border-x-emerald-700", + "border-x-emerald-800", + "border-x-emerald-900", + "border-x-emerald-950", + "border-x-teal-50", + "border-x-teal-100", + "border-x-teal-200", + "border-x-teal-300", + "border-x-teal-400", + "border-x-teal-500", + "border-x-teal-600", + "border-x-teal-700", + "border-x-teal-800", + "border-x-teal-900", + "border-x-teal-950", + "border-x-cyan-50", + "border-x-cyan-100", + "border-x-cyan-200", + "border-x-cyan-300", + "border-x-cyan-400", + "border-x-cyan-500", + "border-x-cyan-600", + "border-x-cyan-700", + "border-x-cyan-800", + "border-x-cyan-900", + "border-x-cyan-950", + "border-x-sky-50", + "border-x-sky-100", + "border-x-sky-200", + "border-x-sky-300", + "border-x-sky-400", + "border-x-sky-500", + "border-x-sky-600", + "border-x-sky-700", + "border-x-sky-800", + "border-x-sky-900", + "border-x-sky-950", + "border-x-blue-50", + "border-x-blue-100", + "border-x-blue-200", + "border-x-blue-300", + "border-x-blue-400", + "border-x-blue-500", + "border-x-blue-600", + "border-x-blue-700", + "border-x-blue-800", + "border-x-blue-900", + "border-x-blue-950", + "border-x-indigo-50", + "border-x-indigo-100", + "border-x-indigo-200", + "border-x-indigo-300", + "border-x-indigo-400", + "border-x-indigo-500", + "border-x-indigo-600", + "border-x-indigo-700", + "border-x-indigo-800", + "border-x-indigo-900", + "border-x-indigo-950", + "border-x-violet-50", + "border-x-violet-100", + "border-x-violet-200", + "border-x-violet-300", + "border-x-violet-400", + "border-x-violet-500", + "border-x-violet-600", + "border-x-violet-700", + "border-x-violet-800", + "border-x-violet-900", + "border-x-violet-950", + "border-x-purple-50", + "border-x-purple-100", + "border-x-purple-200", + "border-x-purple-300", + "border-x-purple-400", + "border-x-purple-500", + "border-x-purple-600", + "border-x-purple-700", + "border-x-purple-800", + "border-x-purple-900", + "border-x-purple-950", + "border-x-fuchsia-50", + "border-x-fuchsia-100", + "border-x-fuchsia-200", + "border-x-fuchsia-300", + "border-x-fuchsia-400", + "border-x-fuchsia-500", + "border-x-fuchsia-600", + "border-x-fuchsia-700", + "border-x-fuchsia-800", + "border-x-fuchsia-900", + "border-x-fuchsia-950", + "border-x-pink-50", + "border-x-pink-100", + "border-x-pink-200", + "border-x-pink-300", + "border-x-pink-400", + "border-x-pink-500", + "border-x-pink-600", + "border-x-pink-700", + "border-x-pink-800", + "border-x-pink-900", + "border-x-pink-950", + "border-x-rose-50", + "border-x-rose-100", + "border-x-rose-200", + "border-x-rose-300", + "border-x-rose-400", + "border-x-rose-500", + "border-x-rose-600", + "border-x-rose-700", + "border-x-rose-800", + "border-x-rose-900", + "border-x-rose-950", + "border-y-inherit", + "border-y-current", + "border-y-transparent", + "border-y-black", + "border-y-white", + "border-y-slate-50", + "border-y-slate-100", + "border-y-slate-200", + "border-y-slate-300", + "border-y-slate-400", + "border-y-slate-500", + "border-y-slate-600", + "border-y-slate-700", + "border-y-slate-800", + "border-y-slate-900", + "border-y-slate-950", + "border-y-gray-50", + "border-y-gray-100", + "border-y-gray-200", + "border-y-gray-300", + "border-y-gray-400", + "border-y-gray-500", + "border-y-gray-600", + "border-y-gray-700", + "border-y-gray-800", + "border-y-gray-900", + "border-y-gray-950", + "border-y-zinc-50", + "border-y-zinc-100", + "border-y-zinc-200", + "border-y-zinc-300", + "border-y-zinc-400", + "border-y-zinc-500", + "border-y-zinc-600", + "border-y-zinc-700", + "border-y-zinc-800", + "border-y-zinc-900", + "border-y-zinc-950", + "border-y-neutral-50", + "border-y-neutral-100", + "border-y-neutral-200", + "border-y-neutral-300", + "border-y-neutral-400", + "border-y-neutral-500", + "border-y-neutral-600", + "border-y-neutral-700", + "border-y-neutral-800", + "border-y-neutral-900", + "border-y-neutral-950", + "border-y-stone-50", + "border-y-stone-100", + "border-y-stone-200", + "border-y-stone-300", + "border-y-stone-400", + "border-y-stone-500", + "border-y-stone-600", + "border-y-stone-700", + "border-y-stone-800", + "border-y-stone-900", + "border-y-stone-950", + "border-y-red-50", + "border-y-red-100", + "border-y-red-200", + "border-y-red-300", + "border-y-red-400", + "border-y-red-500", + "border-y-red-600", + "border-y-red-700", + "border-y-red-800", + "border-y-red-900", + "border-y-red-950", + "border-y-orange-50", + "border-y-orange-100", + "border-y-orange-200", + "border-y-orange-300", + "border-y-orange-400", + "border-y-orange-500", + "border-y-orange-600", + "border-y-orange-700", + "border-y-orange-800", + "border-y-orange-900", + "border-y-orange-950", + "border-y-amber-50", + "border-y-amber-100", + "border-y-amber-200", + "border-y-amber-300", + "border-y-amber-400", + "border-y-amber-500", + "border-y-amber-600", + "border-y-amber-700", + "border-y-amber-800", + "border-y-amber-900", + "border-y-amber-950", + "border-y-yellow-50", + "border-y-yellow-100", + "border-y-yellow-200", + "border-y-yellow-300", + "border-y-yellow-400", + "border-y-yellow-500", + "border-y-yellow-600", + "border-y-yellow-700", + "border-y-yellow-800", + "border-y-yellow-900", + "border-y-yellow-950", + "border-y-lime-50", + "border-y-lime-100", + "border-y-lime-200", + "border-y-lime-300", + "border-y-lime-400", + "border-y-lime-500", + "border-y-lime-600", + "border-y-lime-700", + "border-y-lime-800", + "border-y-lime-900", + "border-y-lime-950", + "border-y-green-50", + "border-y-green-100", + "border-y-green-200", + "border-y-green-300", + "border-y-green-400", + "border-y-green-500", + "border-y-green-600", + "border-y-green-700", + "border-y-green-800", + "border-y-green-900", + "border-y-green-950", + "border-y-emerald-50", + "border-y-emerald-100", + "border-y-emerald-200", + "border-y-emerald-300", + "border-y-emerald-400", + "border-y-emerald-500", + "border-y-emerald-600", + "border-y-emerald-700", + "border-y-emerald-800", + "border-y-emerald-900", + "border-y-emerald-950", + "border-y-teal-50", + "border-y-teal-100", + "border-y-teal-200", + "border-y-teal-300", + "border-y-teal-400", + "border-y-teal-500", + "border-y-teal-600", + "border-y-teal-700", + "border-y-teal-800", + "border-y-teal-900", + "border-y-teal-950", + "border-y-cyan-50", + "border-y-cyan-100", + "border-y-cyan-200", + "border-y-cyan-300", + "border-y-cyan-400", + "border-y-cyan-500", + "border-y-cyan-600", + "border-y-cyan-700", + "border-y-cyan-800", + "border-y-cyan-900", + "border-y-cyan-950", + "border-y-sky-50", + "border-y-sky-100", + "border-y-sky-200", + "border-y-sky-300", + "border-y-sky-400", + "border-y-sky-500", + "border-y-sky-600", + "border-y-sky-700", + "border-y-sky-800", + "border-y-sky-900", + "border-y-sky-950", + "border-y-blue-50", + "border-y-blue-100", + "border-y-blue-200", + "border-y-blue-300", + "border-y-blue-400", + "border-y-blue-500", + "border-y-blue-600", + "border-y-blue-700", + "border-y-blue-800", + "border-y-blue-900", + "border-y-blue-950", + "border-y-indigo-50", + "border-y-indigo-100", + "border-y-indigo-200", + "border-y-indigo-300", + "border-y-indigo-400", + "border-y-indigo-500", + "border-y-indigo-600", + "border-y-indigo-700", + "border-y-indigo-800", + "border-y-indigo-900", + "border-y-indigo-950", + "border-y-violet-50", + "border-y-violet-100", + "border-y-violet-200", + "border-y-violet-300", + "border-y-violet-400", + "border-y-violet-500", + "border-y-violet-600", + "border-y-violet-700", + "border-y-violet-800", + "border-y-violet-900", + "border-y-violet-950", + "border-y-purple-50", + "border-y-purple-100", + "border-y-purple-200", + "border-y-purple-300", + "border-y-purple-400", + "border-y-purple-500", + "border-y-purple-600", + "border-y-purple-700", + "border-y-purple-800", + "border-y-purple-900", + "border-y-purple-950", + "border-y-fuchsia-50", + "border-y-fuchsia-100", + "border-y-fuchsia-200", + "border-y-fuchsia-300", + "border-y-fuchsia-400", + "border-y-fuchsia-500", + "border-y-fuchsia-600", + "border-y-fuchsia-700", + "border-y-fuchsia-800", + "border-y-fuchsia-900", + "border-y-fuchsia-950", + "border-y-pink-50", + "border-y-pink-100", + "border-y-pink-200", + "border-y-pink-300", + "border-y-pink-400", + "border-y-pink-500", + "border-y-pink-600", + "border-y-pink-700", + "border-y-pink-800", + "border-y-pink-900", + "border-y-pink-950", + "border-y-rose-50", + "border-y-rose-100", + "border-y-rose-200", + "border-y-rose-300", + "border-y-rose-400", + "border-y-rose-500", + "border-y-rose-600", + "border-y-rose-700", + "border-y-rose-800", + "border-y-rose-900", + "border-y-rose-950", + "border-s-inherit", + "border-s-current", + "border-s-transparent", + "border-s-black", + "border-s-white", + "border-s-slate-50", + "border-s-slate-100", + "border-s-slate-200", + "border-s-slate-300", + "border-s-slate-400", + "border-s-slate-500", + "border-s-slate-600", + "border-s-slate-700", + "border-s-slate-800", + "border-s-slate-900", + "border-s-slate-950", + "border-s-gray-50", + "border-s-gray-100", + "border-s-gray-200", + "border-s-gray-300", + "border-s-gray-400", + "border-s-gray-500", + "border-s-gray-600", + "border-s-gray-700", + "border-s-gray-800", + "border-s-gray-900", + "border-s-gray-950", + "border-s-zinc-50", + "border-s-zinc-100", + "border-s-zinc-200", + "border-s-zinc-300", + "border-s-zinc-400", + "border-s-zinc-500", + "border-s-zinc-600", + "border-s-zinc-700", + "border-s-zinc-800", + "border-s-zinc-900", + "border-s-zinc-950", + "border-s-neutral-50", + "border-s-neutral-100", + "border-s-neutral-200", + "border-s-neutral-300", + "border-s-neutral-400", + "border-s-neutral-500", + "border-s-neutral-600", + "border-s-neutral-700", + "border-s-neutral-800", + "border-s-neutral-900", + "border-s-neutral-950", + "border-s-stone-50", + "border-s-stone-100", + "border-s-stone-200", + "border-s-stone-300", + "border-s-stone-400", + "border-s-stone-500", + "border-s-stone-600", + "border-s-stone-700", + "border-s-stone-800", + "border-s-stone-900", + "border-s-stone-950", + "border-s-red-50", + "border-s-red-100", + "border-s-red-200", + "border-s-red-300", + "border-s-red-400", + "border-s-red-500", + "border-s-red-600", + "border-s-red-700", + "border-s-red-800", + "border-s-red-900", + "border-s-red-950", + "border-s-orange-50", + "border-s-orange-100", + "border-s-orange-200", + "border-s-orange-300", + "border-s-orange-400", + "border-s-orange-500", + "border-s-orange-600", + "border-s-orange-700", + "border-s-orange-800", + "border-s-orange-900", + "border-s-orange-950", + "border-s-amber-50", + "border-s-amber-100", + "border-s-amber-200", + "border-s-amber-300", + "border-s-amber-400", + "border-s-amber-500", + "border-s-amber-600", + "border-s-amber-700", + "border-s-amber-800", + "border-s-amber-900", + "border-s-amber-950", + "border-s-yellow-50", + "border-s-yellow-100", + "border-s-yellow-200", + "border-s-yellow-300", + "border-s-yellow-400", + "border-s-yellow-500", + "border-s-yellow-600", + "border-s-yellow-700", + "border-s-yellow-800", + "border-s-yellow-900", + "border-s-yellow-950", + "border-s-lime-50", + "border-s-lime-100", + "border-s-lime-200", + "border-s-lime-300", + "border-s-lime-400", + "border-s-lime-500", + "border-s-lime-600", + "border-s-lime-700", + "border-s-lime-800", + "border-s-lime-900", + "border-s-lime-950", + "border-s-green-50", + "border-s-green-100", + "border-s-green-200", + "border-s-green-300", + "border-s-green-400", + "border-s-green-500", + "border-s-green-600", + "border-s-green-700", + "border-s-green-800", + "border-s-green-900", + "border-s-green-950", + "border-s-emerald-50", + "border-s-emerald-100", + "border-s-emerald-200", + "border-s-emerald-300", + "border-s-emerald-400", + "border-s-emerald-500", + "border-s-emerald-600", + "border-s-emerald-700", + "border-s-emerald-800", + "border-s-emerald-900", + "border-s-emerald-950", + "border-s-teal-50", + "border-s-teal-100", + "border-s-teal-200", + "border-s-teal-300", + "border-s-teal-400", + "border-s-teal-500", + "border-s-teal-600", + "border-s-teal-700", + "border-s-teal-800", + "border-s-teal-900", + "border-s-teal-950", + "border-s-cyan-50", + "border-s-cyan-100", + "border-s-cyan-200", + "border-s-cyan-300", + "border-s-cyan-400", + "border-s-cyan-500", + "border-s-cyan-600", + "border-s-cyan-700", + "border-s-cyan-800", + "border-s-cyan-900", + "border-s-cyan-950", + "border-s-sky-50", + "border-s-sky-100", + "border-s-sky-200", + "border-s-sky-300", + "border-s-sky-400", + "border-s-sky-500", + "border-s-sky-600", + "border-s-sky-700", + "border-s-sky-800", + "border-s-sky-900", + "border-s-sky-950", + "border-s-blue-50", + "border-s-blue-100", + "border-s-blue-200", + "border-s-blue-300", + "border-s-blue-400", + "border-s-blue-500", + "border-s-blue-600", + "border-s-blue-700", + "border-s-blue-800", + "border-s-blue-900", + "border-s-blue-950", + "border-s-indigo-50", + "border-s-indigo-100", + "border-s-indigo-200", + "border-s-indigo-300", + "border-s-indigo-400", + "border-s-indigo-500", + "border-s-indigo-600", + "border-s-indigo-700", + "border-s-indigo-800", + "border-s-indigo-900", + "border-s-indigo-950", + "border-s-violet-50", + "border-s-violet-100", + "border-s-violet-200", + "border-s-violet-300", + "border-s-violet-400", + "border-s-violet-500", + "border-s-violet-600", + "border-s-violet-700", + "border-s-violet-800", + "border-s-violet-900", + "border-s-violet-950", + "border-s-purple-50", + "border-s-purple-100", + "border-s-purple-200", + "border-s-purple-300", + "border-s-purple-400", + "border-s-purple-500", + "border-s-purple-600", + "border-s-purple-700", + "border-s-purple-800", + "border-s-purple-900", + "border-s-purple-950", + "border-s-fuchsia-50", + "border-s-fuchsia-100", + "border-s-fuchsia-200", + "border-s-fuchsia-300", + "border-s-fuchsia-400", + "border-s-fuchsia-500", + "border-s-fuchsia-600", + "border-s-fuchsia-700", + "border-s-fuchsia-800", + "border-s-fuchsia-900", + "border-s-fuchsia-950", + "border-s-pink-50", + "border-s-pink-100", + "border-s-pink-200", + "border-s-pink-300", + "border-s-pink-400", + "border-s-pink-500", + "border-s-pink-600", + "border-s-pink-700", + "border-s-pink-800", + "border-s-pink-900", + "border-s-pink-950", + "border-s-rose-50", + "border-s-rose-100", + "border-s-rose-200", + "border-s-rose-300", + "border-s-rose-400", + "border-s-rose-500", + "border-s-rose-600", + "border-s-rose-700", + "border-s-rose-800", + "border-s-rose-900", + "border-s-rose-950", + "border-e-inherit", + "border-e-current", + "border-e-transparent", + "border-e-black", + "border-e-white", + "border-e-slate-50", + "border-e-slate-100", + "border-e-slate-200", + "border-e-slate-300", + "border-e-slate-400", + "border-e-slate-500", + "border-e-slate-600", + "border-e-slate-700", + "border-e-slate-800", + "border-e-slate-900", + "border-e-slate-950", + "border-e-gray-50", + "border-e-gray-100", + "border-e-gray-200", + "border-e-gray-300", + "border-e-gray-400", + "border-e-gray-500", + "border-e-gray-600", + "border-e-gray-700", + "border-e-gray-800", + "border-e-gray-900", + "border-e-gray-950", + "border-e-zinc-50", + "border-e-zinc-100", + "border-e-zinc-200", + "border-e-zinc-300", + "border-e-zinc-400", + "border-e-zinc-500", + "border-e-zinc-600", + "border-e-zinc-700", + "border-e-zinc-800", + "border-e-zinc-900", + "border-e-zinc-950", + "border-e-neutral-50", + "border-e-neutral-100", + "border-e-neutral-200", + "border-e-neutral-300", + "border-e-neutral-400", + "border-e-neutral-500", + "border-e-neutral-600", + "border-e-neutral-700", + "border-e-neutral-800", + "border-e-neutral-900", + "border-e-neutral-950", + "border-e-stone-50", + "border-e-stone-100", + "border-e-stone-200", + "border-e-stone-300", + "border-e-stone-400", + "border-e-stone-500", + "border-e-stone-600", + "border-e-stone-700", + "border-e-stone-800", + "border-e-stone-900", + "border-e-stone-950", + "border-e-red-50", + "border-e-red-100", + "border-e-red-200", + "border-e-red-300", + "border-e-red-400", + "border-e-red-500", + "border-e-red-600", + "border-e-red-700", + "border-e-red-800", + "border-e-red-900", + "border-e-red-950", + "border-e-orange-50", + "border-e-orange-100", + "border-e-orange-200", + "border-e-orange-300", + "border-e-orange-400", + "border-e-orange-500", + "border-e-orange-600", + "border-e-orange-700", + "border-e-orange-800", + "border-e-orange-900", + "border-e-orange-950", + "border-e-amber-50", + "border-e-amber-100", + "border-e-amber-200", + "border-e-amber-300", + "border-e-amber-400", + "border-e-amber-500", + "border-e-amber-600", + "border-e-amber-700", + "border-e-amber-800", + "border-e-amber-900", + "border-e-amber-950", + "border-e-yellow-50", + "border-e-yellow-100", + "border-e-yellow-200", + "border-e-yellow-300", + "border-e-yellow-400", + "border-e-yellow-500", + "border-e-yellow-600", + "border-e-yellow-700", + "border-e-yellow-800", + "border-e-yellow-900", + "border-e-yellow-950", + "border-e-lime-50", + "border-e-lime-100", + "border-e-lime-200", + "border-e-lime-300", + "border-e-lime-400", + "border-e-lime-500", + "border-e-lime-600", + "border-e-lime-700", + "border-e-lime-800", + "border-e-lime-900", + "border-e-lime-950", + "border-e-green-50", + "border-e-green-100", + "border-e-green-200", + "border-e-green-300", + "border-e-green-400", + "border-e-green-500", + "border-e-green-600", + "border-e-green-700", + "border-e-green-800", + "border-e-green-900", + "border-e-green-950", + "border-e-emerald-50", + "border-e-emerald-100", + "border-e-emerald-200", + "border-e-emerald-300", + "border-e-emerald-400", + "border-e-emerald-500", + "border-e-emerald-600", + "border-e-emerald-700", + "border-e-emerald-800", + "border-e-emerald-900", + "border-e-emerald-950", + "border-e-teal-50", + "border-e-teal-100", + "border-e-teal-200", + "border-e-teal-300", + "border-e-teal-400", + "border-e-teal-500", + "border-e-teal-600", + "border-e-teal-700", + "border-e-teal-800", + "border-e-teal-900", + "border-e-teal-950", + "border-e-cyan-50", + "border-e-cyan-100", + "border-e-cyan-200", + "border-e-cyan-300", + "border-e-cyan-400", + "border-e-cyan-500", + "border-e-cyan-600", + "border-e-cyan-700", + "border-e-cyan-800", + "border-e-cyan-900", + "border-e-cyan-950", + "border-e-sky-50", + "border-e-sky-100", + "border-e-sky-200", + "border-e-sky-300", + "border-e-sky-400", + "border-e-sky-500", + "border-e-sky-600", + "border-e-sky-700", + "border-e-sky-800", + "border-e-sky-900", + "border-e-sky-950", + "border-e-blue-50", + "border-e-blue-100", + "border-e-blue-200", + "border-e-blue-300", + "border-e-blue-400", + "border-e-blue-500", + "border-e-blue-600", + "border-e-blue-700", + "border-e-blue-800", + "border-e-blue-900", + "border-e-blue-950", + "border-e-indigo-50", + "border-e-indigo-100", + "border-e-indigo-200", + "border-e-indigo-300", + "border-e-indigo-400", + "border-e-indigo-500", + "border-e-indigo-600", + "border-e-indigo-700", + "border-e-indigo-800", + "border-e-indigo-900", + "border-e-indigo-950", + "border-e-violet-50", + "border-e-violet-100", + "border-e-violet-200", + "border-e-violet-300", + "border-e-violet-400", + "border-e-violet-500", + "border-e-violet-600", + "border-e-violet-700", + "border-e-violet-800", + "border-e-violet-900", + "border-e-violet-950", + "border-e-purple-50", + "border-e-purple-100", + "border-e-purple-200", + "border-e-purple-300", + "border-e-purple-400", + "border-e-purple-500", + "border-e-purple-600", + "border-e-purple-700", + "border-e-purple-800", + "border-e-purple-900", + "border-e-purple-950", + "border-e-fuchsia-50", + "border-e-fuchsia-100", + "border-e-fuchsia-200", + "border-e-fuchsia-300", + "border-e-fuchsia-400", + "border-e-fuchsia-500", + "border-e-fuchsia-600", + "border-e-fuchsia-700", + "border-e-fuchsia-800", + "border-e-fuchsia-900", + "border-e-fuchsia-950", + "border-e-pink-50", + "border-e-pink-100", + "border-e-pink-200", + "border-e-pink-300", + "border-e-pink-400", + "border-e-pink-500", + "border-e-pink-600", + "border-e-pink-700", + "border-e-pink-800", + "border-e-pink-900", + "border-e-pink-950", + "border-e-rose-50", + "border-e-rose-100", + "border-e-rose-200", + "border-e-rose-300", + "border-e-rose-400", + "border-e-rose-500", + "border-e-rose-600", + "border-e-rose-700", + "border-e-rose-800", + "border-e-rose-900", + "border-e-rose-950", + "border-t-inherit", + "border-t-current", + "border-t-transparent", + "border-t-black", + "border-t-white", + "border-t-slate-50", + "border-t-slate-100", + "border-t-slate-200", + "border-t-slate-300", + "border-t-slate-400", + "border-t-slate-500", + "border-t-slate-600", + "border-t-slate-700", + "border-t-slate-800", + "border-t-slate-900", + "border-t-slate-950", + "border-t-gray-50", + "border-t-gray-100", + "border-t-gray-200", + "border-t-gray-300", + "border-t-gray-400", + "border-t-gray-500", + "border-t-gray-600", + "border-t-gray-700", + "border-t-gray-800", + "border-t-gray-900", + "border-t-gray-950", + "border-t-zinc-50", + "border-t-zinc-100", + "border-t-zinc-200", + "border-t-zinc-300", + "border-t-zinc-400", + "border-t-zinc-500", + "border-t-zinc-600", + "border-t-zinc-700", + "border-t-zinc-800", + "border-t-zinc-900", + "border-t-zinc-950", + "border-t-neutral-50", + "border-t-neutral-100", + "border-t-neutral-200", + "border-t-neutral-300", + "border-t-neutral-400", + "border-t-neutral-500", + "border-t-neutral-600", + "border-t-neutral-700", + "border-t-neutral-800", + "border-t-neutral-900", + "border-t-neutral-950", + "border-t-stone-50", + "border-t-stone-100", + "border-t-stone-200", + "border-t-stone-300", + "border-t-stone-400", + "border-t-stone-500", + "border-t-stone-600", + "border-t-stone-700", + "border-t-stone-800", + "border-t-stone-900", + "border-t-stone-950", + "border-t-red-50", + "border-t-red-100", + "border-t-red-200", + "border-t-red-300", + "border-t-red-400", + "border-t-red-500", + "border-t-red-600", + "border-t-red-700", + "border-t-red-800", + "border-t-red-900", + "border-t-red-950", + "border-t-orange-50", + "border-t-orange-100", + "border-t-orange-200", + "border-t-orange-300", + "border-t-orange-400", + "border-t-orange-500", + "border-t-orange-600", + "border-t-orange-700", + "border-t-orange-800", + "border-t-orange-900", + "border-t-orange-950", + "border-t-amber-50", + "border-t-amber-100", + "border-t-amber-200", + "border-t-amber-300", + "border-t-amber-400", + "border-t-amber-500", + "border-t-amber-600", + "border-t-amber-700", + "border-t-amber-800", + "border-t-amber-900", + "border-t-amber-950", + "border-t-yellow-50", + "border-t-yellow-100", + "border-t-yellow-200", + "border-t-yellow-300", + "border-t-yellow-400", + "border-t-yellow-500", + "border-t-yellow-600", + "border-t-yellow-700", + "border-t-yellow-800", + "border-t-yellow-900", + "border-t-yellow-950", + "border-t-lime-50", + "border-t-lime-100", + "border-t-lime-200", + "border-t-lime-300", + "border-t-lime-400", + "border-t-lime-500", + "border-t-lime-600", + "border-t-lime-700", + "border-t-lime-800", + "border-t-lime-900", + "border-t-lime-950", + "border-t-green-50", + "border-t-green-100", + "border-t-green-200", + "border-t-green-300", + "border-t-green-400", + "border-t-green-500", + "border-t-green-600", + "border-t-green-700", + "border-t-green-800", + "border-t-green-900", + "border-t-green-950", + "border-t-emerald-50", + "border-t-emerald-100", + "border-t-emerald-200", + "border-t-emerald-300", + "border-t-emerald-400", + "border-t-emerald-500", + "border-t-emerald-600", + "border-t-emerald-700", + "border-t-emerald-800", + "border-t-emerald-900", + "border-t-emerald-950", + "border-t-teal-50", + "border-t-teal-100", + "border-t-teal-200", + "border-t-teal-300", + "border-t-teal-400", + "border-t-teal-500", + "border-t-teal-600", + "border-t-teal-700", + "border-t-teal-800", + "border-t-teal-900", + "border-t-teal-950", + "border-t-cyan-50", + "border-t-cyan-100", + "border-t-cyan-200", + "border-t-cyan-300", + "border-t-cyan-400", + "border-t-cyan-500", + "border-t-cyan-600", + "border-t-cyan-700", + "border-t-cyan-800", + "border-t-cyan-900", + "border-t-cyan-950", + "border-t-sky-50", + "border-t-sky-100", + "border-t-sky-200", + "border-t-sky-300", + "border-t-sky-400", + "border-t-sky-500", + "border-t-sky-600", + "border-t-sky-700", + "border-t-sky-800", + "border-t-sky-900", + "border-t-sky-950", + "border-t-blue-50", + "border-t-blue-100", + "border-t-blue-200", + "border-t-blue-300", + "border-t-blue-400", + "border-t-blue-500", + "border-t-blue-600", + "border-t-blue-700", + "border-t-blue-800", + "border-t-blue-900", + "border-t-blue-950", + "border-t-indigo-50", + "border-t-indigo-100", + "border-t-indigo-200", + "border-t-indigo-300", + "border-t-indigo-400", + "border-t-indigo-500", + "border-t-indigo-600", + "border-t-indigo-700", + "border-t-indigo-800", + "border-t-indigo-900", + "border-t-indigo-950", + "border-t-violet-50", + "border-t-violet-100", + "border-t-violet-200", + "border-t-violet-300", + "border-t-violet-400", + "border-t-violet-500", + "border-t-violet-600", + "border-t-violet-700", + "border-t-violet-800", + "border-t-violet-900", + "border-t-violet-950", + "border-t-purple-50", + "border-t-purple-100", + "border-t-purple-200", + "border-t-purple-300", + "border-t-purple-400", + "border-t-purple-500", + "border-t-purple-600", + "border-t-purple-700", + "border-t-purple-800", + "border-t-purple-900", + "border-t-purple-950", + "border-t-fuchsia-50", + "border-t-fuchsia-100", + "border-t-fuchsia-200", + "border-t-fuchsia-300", + "border-t-fuchsia-400", + "border-t-fuchsia-500", + "border-t-fuchsia-600", + "border-t-fuchsia-700", + "border-t-fuchsia-800", + "border-t-fuchsia-900", + "border-t-fuchsia-950", + "border-t-pink-50", + "border-t-pink-100", + "border-t-pink-200", + "border-t-pink-300", + "border-t-pink-400", + "border-t-pink-500", + "border-t-pink-600", + "border-t-pink-700", + "border-t-pink-800", + "border-t-pink-900", + "border-t-pink-950", + "border-t-rose-50", + "border-t-rose-100", + "border-t-rose-200", + "border-t-rose-300", + "border-t-rose-400", + "border-t-rose-500", + "border-t-rose-600", + "border-t-rose-700", + "border-t-rose-800", + "border-t-rose-900", + "border-t-rose-950", + "border-r-inherit", + "border-r-current", + "border-r-transparent", + "border-r-black", + "border-r-white", + "border-r-slate-50", + "border-r-slate-100", + "border-r-slate-200", + "border-r-slate-300", + "border-r-slate-400", + "border-r-slate-500", + "border-r-slate-600", + "border-r-slate-700", + "border-r-slate-800", + "border-r-slate-900", + "border-r-slate-950", + "border-r-gray-50", + "border-r-gray-100", + "border-r-gray-200", + "border-r-gray-300", + "border-r-gray-400", + "border-r-gray-500", + "border-r-gray-600", + "border-r-gray-700", + "border-r-gray-800", + "border-r-gray-900", + "border-r-gray-950", + "border-r-zinc-50", + "border-r-zinc-100", + "border-r-zinc-200", + "border-r-zinc-300", + "border-r-zinc-400", + "border-r-zinc-500", + "border-r-zinc-600", + "border-r-zinc-700", + "border-r-zinc-800", + "border-r-zinc-900", + "border-r-zinc-950", + "border-r-neutral-50", + "border-r-neutral-100", + "border-r-neutral-200", + "border-r-neutral-300", + "border-r-neutral-400", + "border-r-neutral-500", + "border-r-neutral-600", + "border-r-neutral-700", + "border-r-neutral-800", + "border-r-neutral-900", + "border-r-neutral-950", + "border-r-stone-50", + "border-r-stone-100", + "border-r-stone-200", + "border-r-stone-300", + "border-r-stone-400", + "border-r-stone-500", + "border-r-stone-600", + "border-r-stone-700", + "border-r-stone-800", + "border-r-stone-900", + "border-r-stone-950", + "border-r-red-50", + "border-r-red-100", + "border-r-red-200", + "border-r-red-300", + "border-r-red-400", + "border-r-red-500", + "border-r-red-600", + "border-r-red-700", + "border-r-red-800", + "border-r-red-900", + "border-r-red-950", + "border-r-orange-50", + "border-r-orange-100", + "border-r-orange-200", + "border-r-orange-300", + "border-r-orange-400", + "border-r-orange-500", + "border-r-orange-600", + "border-r-orange-700", + "border-r-orange-800", + "border-r-orange-900", + "border-r-orange-950", + "border-r-amber-50", + "border-r-amber-100", + "border-r-amber-200", + "border-r-amber-300", + "border-r-amber-400", + "border-r-amber-500", + "border-r-amber-600", + "border-r-amber-700", + "border-r-amber-800", + "border-r-amber-900", + "border-r-amber-950", + "border-r-yellow-50", + "border-r-yellow-100", + "border-r-yellow-200", + "border-r-yellow-300", + "border-r-yellow-400", + "border-r-yellow-500", + "border-r-yellow-600", + "border-r-yellow-700", + "border-r-yellow-800", + "border-r-yellow-900", + "border-r-yellow-950", + "border-r-lime-50", + "border-r-lime-100", + "border-r-lime-200", + "border-r-lime-300", + "border-r-lime-400", + "border-r-lime-500", + "border-r-lime-600", + "border-r-lime-700", + "border-r-lime-800", + "border-r-lime-900", + "border-r-lime-950", + "border-r-green-50", + "border-r-green-100", + "border-r-green-200", + "border-r-green-300", + "border-r-green-400", + "border-r-green-500", + "border-r-green-600", + "border-r-green-700", + "border-r-green-800", + "border-r-green-900", + "border-r-green-950", + "border-r-emerald-50", + "border-r-emerald-100", + "border-r-emerald-200", + "border-r-emerald-300", + "border-r-emerald-400", + "border-r-emerald-500", + "border-r-emerald-600", + "border-r-emerald-700", + "border-r-emerald-800", + "border-r-emerald-900", + "border-r-emerald-950", + "border-r-teal-50", + "border-r-teal-100", + "border-r-teal-200", + "border-r-teal-300", + "border-r-teal-400", + "border-r-teal-500", + "border-r-teal-600", + "border-r-teal-700", + "border-r-teal-800", + "border-r-teal-900", + "border-r-teal-950", + "border-r-cyan-50", + "border-r-cyan-100", + "border-r-cyan-200", + "border-r-cyan-300", + "border-r-cyan-400", + "border-r-cyan-500", + "border-r-cyan-600", + "border-r-cyan-700", + "border-r-cyan-800", + "border-r-cyan-900", + "border-r-cyan-950", + "border-r-sky-50", + "border-r-sky-100", + "border-r-sky-200", + "border-r-sky-300", + "border-r-sky-400", + "border-r-sky-500", + "border-r-sky-600", + "border-r-sky-700", + "border-r-sky-800", + "border-r-sky-900", + "border-r-sky-950", + "border-r-blue-50", + "border-r-blue-100", + "border-r-blue-200", + "border-r-blue-300", + "border-r-blue-400", + "border-r-blue-500", + "border-r-blue-600", + "border-r-blue-700", + "border-r-blue-800", + "border-r-blue-900", + "border-r-blue-950", + "border-r-indigo-50", + "border-r-indigo-100", + "border-r-indigo-200", + "border-r-indigo-300", + "border-r-indigo-400", + "border-r-indigo-500", + "border-r-indigo-600", + "border-r-indigo-700", + "border-r-indigo-800", + "border-r-indigo-900", + "border-r-indigo-950", + "border-r-violet-50", + "border-r-violet-100", + "border-r-violet-200", + "border-r-violet-300", + "border-r-violet-400", + "border-r-violet-500", + "border-r-violet-600", + "border-r-violet-700", + "border-r-violet-800", + "border-r-violet-900", + "border-r-violet-950", + "border-r-purple-50", + "border-r-purple-100", + "border-r-purple-200", + "border-r-purple-300", + "border-r-purple-400", + "border-r-purple-500", + "border-r-purple-600", + "border-r-purple-700", + "border-r-purple-800", + "border-r-purple-900", + "border-r-purple-950", + "border-r-fuchsia-50", + "border-r-fuchsia-100", + "border-r-fuchsia-200", + "border-r-fuchsia-300", + "border-r-fuchsia-400", + "border-r-fuchsia-500", + "border-r-fuchsia-600", + "border-r-fuchsia-700", + "border-r-fuchsia-800", + "border-r-fuchsia-900", + "border-r-fuchsia-950", + "border-r-pink-50", + "border-r-pink-100", + "border-r-pink-200", + "border-r-pink-300", + "border-r-pink-400", + "border-r-pink-500", + "border-r-pink-600", + "border-r-pink-700", + "border-r-pink-800", + "border-r-pink-900", + "border-r-pink-950", + "border-r-rose-50", + "border-r-rose-100", + "border-r-rose-200", + "border-r-rose-300", + "border-r-rose-400", + "border-r-rose-500", + "border-r-rose-600", + "border-r-rose-700", + "border-r-rose-800", + "border-r-rose-900", + "border-r-rose-950", + "border-b-inherit", + "border-b-current", + "border-b-transparent", + "border-b-black", + "border-b-white", + "border-b-slate-50", + "border-b-slate-100", + "border-b-slate-200", + "border-b-slate-300", + "border-b-slate-400", + "border-b-slate-500", + "border-b-slate-600", + "border-b-slate-700", + "border-b-slate-800", + "border-b-slate-900", + "border-b-slate-950", + "border-b-gray-50", + "border-b-gray-100", + "border-b-gray-200", + "border-b-gray-300", + "border-b-gray-400", + "border-b-gray-500", + "border-b-gray-600", + "border-b-gray-700", + "border-b-gray-800", + "border-b-gray-900", + "border-b-gray-950", + "border-b-zinc-50", + "border-b-zinc-100", + "border-b-zinc-200", + "border-b-zinc-300", + "border-b-zinc-400", + "border-b-zinc-500", + "border-b-zinc-600", + "border-b-zinc-700", + "border-b-zinc-800", + "border-b-zinc-900", + "border-b-zinc-950", + "border-b-neutral-50", + "border-b-neutral-100", + "border-b-neutral-200", + "border-b-neutral-300", + "border-b-neutral-400", + "border-b-neutral-500", + "border-b-neutral-600", + "border-b-neutral-700", + "border-b-neutral-800", + "border-b-neutral-900", + "border-b-neutral-950", + "border-b-stone-50", + "border-b-stone-100", + "border-b-stone-200", + "border-b-stone-300", + "border-b-stone-400", + "border-b-stone-500", + "border-b-stone-600", + "border-b-stone-700", + "border-b-stone-800", + "border-b-stone-900", + "border-b-stone-950", + "border-b-red-50", + "border-b-red-100", + "border-b-red-200", + "border-b-red-300", + "border-b-red-400", + "border-b-red-500", + "border-b-red-600", + "border-b-red-700", + "border-b-red-800", + "border-b-red-900", + "border-b-red-950", + "border-b-orange-50", + "border-b-orange-100", + "border-b-orange-200", + "border-b-orange-300", + "border-b-orange-400", + "border-b-orange-500", + "border-b-orange-600", + "border-b-orange-700", + "border-b-orange-800", + "border-b-orange-900", + "border-b-orange-950", + "border-b-amber-50", + "border-b-amber-100", + "border-b-amber-200", + "border-b-amber-300", + "border-b-amber-400", + "border-b-amber-500", + "border-b-amber-600", + "border-b-amber-700", + "border-b-amber-800", + "border-b-amber-900", + "border-b-amber-950", + "border-b-yellow-50", + "border-b-yellow-100", + "border-b-yellow-200", + "border-b-yellow-300", + "border-b-yellow-400", + "border-b-yellow-500", + "border-b-yellow-600", + "border-b-yellow-700", + "border-b-yellow-800", + "border-b-yellow-900", + "border-b-yellow-950", + "border-b-lime-50", + "border-b-lime-100", + "border-b-lime-200", + "border-b-lime-300", + "border-b-lime-400", + "border-b-lime-500", + "border-b-lime-600", + "border-b-lime-700", + "border-b-lime-800", + "border-b-lime-900", + "border-b-lime-950", + "border-b-green-50", + "border-b-green-100", + "border-b-green-200", + "border-b-green-300", + "border-b-green-400", + "border-b-green-500", + "border-b-green-600", + "border-b-green-700", + "border-b-green-800", + "border-b-green-900", + "border-b-green-950", + "border-b-emerald-50", + "border-b-emerald-100", + "border-b-emerald-200", + "border-b-emerald-300", + "border-b-emerald-400", + "border-b-emerald-500", + "border-b-emerald-600", + "border-b-emerald-700", + "border-b-emerald-800", + "border-b-emerald-900", + "border-b-emerald-950", + "border-b-teal-50", + "border-b-teal-100", + "border-b-teal-200", + "border-b-teal-300", + "border-b-teal-400", + "border-b-teal-500", + "border-b-teal-600", + "border-b-teal-700", + "border-b-teal-800", + "border-b-teal-900", + "border-b-teal-950", + "border-b-cyan-50", + "border-b-cyan-100", + "border-b-cyan-200", + "border-b-cyan-300", + "border-b-cyan-400", + "border-b-cyan-500", + "border-b-cyan-600", + "border-b-cyan-700", + "border-b-cyan-800", + "border-b-cyan-900", + "border-b-cyan-950", + "border-b-sky-50", + "border-b-sky-100", + "border-b-sky-200", + "border-b-sky-300", + "border-b-sky-400", + "border-b-sky-500", + "border-b-sky-600", + "border-b-sky-700", + "border-b-sky-800", + "border-b-sky-900", + "border-b-sky-950", + "border-b-blue-50", + "border-b-blue-100", + "border-b-blue-200", + "border-b-blue-300", + "border-b-blue-400", + "border-b-blue-500", + "border-b-blue-600", + "border-b-blue-700", + "border-b-blue-800", + "border-b-blue-900", + "border-b-blue-950", + "border-b-indigo-50", + "border-b-indigo-100", + "border-b-indigo-200", + "border-b-indigo-300", + "border-b-indigo-400", + "border-b-indigo-500", + "border-b-indigo-600", + "border-b-indigo-700", + "border-b-indigo-800", + "border-b-indigo-900", + "border-b-indigo-950", + "border-b-violet-50", + "border-b-violet-100", + "border-b-violet-200", + "border-b-violet-300", + "border-b-violet-400", + "border-b-violet-500", + "border-b-violet-600", + "border-b-violet-700", + "border-b-violet-800", + "border-b-violet-900", + "border-b-violet-950", + "border-b-purple-50", + "border-b-purple-100", + "border-b-purple-200", + "border-b-purple-300", + "border-b-purple-400", + "border-b-purple-500", + "border-b-purple-600", + "border-b-purple-700", + "border-b-purple-800", + "border-b-purple-900", + "border-b-purple-950", + "border-b-fuchsia-50", + "border-b-fuchsia-100", + "border-b-fuchsia-200", + "border-b-fuchsia-300", + "border-b-fuchsia-400", + "border-b-fuchsia-500", + "border-b-fuchsia-600", + "border-b-fuchsia-700", + "border-b-fuchsia-800", + "border-b-fuchsia-900", + "border-b-fuchsia-950", + "border-b-pink-50", + "border-b-pink-100", + "border-b-pink-200", + "border-b-pink-300", + "border-b-pink-400", + "border-b-pink-500", + "border-b-pink-600", + "border-b-pink-700", + "border-b-pink-800", + "border-b-pink-900", + "border-b-pink-950", + "border-b-rose-50", + "border-b-rose-100", + "border-b-rose-200", + "border-b-rose-300", + "border-b-rose-400", + "border-b-rose-500", + "border-b-rose-600", + "border-b-rose-700", + "border-b-rose-800", + "border-b-rose-900", + "border-b-rose-950", + "border-l-inherit", + "border-l-current", + "border-l-transparent", + "border-l-black", + "border-l-white", + "border-l-slate-50", + "border-l-slate-100", + "border-l-slate-200", + "border-l-slate-300", + "border-l-slate-400", + "border-l-slate-500", + "border-l-slate-600", + "border-l-slate-700", + "border-l-slate-800", + "border-l-slate-900", + "border-l-slate-950", + "border-l-gray-50", + "border-l-gray-100", + "border-l-gray-200", + "border-l-gray-300", + "border-l-gray-400", + "border-l-gray-500", + "border-l-gray-600", + "border-l-gray-700", + "border-l-gray-800", + "border-l-gray-900", + "border-l-gray-950", + "border-l-zinc-50", + "border-l-zinc-100", + "border-l-zinc-200", + "border-l-zinc-300", + "border-l-zinc-400", + "border-l-zinc-500", + "border-l-zinc-600", + "border-l-zinc-700", + "border-l-zinc-800", + "border-l-zinc-900", + "border-l-zinc-950", + "border-l-neutral-50", + "border-l-neutral-100", + "border-l-neutral-200", + "border-l-neutral-300", + "border-l-neutral-400", + "border-l-neutral-500", + "border-l-neutral-600", + "border-l-neutral-700", + "border-l-neutral-800", + "border-l-neutral-900", + "border-l-neutral-950", + "border-l-stone-50", + "border-l-stone-100", + "border-l-stone-200", + "border-l-stone-300", + "border-l-stone-400", + "border-l-stone-500", + "border-l-stone-600", + "border-l-stone-700", + "border-l-stone-800", + "border-l-stone-900", + "border-l-stone-950", + "border-l-red-50", + "border-l-red-100", + "border-l-red-200", + "border-l-red-300", + "border-l-red-400", + "border-l-red-500", + "border-l-red-600", + "border-l-red-700", + "border-l-red-800", + "border-l-red-900", + "border-l-red-950", + "border-l-orange-50", + "border-l-orange-100", + "border-l-orange-200", + "border-l-orange-300", + "border-l-orange-400", + "border-l-orange-500", + "border-l-orange-600", + "border-l-orange-700", + "border-l-orange-800", + "border-l-orange-900", + "border-l-orange-950", + "border-l-amber-50", + "border-l-amber-100", + "border-l-amber-200", + "border-l-amber-300", + "border-l-amber-400", + "border-l-amber-500", + "border-l-amber-600", + "border-l-amber-700", + "border-l-amber-800", + "border-l-amber-900", + "border-l-amber-950", + "border-l-yellow-50", + "border-l-yellow-100", + "border-l-yellow-200", + "border-l-yellow-300", + "border-l-yellow-400", + "border-l-yellow-500", + "border-l-yellow-600", + "border-l-yellow-700", + "border-l-yellow-800", + "border-l-yellow-900", + "border-l-yellow-950", + "border-l-lime-50", + "border-l-lime-100", + "border-l-lime-200", + "border-l-lime-300", + "border-l-lime-400", + "border-l-lime-500", + "border-l-lime-600", + "border-l-lime-700", + "border-l-lime-800", + "border-l-lime-900", + "border-l-lime-950", + "border-l-green-50", + "border-l-green-100", + "border-l-green-200", + "border-l-green-300", + "border-l-green-400", + "border-l-green-500", + "border-l-green-600", + "border-l-green-700", + "border-l-green-800", + "border-l-green-900", + "border-l-green-950", + "border-l-emerald-50", + "border-l-emerald-100", + "border-l-emerald-200", + "border-l-emerald-300", + "border-l-emerald-400", + "border-l-emerald-500", + "border-l-emerald-600", + "border-l-emerald-700", + "border-l-emerald-800", + "border-l-emerald-900", + "border-l-emerald-950", + "border-l-teal-50", + "border-l-teal-100", + "border-l-teal-200", + "border-l-teal-300", + "border-l-teal-400", + "border-l-teal-500", + "border-l-teal-600", + "border-l-teal-700", + "border-l-teal-800", + "border-l-teal-900", + "border-l-teal-950", + "border-l-cyan-50", + "border-l-cyan-100", + "border-l-cyan-200", + "border-l-cyan-300", + "border-l-cyan-400", + "border-l-cyan-500", + "border-l-cyan-600", + "border-l-cyan-700", + "border-l-cyan-800", + "border-l-cyan-900", + "border-l-cyan-950", + "border-l-sky-50", + "border-l-sky-100", + "border-l-sky-200", + "border-l-sky-300", + "border-l-sky-400", + "border-l-sky-500", + "border-l-sky-600", + "border-l-sky-700", + "border-l-sky-800", + "border-l-sky-900", + "border-l-sky-950", + "border-l-blue-50", + "border-l-blue-100", + "border-l-blue-200", + "border-l-blue-300", + "border-l-blue-400", + "border-l-blue-500", + "border-l-blue-600", + "border-l-blue-700", + "border-l-blue-800", + "border-l-blue-900", + "border-l-blue-950", + "border-l-indigo-50", + "border-l-indigo-100", + "border-l-indigo-200", + "border-l-indigo-300", + "border-l-indigo-400", + "border-l-indigo-500", + "border-l-indigo-600", + "border-l-indigo-700", + "border-l-indigo-800", + "border-l-indigo-900", + "border-l-indigo-950", + "border-l-violet-50", + "border-l-violet-100", + "border-l-violet-200", + "border-l-violet-300", + "border-l-violet-400", + "border-l-violet-500", + "border-l-violet-600", + "border-l-violet-700", + "border-l-violet-800", + "border-l-violet-900", + "border-l-violet-950", + "border-l-purple-50", + "border-l-purple-100", + "border-l-purple-200", + "border-l-purple-300", + "border-l-purple-400", + "border-l-purple-500", + "border-l-purple-600", + "border-l-purple-700", + "border-l-purple-800", + "border-l-purple-900", + "border-l-purple-950", + "border-l-fuchsia-50", + "border-l-fuchsia-100", + "border-l-fuchsia-200", + "border-l-fuchsia-300", + "border-l-fuchsia-400", + "border-l-fuchsia-500", + "border-l-fuchsia-600", + "border-l-fuchsia-700", + "border-l-fuchsia-800", + "border-l-fuchsia-900", + "border-l-fuchsia-950", + "border-l-pink-50", + "border-l-pink-100", + "border-l-pink-200", + "border-l-pink-300", + "border-l-pink-400", + "border-l-pink-500", + "border-l-pink-600", + "border-l-pink-700", + "border-l-pink-800", + "border-l-pink-900", + "border-l-pink-950", + "border-l-rose-50", + "border-l-rose-100", + "border-l-rose-200", + "border-l-rose-300", + "border-l-rose-400", + "border-l-rose-500", + "border-l-rose-600", + "border-l-rose-700", + "border-l-rose-800", + "border-l-rose-900", + "border-l-rose-950", + "border-solid", + "border-dashed", + "border-dotted", + "border-double", + "border-hidden", + "border-none", + "divide-x-0", + "divide-x-2", + "divide-x-4", + "divide-x-8", + "divide-x", + "divide-y-0", + "divide-y-2", + "divide-y-4", + "divide-y-8", + "divide-y", + "divide-y-reverse", + "divide-x-reverse", + "divide-inherit", + "divide-current", + "divide-transparent", + "divide-black", + "divide-white", + "divide-slate-50", + "divide-slate-100", + "divide-slate-200", + "divide-slate-300", + "divide-slate-400", + "divide-slate-500", + "divide-slate-600", + "divide-slate-700", + "divide-slate-800", + "divide-slate-900", + "divide-slate-950", + "divide-gray-50", + "divide-gray-100", + "divide-gray-200", + "divide-gray-300", + "divide-gray-400", + "divide-gray-500", + "divide-gray-600", + "divide-gray-700", + "divide-gray-800", + "divide-gray-900", + "divide-gray-950", + "divide-zinc-50", + "divide-zinc-100", + "divide-zinc-200", + "divide-zinc-300", + "divide-zinc-400", + "divide-zinc-500", + "divide-zinc-600", + "divide-zinc-700", + "divide-zinc-800", + "divide-zinc-900", + "divide-zinc-950", + "divide-neutral-50", + "divide-neutral-100", + "divide-neutral-200", + "divide-neutral-300", + "divide-neutral-400", + "divide-neutral-500", + "divide-neutral-600", + "divide-neutral-700", + "divide-neutral-800", + "divide-neutral-900", + "divide-neutral-950", + "divide-stone-50", + "divide-stone-100", + "divide-stone-200", + "divide-stone-300", + "divide-stone-400", + "divide-stone-500", + "divide-stone-600", + "divide-stone-700", + "divide-stone-800", + "divide-stone-900", + "divide-stone-950", + "divide-red-50", + "divide-red-100", + "divide-red-200", + "divide-red-300", + "divide-red-400", + "divide-red-500", + "divide-red-600", + "divide-red-700", + "divide-red-800", + "divide-red-900", + "divide-red-950", + "divide-orange-50", + "divide-orange-100", + "divide-orange-200", + "divide-orange-300", + "divide-orange-400", + "divide-orange-500", + "divide-orange-600", + "divide-orange-700", + "divide-orange-800", + "divide-orange-900", + "divide-orange-950", + "divide-amber-50", + "divide-amber-100", + "divide-amber-200", + "divide-amber-300", + "divide-amber-400", + "divide-amber-500", + "divide-amber-600", + "divide-amber-700", + "divide-amber-800", + "divide-amber-900", + "divide-amber-950", + "divide-yellow-50", + "divide-yellow-100", + "divide-yellow-200", + "divide-yellow-300", + "divide-yellow-400", + "divide-yellow-500", + "divide-yellow-600", + "divide-yellow-700", + "divide-yellow-800", + "divide-yellow-900", + "divide-yellow-950", + "divide-lime-50", + "divide-lime-100", + "divide-lime-200", + "divide-lime-300", + "divide-lime-400", + "divide-lime-500", + "divide-lime-600", + "divide-lime-700", + "divide-lime-800", + "divide-lime-900", + "divide-lime-950", + "divide-green-50", + "divide-green-100", + "divide-green-200", + "divide-green-300", + "divide-green-400", + "divide-green-500", + "divide-green-600", + "divide-green-700", + "divide-green-800", + "divide-green-900", + "divide-green-950", + "divide-emerald-50", + "divide-emerald-100", + "divide-emerald-200", + "divide-emerald-300", + "divide-emerald-400", + "divide-emerald-500", + "divide-emerald-600", + "divide-emerald-700", + "divide-emerald-800", + "divide-emerald-900", + "divide-emerald-950", + "divide-teal-50", + "divide-teal-100", + "divide-teal-200", + "divide-teal-300", + "divide-teal-400", + "divide-teal-500", + "divide-teal-600", + "divide-teal-700", + "divide-teal-800", + "divide-teal-900", + "divide-teal-950", + "divide-cyan-50", + "divide-cyan-100", + "divide-cyan-200", + "divide-cyan-300", + "divide-cyan-400", + "divide-cyan-500", + "divide-cyan-600", + "divide-cyan-700", + "divide-cyan-800", + "divide-cyan-900", + "divide-cyan-950", + "divide-sky-50", + "divide-sky-100", + "divide-sky-200", + "divide-sky-300", + "divide-sky-400", + "divide-sky-500", + "divide-sky-600", + "divide-sky-700", + "divide-sky-800", + "divide-sky-900", + "divide-sky-950", + "divide-blue-50", + "divide-blue-100", + "divide-blue-200", + "divide-blue-300", + "divide-blue-400", + "divide-blue-500", + "divide-blue-600", + "divide-blue-700", + "divide-blue-800", + "divide-blue-900", + "divide-blue-950", + "divide-indigo-50", + "divide-indigo-100", + "divide-indigo-200", + "divide-indigo-300", + "divide-indigo-400", + "divide-indigo-500", + "divide-indigo-600", + "divide-indigo-700", + "divide-indigo-800", + "divide-indigo-900", + "divide-indigo-950", + "divide-violet-50", + "divide-violet-100", + "divide-violet-200", + "divide-violet-300", + "divide-violet-400", + "divide-violet-500", + "divide-violet-600", + "divide-violet-700", + "divide-violet-800", + "divide-violet-900", + "divide-violet-950", + "divide-purple-50", + "divide-purple-100", + "divide-purple-200", + "divide-purple-300", + "divide-purple-400", + "divide-purple-500", + "divide-purple-600", + "divide-purple-700", + "divide-purple-800", + "divide-purple-900", + "divide-purple-950", + "divide-fuchsia-50", + "divide-fuchsia-100", + "divide-fuchsia-200", + "divide-fuchsia-300", + "divide-fuchsia-400", + "divide-fuchsia-500", + "divide-fuchsia-600", + "divide-fuchsia-700", + "divide-fuchsia-800", + "divide-fuchsia-900", + "divide-fuchsia-950", + "divide-pink-50", + "divide-pink-100", + "divide-pink-200", + "divide-pink-300", + "divide-pink-400", + "divide-pink-500", + "divide-pink-600", + "divide-pink-700", + "divide-pink-800", + "divide-pink-900", + "divide-pink-950", + "divide-rose-50", + "divide-rose-100", + "divide-rose-200", + "divide-rose-300", + "divide-rose-400", + "divide-rose-500", + "divide-rose-600", + "divide-rose-700", + "divide-rose-800", + "divide-rose-900", + "divide-rose-950", + "divide-solid", + "divide-dashed", + "divide-dotted", + "divide-double", + "divide-none", + "outline-0", + "outline-1", + "outline-2", + "outline-4", + "outline-8", + "outline-inherit", + "outline-current", + "outline-transparent", + "outline-black", + "outline-white", + "outline-slate-50", + "outline-slate-100", + "outline-slate-200", + "outline-slate-300", + "outline-slate-400", + "outline-slate-500", + "outline-slate-600", + "outline-slate-700", + "outline-slate-800", + "outline-slate-900", + "outline-slate-950", + "outline-gray-50", + "outline-gray-100", + "outline-gray-200", + "outline-gray-300", + "outline-gray-400", + "outline-gray-500", + "outline-gray-600", + "outline-gray-700", + "outline-gray-800", + "outline-gray-900", + "outline-gray-950", + "outline-zinc-50", + "outline-zinc-100", + "outline-zinc-200", + "outline-zinc-300", + "outline-zinc-400", + "outline-zinc-500", + "outline-zinc-600", + "outline-zinc-700", + "outline-zinc-800", + "outline-zinc-900", + "outline-zinc-950", + "outline-neutral-50", + "outline-neutral-100", + "outline-neutral-200", + "outline-neutral-300", + "outline-neutral-400", + "outline-neutral-500", + "outline-neutral-600", + "outline-neutral-700", + "outline-neutral-800", + "outline-neutral-900", + "outline-neutral-950", + "outline-stone-50", + "outline-stone-100", + "outline-stone-200", + "outline-stone-300", + "outline-stone-400", + "outline-stone-500", + "outline-stone-600", + "outline-stone-700", + "outline-stone-800", + "outline-stone-900", + "outline-stone-950", + "outline-red-50", + "outline-red-100", + "outline-red-200", + "outline-red-300", + "outline-red-400", + "outline-red-500", + "outline-red-600", + "outline-red-700", + "outline-red-800", + "outline-red-900", + "outline-red-950", + "outline-orange-50", + "outline-orange-100", + "outline-orange-200", + "outline-orange-300", + "outline-orange-400", + "outline-orange-500", + "outline-orange-600", + "outline-orange-700", + "outline-orange-800", + "outline-orange-900", + "outline-orange-950", + "outline-amber-50", + "outline-amber-100", + "outline-amber-200", + "outline-amber-300", + "outline-amber-400", + "outline-amber-500", + "outline-amber-600", + "outline-amber-700", + "outline-amber-800", + "outline-amber-900", + "outline-amber-950", + "outline-yellow-50", + "outline-yellow-100", + "outline-yellow-200", + "outline-yellow-300", + "outline-yellow-400", + "outline-yellow-500", + "outline-yellow-600", + "outline-yellow-700", + "outline-yellow-800", + "outline-yellow-900", + "outline-yellow-950", + "outline-lime-50", + "outline-lime-100", + "outline-lime-200", + "outline-lime-300", + "outline-lime-400", + "outline-lime-500", + "outline-lime-600", + "outline-lime-700", + "outline-lime-800", + "outline-lime-900", + "outline-lime-950", + "outline-green-50", + "outline-green-100", + "outline-green-200", + "outline-green-300", + "outline-green-400", + "outline-green-500", + "outline-green-600", + "outline-green-700", + "outline-green-800", + "outline-green-900", + "outline-green-950", + "outline-emerald-50", + "outline-emerald-100", + "outline-emerald-200", + "outline-emerald-300", + "outline-emerald-400", + "outline-emerald-500", + "outline-emerald-600", + "outline-emerald-700", + "outline-emerald-800", + "outline-emerald-900", + "outline-emerald-950", + "outline-teal-50", + "outline-teal-100", + "outline-teal-200", + "outline-teal-300", + "outline-teal-400", + "outline-teal-500", + "outline-teal-600", + "outline-teal-700", + "outline-teal-800", + "outline-teal-900", + "outline-teal-950", + "outline-cyan-50", + "outline-cyan-100", + "outline-cyan-200", + "outline-cyan-300", + "outline-cyan-400", + "outline-cyan-500", + "outline-cyan-600", + "outline-cyan-700", + "outline-cyan-800", + "outline-cyan-900", + "outline-cyan-950", + "outline-sky-50", + "outline-sky-100", + "outline-sky-200", + "outline-sky-300", + "outline-sky-400", + "outline-sky-500", + "outline-sky-600", + "outline-sky-700", + "outline-sky-800", + "outline-sky-900", + "outline-sky-950", + "outline-blue-50", + "outline-blue-100", + "outline-blue-200", + "outline-blue-300", + "outline-blue-400", + "outline-blue-500", + "outline-blue-600", + "outline-blue-700", + "outline-blue-800", + "outline-blue-900", + "outline-blue-950", + "outline-indigo-50", + "outline-indigo-100", + "outline-indigo-200", + "outline-indigo-300", + "outline-indigo-400", + "outline-indigo-500", + "outline-indigo-600", + "outline-indigo-700", + "outline-indigo-800", + "outline-indigo-900", + "outline-indigo-950", + "outline-violet-50", + "outline-violet-100", + "outline-violet-200", + "outline-violet-300", + "outline-violet-400", + "outline-violet-500", + "outline-violet-600", + "outline-violet-700", + "outline-violet-800", + "outline-violet-900", + "outline-violet-950", + "outline-purple-50", + "outline-purple-100", + "outline-purple-200", + "outline-purple-300", + "outline-purple-400", + "outline-purple-500", + "outline-purple-600", + "outline-purple-700", + "outline-purple-800", + "outline-purple-900", + "outline-purple-950", + "outline-fuchsia-50", + "outline-fuchsia-100", + "outline-fuchsia-200", + "outline-fuchsia-300", + "outline-fuchsia-400", + "outline-fuchsia-500", + "outline-fuchsia-600", + "outline-fuchsia-700", + "outline-fuchsia-800", + "outline-fuchsia-900", + "outline-fuchsia-950", + "outline-pink-50", + "outline-pink-100", + "outline-pink-200", + "outline-pink-300", + "outline-pink-400", + "outline-pink-500", + "outline-pink-600", + "outline-pink-700", + "outline-pink-800", + "outline-pink-900", + "outline-pink-950", + "outline-rose-50", + "outline-rose-100", + "outline-rose-200", + "outline-rose-300", + "outline-rose-400", + "outline-rose-500", + "outline-rose-600", + "outline-rose-700", + "outline-rose-800", + "outline-rose-900", + "outline-rose-950", + "outline-none", + "outline", + "outline-dashed", + "outline-dotted", + "outline-double", + "outline-offset-0", + "outline-offset-1", + "outline-offset-2", + "outline-offset-4", + "outline-offset-8", + "ring-0", + "ring-1", + "ring-2", + "ring", + "ring-4", + "ring-8", + "ring-inset", + "ring-inherit", + "ring-current", + "ring-transparent", + "ring-black", + "ring-white", + "ring-slate-50", + "ring-slate-100", + "ring-slate-200", + "ring-slate-300", + "ring-slate-400", + "ring-slate-500", + "ring-slate-600", + "ring-slate-700", + "ring-slate-800", + "ring-slate-900", + "ring-slate-950", + "ring-gray-50", + "ring-gray-100", + "ring-gray-200", + "ring-gray-300", + "ring-gray-400", + "ring-gray-500", + "ring-gray-600", + "ring-gray-700", + "ring-gray-800", + "ring-gray-900", + "ring-gray-950", + "ring-zinc-50", + "ring-zinc-100", + "ring-zinc-200", + "ring-zinc-300", + "ring-zinc-400", + "ring-zinc-500", + "ring-zinc-600", + "ring-zinc-700", + "ring-zinc-800", + "ring-zinc-900", + "ring-zinc-950", + "ring-neutral-50", + "ring-neutral-100", + "ring-neutral-200", + "ring-neutral-300", + "ring-neutral-400", + "ring-neutral-500", + "ring-neutral-600", + "ring-neutral-700", + "ring-neutral-800", + "ring-neutral-900", + "ring-neutral-950", + "ring-stone-50", + "ring-stone-100", + "ring-stone-200", + "ring-stone-300", + "ring-stone-400", + "ring-stone-500", + "ring-stone-600", + "ring-stone-700", + "ring-stone-800", + "ring-stone-900", + "ring-stone-950", + "ring-red-50", + "ring-red-100", + "ring-red-200", + "ring-red-300", + "ring-red-400", + "ring-red-500", + "ring-red-600", + "ring-red-700", + "ring-red-800", + "ring-red-900", + "ring-red-950", + "ring-orange-50", + "ring-orange-100", + "ring-orange-200", + "ring-orange-300", + "ring-orange-400", + "ring-orange-500", + "ring-orange-600", + "ring-orange-700", + "ring-orange-800", + "ring-orange-900", + "ring-orange-950", + "ring-amber-50", + "ring-amber-100", + "ring-amber-200", + "ring-amber-300", + "ring-amber-400", + "ring-amber-500", + "ring-amber-600", + "ring-amber-700", + "ring-amber-800", + "ring-amber-900", + "ring-amber-950", + "ring-yellow-50", + "ring-yellow-100", + "ring-yellow-200", + "ring-yellow-300", + "ring-yellow-400", + "ring-yellow-500", + "ring-yellow-600", + "ring-yellow-700", + "ring-yellow-800", + "ring-yellow-900", + "ring-yellow-950", + "ring-lime-50", + "ring-lime-100", + "ring-lime-200", + "ring-lime-300", + "ring-lime-400", + "ring-lime-500", + "ring-lime-600", + "ring-lime-700", + "ring-lime-800", + "ring-lime-900", + "ring-lime-950", + "ring-green-50", + "ring-green-100", + "ring-green-200", + "ring-green-300", + "ring-green-400", + "ring-green-500", + "ring-green-600", + "ring-green-700", + "ring-green-800", + "ring-green-900", + "ring-green-950", + "ring-emerald-50", + "ring-emerald-100", + "ring-emerald-200", + "ring-emerald-300", + "ring-emerald-400", + "ring-emerald-500", + "ring-emerald-600", + "ring-emerald-700", + "ring-emerald-800", + "ring-emerald-900", + "ring-emerald-950", + "ring-teal-50", + "ring-teal-100", + "ring-teal-200", + "ring-teal-300", + "ring-teal-400", + "ring-teal-500", + "ring-teal-600", + "ring-teal-700", + "ring-teal-800", + "ring-teal-900", + "ring-teal-950", + "ring-cyan-50", + "ring-cyan-100", + "ring-cyan-200", + "ring-cyan-300", + "ring-cyan-400", + "ring-cyan-500", + "ring-cyan-600", + "ring-cyan-700", + "ring-cyan-800", + "ring-cyan-900", + "ring-cyan-950", + "ring-sky-50", + "ring-sky-100", + "ring-sky-200", + "ring-sky-300", + "ring-sky-400", + "ring-sky-500", + "ring-sky-600", + "ring-sky-700", + "ring-sky-800", + "ring-sky-900", + "ring-sky-950", + "ring-blue-50", + "ring-blue-100", + "ring-blue-200", + "ring-blue-300", + "ring-blue-400", + "ring-blue-500", + "ring-blue-600", + "ring-blue-700", + "ring-blue-800", + "ring-blue-900", + "ring-blue-950", + "ring-indigo-50", + "ring-indigo-100", + "ring-indigo-200", + "ring-indigo-300", + "ring-indigo-400", + "ring-indigo-500", + "ring-indigo-600", + "ring-indigo-700", + "ring-indigo-800", + "ring-indigo-900", + "ring-indigo-950", + "ring-violet-50", + "ring-violet-100", + "ring-violet-200", + "ring-violet-300", + "ring-violet-400", + "ring-violet-500", + "ring-violet-600", + "ring-violet-700", + "ring-violet-800", + "ring-violet-900", + "ring-violet-950", + "ring-purple-50", + "ring-purple-100", + "ring-purple-200", + "ring-purple-300", + "ring-purple-400", + "ring-purple-500", + "ring-purple-600", + "ring-purple-700", + "ring-purple-800", + "ring-purple-900", + "ring-purple-950", + "ring-fuchsia-50", + "ring-fuchsia-100", + "ring-fuchsia-200", + "ring-fuchsia-300", + "ring-fuchsia-400", + "ring-fuchsia-500", + "ring-fuchsia-600", + "ring-fuchsia-700", + "ring-fuchsia-800", + "ring-fuchsia-900", + "ring-fuchsia-950", + "ring-pink-50", + "ring-pink-100", + "ring-pink-200", + "ring-pink-300", + "ring-pink-400", + "ring-pink-500", + "ring-pink-600", + "ring-pink-700", + "ring-pink-800", + "ring-pink-900", + "ring-pink-950", + "ring-rose-50", + "ring-rose-100", + "ring-rose-200", + "ring-rose-300", + "ring-rose-400", + "ring-rose-500", + "ring-rose-600", + "ring-rose-700", + "ring-rose-800", + "ring-rose-900", + "ring-rose-950", + "ring-offset-0", + "ring-offset-1", + "ring-offset-2", + "ring-offset-4", + "ring-offset-8", + "ring-offset-inherit", + "ring-offset-current", + "ring-offset-transparent", + "ring-offset-black", + "ring-offset-white", + "ring-offset-slate-50", + "ring-offset-slate-100", + "ring-offset-slate-200", + "ring-offset-slate-300", + "ring-offset-slate-400", + "ring-offset-slate-500", + "ring-offset-slate-600", + "ring-offset-slate-700", + "ring-offset-slate-800", + "ring-offset-slate-900", + "ring-offset-slate-950", + "ring-offset-gray-50", + "ring-offset-gray-100", + "ring-offset-gray-200", + "ring-offset-gray-300", + "ring-offset-gray-400", + "ring-offset-gray-500", + "ring-offset-gray-600", + "ring-offset-gray-700", + "ring-offset-gray-800", + "ring-offset-gray-900", + "ring-offset-gray-950", + "ring-offset-zinc-50", + "ring-offset-zinc-100", + "ring-offset-zinc-200", + "ring-offset-zinc-300", + "ring-offset-zinc-400", + "ring-offset-zinc-500", + "ring-offset-zinc-600", + "ring-offset-zinc-700", + "ring-offset-zinc-800", + "ring-offset-zinc-900", + "ring-offset-zinc-950", + "ring-offset-neutral-50", + "ring-offset-neutral-100", + "ring-offset-neutral-200", + "ring-offset-neutral-300", + "ring-offset-neutral-400", + "ring-offset-neutral-500", + "ring-offset-neutral-600", + "ring-offset-neutral-700", + "ring-offset-neutral-800", + "ring-offset-neutral-900", + "ring-offset-neutral-950", + "ring-offset-stone-50", + "ring-offset-stone-100", + "ring-offset-stone-200", + "ring-offset-stone-300", + "ring-offset-stone-400", + "ring-offset-stone-500", + "ring-offset-stone-600", + "ring-offset-stone-700", + "ring-offset-stone-800", + "ring-offset-stone-900", + "ring-offset-stone-950", + "ring-offset-red-50", + "ring-offset-red-100", + "ring-offset-red-200", + "ring-offset-red-300", + "ring-offset-red-400", + "ring-offset-red-500", + "ring-offset-red-600", + "ring-offset-red-700", + "ring-offset-red-800", + "ring-offset-red-900", + "ring-offset-red-950", + "ring-offset-orange-50", + "ring-offset-orange-100", + "ring-offset-orange-200", + "ring-offset-orange-300", + "ring-offset-orange-400", + "ring-offset-orange-500", + "ring-offset-orange-600", + "ring-offset-orange-700", + "ring-offset-orange-800", + "ring-offset-orange-900", + "ring-offset-orange-950", + "ring-offset-amber-50", + "ring-offset-amber-100", + "ring-offset-amber-200", + "ring-offset-amber-300", + "ring-offset-amber-400", + "ring-offset-amber-500", + "ring-offset-amber-600", + "ring-offset-amber-700", + "ring-offset-amber-800", + "ring-offset-amber-900", + "ring-offset-amber-950", + "ring-offset-yellow-50", + "ring-offset-yellow-100", + "ring-offset-yellow-200", + "ring-offset-yellow-300", + "ring-offset-yellow-400", + "ring-offset-yellow-500", + "ring-offset-yellow-600", + "ring-offset-yellow-700", + "ring-offset-yellow-800", + "ring-offset-yellow-900", + "ring-offset-yellow-950", + "ring-offset-lime-50", + "ring-offset-lime-100", + "ring-offset-lime-200", + "ring-offset-lime-300", + "ring-offset-lime-400", + "ring-offset-lime-500", + "ring-offset-lime-600", + "ring-offset-lime-700", + "ring-offset-lime-800", + "ring-offset-lime-900", + "ring-offset-lime-950", + "ring-offset-green-50", + "ring-offset-green-100", + "ring-offset-green-200", + "ring-offset-green-300", + "ring-offset-green-400", + "ring-offset-green-500", + "ring-offset-green-600", + "ring-offset-green-700", + "ring-offset-green-800", + "ring-offset-green-900", + "ring-offset-green-950", + "ring-offset-emerald-50", + "ring-offset-emerald-100", + "ring-offset-emerald-200", + "ring-offset-emerald-300", + "ring-offset-emerald-400", + "ring-offset-emerald-500", + "ring-offset-emerald-600", + "ring-offset-emerald-700", + "ring-offset-emerald-800", + "ring-offset-emerald-900", + "ring-offset-emerald-950", + "ring-offset-teal-50", + "ring-offset-teal-100", + "ring-offset-teal-200", + "ring-offset-teal-300", + "ring-offset-teal-400", + "ring-offset-teal-500", + "ring-offset-teal-600", + "ring-offset-teal-700", + "ring-offset-teal-800", + "ring-offset-teal-900", + "ring-offset-teal-950", + "ring-offset-cyan-50", + "ring-offset-cyan-100", + "ring-offset-cyan-200", + "ring-offset-cyan-300", + "ring-offset-cyan-400", + "ring-offset-cyan-500", + "ring-offset-cyan-600", + "ring-offset-cyan-700", + "ring-offset-cyan-800", + "ring-offset-cyan-900", + "ring-offset-cyan-950", + "ring-offset-sky-50", + "ring-offset-sky-100", + "ring-offset-sky-200", + "ring-offset-sky-300", + "ring-offset-sky-400", + "ring-offset-sky-500", + "ring-offset-sky-600", + "ring-offset-sky-700", + "ring-offset-sky-800", + "ring-offset-sky-900", + "ring-offset-sky-950", + "ring-offset-blue-50", + "ring-offset-blue-100", + "ring-offset-blue-200", + "ring-offset-blue-300", + "ring-offset-blue-400", + "ring-offset-blue-500", + "ring-offset-blue-600", + "ring-offset-blue-700", + "ring-offset-blue-800", + "ring-offset-blue-900", + "ring-offset-blue-950", + "ring-offset-indigo-50", + "ring-offset-indigo-100", + "ring-offset-indigo-200", + "ring-offset-indigo-300", + "ring-offset-indigo-400", + "ring-offset-indigo-500", + "ring-offset-indigo-600", + "ring-offset-indigo-700", + "ring-offset-indigo-800", + "ring-offset-indigo-900", + "ring-offset-indigo-950", + "ring-offset-violet-50", + "ring-offset-violet-100", + "ring-offset-violet-200", + "ring-offset-violet-300", + "ring-offset-violet-400", + "ring-offset-violet-500", + "ring-offset-violet-600", + "ring-offset-violet-700", + "ring-offset-violet-800", + "ring-offset-violet-900", + "ring-offset-violet-950", + "ring-offset-purple-50", + "ring-offset-purple-100", + "ring-offset-purple-200", + "ring-offset-purple-300", + "ring-offset-purple-400", + "ring-offset-purple-500", + "ring-offset-purple-600", + "ring-offset-purple-700", + "ring-offset-purple-800", + "ring-offset-purple-900", + "ring-offset-purple-950", + "ring-offset-fuchsia-50", + "ring-offset-fuchsia-100", + "ring-offset-fuchsia-200", + "ring-offset-fuchsia-300", + "ring-offset-fuchsia-400", + "ring-offset-fuchsia-500", + "ring-offset-fuchsia-600", + "ring-offset-fuchsia-700", + "ring-offset-fuchsia-800", + "ring-offset-fuchsia-900", + "ring-offset-fuchsia-950", + "ring-offset-pink-50", + "ring-offset-pink-100", + "ring-offset-pink-200", + "ring-offset-pink-300", + "ring-offset-pink-400", + "ring-offset-pink-500", + "ring-offset-pink-600", + "ring-offset-pink-700", + "ring-offset-pink-800", + "ring-offset-pink-900", + "ring-offset-pink-950", + "ring-offset-rose-50", + "ring-offset-rose-100", + "ring-offset-rose-200", + "ring-offset-rose-300", + "ring-offset-rose-400", + "ring-offset-rose-500", + "ring-offset-rose-600", + "ring-offset-rose-700", + "ring-offset-rose-800", + "ring-offset-rose-900", + "ring-offset-rose-950", + "shadow-sm", + "shadow", + "shadow-md", + "shadow-lg", + "shadow-xl", + "shadow-2xl", + "shadow-inner", + "shadow-none", + "shadow-inherit", + "shadow-current", + "shadow-transparent", + "shadow-black", + "shadow-white", + "shadow-slate-50", + "shadow-slate-100", + "shadow-slate-200", + "shadow-slate-300", + "shadow-slate-400", + "shadow-slate-500", + "shadow-slate-600", + "shadow-slate-700", + "shadow-slate-800", + "shadow-slate-900", + "shadow-slate-950", + "shadow-gray-50", + "shadow-gray-100", + "shadow-gray-200", + "shadow-gray-300", + "shadow-gray-400", + "shadow-gray-500", + "shadow-gray-600", + "shadow-gray-700", + "shadow-gray-800", + "shadow-gray-900", + "shadow-gray-950", + "shadow-zinc-50", + "shadow-zinc-100", + "shadow-zinc-200", + "shadow-zinc-300", + "shadow-zinc-400", + "shadow-zinc-500", + "shadow-zinc-600", + "shadow-zinc-700", + "shadow-zinc-800", + "shadow-zinc-900", + "shadow-zinc-950", + "shadow-neutral-50", + "shadow-neutral-100", + "shadow-neutral-200", + "shadow-neutral-300", + "shadow-neutral-400", + "shadow-neutral-500", + "shadow-neutral-600", + "shadow-neutral-700", + "shadow-neutral-800", + "shadow-neutral-900", + "shadow-neutral-950", + "shadow-stone-50", + "shadow-stone-100", + "shadow-stone-200", + "shadow-stone-300", + "shadow-stone-400", + "shadow-stone-500", + "shadow-stone-600", + "shadow-stone-700", + "shadow-stone-800", + "shadow-stone-900", + "shadow-stone-950", + "shadow-red-50", + "shadow-red-100", + "shadow-red-200", + "shadow-red-300", + "shadow-red-400", + "shadow-red-500", + "shadow-red-600", + "shadow-red-700", + "shadow-red-800", + "shadow-red-900", + "shadow-red-950", + "shadow-orange-50", + "shadow-orange-100", + "shadow-orange-200", + "shadow-orange-300", + "shadow-orange-400", + "shadow-orange-500", + "shadow-orange-600", + "shadow-orange-700", + "shadow-orange-800", + "shadow-orange-900", + "shadow-orange-950", + "shadow-amber-50", + "shadow-amber-100", + "shadow-amber-200", + "shadow-amber-300", + "shadow-amber-400", + "shadow-amber-500", + "shadow-amber-600", + "shadow-amber-700", + "shadow-amber-800", + "shadow-amber-900", + "shadow-amber-950", + "shadow-yellow-50", + "shadow-yellow-100", + "shadow-yellow-200", + "shadow-yellow-300", + "shadow-yellow-400", + "shadow-yellow-500", + "shadow-yellow-600", + "shadow-yellow-700", + "shadow-yellow-800", + "shadow-yellow-900", + "shadow-yellow-950", + "shadow-lime-50", + "shadow-lime-100", + "shadow-lime-200", + "shadow-lime-300", + "shadow-lime-400", + "shadow-lime-500", + "shadow-lime-600", + "shadow-lime-700", + "shadow-lime-800", + "shadow-lime-900", + "shadow-lime-950", + "shadow-green-50", + "shadow-green-100", + "shadow-green-200", + "shadow-green-300", + "shadow-green-400", + "shadow-green-500", + "shadow-green-600", + "shadow-green-700", + "shadow-green-800", + "shadow-green-900", + "shadow-green-950", + "shadow-emerald-50", + "shadow-emerald-100", + "shadow-emerald-200", + "shadow-emerald-300", + "shadow-emerald-400", + "shadow-emerald-500", + "shadow-emerald-600", + "shadow-emerald-700", + "shadow-emerald-800", + "shadow-emerald-900", + "shadow-emerald-950", + "shadow-teal-50", + "shadow-teal-100", + "shadow-teal-200", + "shadow-teal-300", + "shadow-teal-400", + "shadow-teal-500", + "shadow-teal-600", + "shadow-teal-700", + "shadow-teal-800", + "shadow-teal-900", + "shadow-teal-950", + "shadow-cyan-50", + "shadow-cyan-100", + "shadow-cyan-200", + "shadow-cyan-300", + "shadow-cyan-400", + "shadow-cyan-500", + "shadow-cyan-600", + "shadow-cyan-700", + "shadow-cyan-800", + "shadow-cyan-900", + "shadow-cyan-950", + "shadow-sky-50", + "shadow-sky-100", + "shadow-sky-200", + "shadow-sky-300", + "shadow-sky-400", + "shadow-sky-500", + "shadow-sky-600", + "shadow-sky-700", + "shadow-sky-800", + "shadow-sky-900", + "shadow-sky-950", + "shadow-blue-50", + "shadow-blue-100", + "shadow-blue-200", + "shadow-blue-300", + "shadow-blue-400", + "shadow-blue-500", + "shadow-blue-600", + "shadow-blue-700", + "shadow-blue-800", + "shadow-blue-900", + "shadow-blue-950", + "shadow-indigo-50", + "shadow-indigo-100", + "shadow-indigo-200", + "shadow-indigo-300", + "shadow-indigo-400", + "shadow-indigo-500", + "shadow-indigo-600", + "shadow-indigo-700", + "shadow-indigo-800", + "shadow-indigo-900", + "shadow-indigo-950", + "shadow-violet-50", + "shadow-violet-100", + "shadow-violet-200", + "shadow-violet-300", + "shadow-violet-400", + "shadow-violet-500", + "shadow-violet-600", + "shadow-violet-700", + "shadow-violet-800", + "shadow-violet-900", + "shadow-violet-950", + "shadow-purple-50", + "shadow-purple-100", + "shadow-purple-200", + "shadow-purple-300", + "shadow-purple-400", + "shadow-purple-500", + "shadow-purple-600", + "shadow-purple-700", + "shadow-purple-800", + "shadow-purple-900", + "shadow-purple-950", + "shadow-fuchsia-50", + "shadow-fuchsia-100", + "shadow-fuchsia-200", + "shadow-fuchsia-300", + "shadow-fuchsia-400", + "shadow-fuchsia-500", + "shadow-fuchsia-600", + "shadow-fuchsia-700", + "shadow-fuchsia-800", + "shadow-fuchsia-900", + "shadow-fuchsia-950", + "shadow-pink-50", + "shadow-pink-100", + "shadow-pink-200", + "shadow-pink-300", + "shadow-pink-400", + "shadow-pink-500", + "shadow-pink-600", + "shadow-pink-700", + "shadow-pink-800", + "shadow-pink-900", + "shadow-pink-950", + "shadow-rose-50", + "shadow-rose-100", + "shadow-rose-200", + "shadow-rose-300", + "shadow-rose-400", + "shadow-rose-500", + "shadow-rose-600", + "shadow-rose-700", + "shadow-rose-800", + "shadow-rose-900", + "shadow-rose-950", + "opacity-0", + "opacity-5", + "opacity-10", + "opacity-15", + "opacity-20", + "opacity-25", + "opacity-30", + "opacity-35", + "opacity-40", + "opacity-45", + "opacity-50", + "opacity-55", + "opacity-60", + "opacity-65", + "opacity-70", + "opacity-75", + "opacity-80", + "opacity-85", + "opacity-90", + "opacity-95", + "opacity-100", + "mix-blend-normal", + "mix-blend-multiply", + "mix-blend-screen", + "mix-blend-overlay", + "mix-blend-darken", + "mix-blend-lighten", + "mix-blend-color-dodge", + "mix-blend-color-burn", + "mix-blend-hard-light", + "mix-blend-soft-light", + "mix-blend-difference", + "mix-blend-exclusion", + "mix-blend-hue", + "mix-blend-saturation", + "mix-blend-color", + "mix-blend-luminosity", + "mix-blend-plus-darker", + "mix-blend-plus-lighter", + "bg-blend-normal", + "bg-blend-multiply", + "bg-blend-screen", + "bg-blend-overlay", + "bg-blend-darken", + "bg-blend-lighten", + "bg-blend-color-dodge", + "bg-blend-color-burn", + "bg-blend-hard-light", + "bg-blend-soft-light", + "bg-blend-difference", + "bg-blend-exclusion", + "bg-blend-hue", + "bg-blend-saturation", + "bg-blend-color", + "bg-blend-luminosity", + "blur-none", + "blur-sm", + "blur", + "blur-md", + "blur-lg", + "blur-xl", + "blur-2xl", + "blur-3xl", + "brightness-0", + "brightness-50", + "brightness-75", + "brightness-90", + "brightness-95", + "brightness-100", + "brightness-105", + "brightness-110", + "brightness-125", + "brightness-150", + "brightness-200", + "contrast-0", + "contrast-50", + "contrast-75", + "contrast-100", + "contrast-125", + "contrast-150", + "contrast-200", + "drop-shadow-sm", + "drop-shadow", + "drop-shadow-md", + "drop-shadow-lg", + "drop-shadow-xl", + "drop-shadow-2xl", + "drop-shadow-none", + "grayscale-0", + "grayscale", + "hue-rotate-0", + "hue-rotate-15", + "hue-rotate-30", + "hue-rotate-60", + "hue-rotate-90", + "hue-rotate-180", + "invert-0", + "invert", + "saturate-0", + "saturate-50", + "saturate-100", + "saturate-150", + "saturate-200", + "sepia-0", + "sepia", + "backdrop-blur-none", + "backdrop-blur-sm", + "backdrop-blur", + "backdrop-blur-md", + "backdrop-blur-lg", + "backdrop-blur-xl", + "backdrop-blur-2xl", + "backdrop-blur-3xl", + "backdrop-brightness-0", + "backdrop-brightness-50", + "backdrop-brightness-75", + "backdrop-brightness-90", + "backdrop-brightness-95", + "backdrop-brightness-100", + "backdrop-brightness-105", + "backdrop-brightness-110", + "backdrop-brightness-125", + "backdrop-brightness-150", + "backdrop-brightness-200", + "backdrop-contrast-0", + "backdrop-contrast-50", + "backdrop-contrast-75", + "backdrop-contrast-100", + "backdrop-contrast-125", + "backdrop-contrast-150", + "backdrop-contrast-200", + "backdrop-grayscale-0", + "backdrop-grayscale", + "backdrop-hue-rotate-0", + "backdrop-hue-rotate-15", + "backdrop-hue-rotate-30", + "backdrop-hue-rotate-60", + "backdrop-hue-rotate-90", + "backdrop-hue-rotate-180", + "backdrop-invert-0", + "backdrop-invert", + "backdrop-opacity-0", + "backdrop-opacity-5", + "backdrop-opacity-10", + "backdrop-opacity-15", + "backdrop-opacity-20", + "backdrop-opacity-25", + "backdrop-opacity-30", + "backdrop-opacity-35", + "backdrop-opacity-40", + "backdrop-opacity-45", + "backdrop-opacity-50", + "backdrop-opacity-55", + "backdrop-opacity-60", + "backdrop-opacity-65", + "backdrop-opacity-70", + "backdrop-opacity-75", + "backdrop-opacity-80", + "backdrop-opacity-85", + "backdrop-opacity-90", + "backdrop-opacity-95", + "backdrop-opacity-100", + "backdrop-saturate-0", + "backdrop-saturate-50", + "backdrop-saturate-100", + "backdrop-saturate-150", + "backdrop-saturate-200", + "backdrop-sepia-0", + "backdrop-sepia", + "border-collapse", + "border-separate", + "Indiana", + "Ohio", + "Michigan", + "Indiana", + "Ohio", + "Michigan", + "border-spacing-0", + "border-spacing-x-0", + "border-spacing-y-0", + "border-spacing-px", + "border-spacing-x-px", + "border-spacing-y-px", + "border-spacing-0.5", + "border-spacing-x-0.5", + "border-spacing-y-0.5", + "border-spacing-1", + "border-spacing-x-1", + "border-spacing-y-1", + "border-spacing-1.5", + "border-spacing-x-1.5", + "border-spacing-y-1.5", + "border-spacing-2", + "border-spacing-x-2", + "border-spacing-y-2", + "border-spacing-2.5", + "border-spacing-x-2.5", + "border-spacing-y-2.5", + "border-spacing-3", + "border-spacing-x-3", + "border-spacing-y-3", + "border-spacing-3.5", + "border-spacing-x-3.5", + "border-spacing-y-3.5", + "border-spacing-4", + "border-spacing-x-4", + "border-spacing-y-4", + "border-spacing-5", + "border-spacing-x-5", + "border-spacing-y-5", + "border-spacing-6", + "border-spacing-x-6", + "border-spacing-y-6", + "border-spacing-7", + "border-spacing-x-7", + "border-spacing-y-7", + "border-spacing-8", + "border-spacing-x-8", + "border-spacing-y-8", + "border-spacing-9", + "border-spacing-x-9", + "border-spacing-y-9", + "border-spacing-10", + "border-spacing-x-10", + "border-spacing-y-10", + "border-spacing-11", + "border-spacing-x-11", + "border-spacing-y-11", + "border-spacing-12", + "border-spacing-x-12", + "border-spacing-y-12", + "border-spacing-14", + "border-spacing-x-14", + "border-spacing-y-14", + "border-spacing-16", + "border-spacing-x-16", + "border-spacing-y-16", + "border-spacing-20", + "border-spacing-x-20", + "border-spacing-y-20", + "border-spacing-24", + "border-spacing-x-24", + "border-spacing-y-24", + "border-spacing-28", + "border-spacing-x-28", + "border-spacing-y-28", + "border-spacing-32", + "border-spacing-x-32", + "border-spacing-y-32", + "border-spacing-36", + "border-spacing-x-36", + "border-spacing-y-36", + "border-spacing-40", + "border-spacing-x-40", + "border-spacing-y-40", + "border-spacing-44", + "border-spacing-x-44", + "border-spacing-y-44", + "border-spacing-48", + "border-spacing-x-48", + "border-spacing-y-48", + "border-spacing-52", + "border-spacing-x-52", + "border-spacing-y-52", + "border-spacing-56", + "border-spacing-x-56", + "border-spacing-y-56", + "border-spacing-60", + "border-spacing-x-60", + "border-spacing-y-60", + "border-spacing-64", + "border-spacing-x-64", + "border-spacing-y-64", + "border-spacing-72", + "border-spacing-x-72", + "border-spacing-y-72", + "border-spacing-80", + "border-spacing-x-80", + "border-spacing-y-80", + "border-spacing-96", + "border-spacing-x-96", + "border-spacing-y-96", + "Indiana", + "Ohio", + "Michigan", + "table-auto", + "table-fixed", + "caption-top", + "caption-bottom", + "transition-none", + "transition-all", + "transition", + "transition-colors", + "transition-opacity", + "transition-shadow", + "transition-transform", + "duration-0", + "duration-75", + "duration-100", + "duration-150", + "duration-200", + "duration-300", + "duration-500", + "duration-700", + "duration-1000", + "ease-linear", + "ease-in", + "ease-out", + "ease-in-out", + "delay-0", + "delay-75", + "delay-100", + "delay-150", + "delay-200", + "delay-300", + "delay-500", + "delay-700", + "delay-1000", + "animate-none", + "animate-spin", + "animate-ping", + "animate-pulse", + "animate-bounce", + "scale-0", + "scale-x-0", + "scale-y-0", + "scale-50", + "scale-x-50", + "scale-y-50", + "scale-75", + "scale-x-75", + "scale-y-75", + "scale-90", + "scale-x-90", + "scale-y-90", + "scale-95", + "scale-x-95", + "scale-y-95", + "scale-100", + "scale-x-100", + "scale-y-100", + "scale-105", + "scale-x-105", + "scale-y-105", + "scale-110", + "scale-x-110", + "scale-y-110", + "scale-125", + "scale-x-125", + "scale-y-125", + "scale-150", + "scale-x-150", + "scale-y-150", + "rotate-0", + "rotate-1", + "rotate-2", + "rotate-3", + "rotate-6", + "rotate-12", + "rotate-45", + "rotate-90", + "rotate-180", + "translate-x-0", + "translate-y-0", + "translate-x-px", + "translate-y-px", + "translate-x-0.5", + "translate-y-0.5", + "translate-x-1", + "translate-y-1", + "translate-x-1.5", + "translate-y-1.5", + "translate-x-2", + "translate-y-2", + "translate-x-2.5", + "translate-y-2.5", + "translate-x-3", + "translate-y-3", + "translate-x-3.5", + "translate-y-3.5", + "translate-x-4", + "translate-y-4", + "translate-x-5", + "translate-y-5", + "translate-x-6", + "translate-y-6", + "translate-x-7", + "translate-y-7", + "translate-x-8", + "translate-y-8", + "translate-x-9", + "translate-y-9", + "translate-x-10", + "translate-y-10", + "translate-x-11", + "translate-y-11", + "translate-x-12", + "translate-y-12", + "translate-x-14", + "translate-y-14", + "translate-x-16", + "translate-y-16", + "translate-x-20", + "translate-y-20", + "translate-x-24", + "translate-y-24", + "translate-x-28", + "translate-y-28", + "translate-x-32", + "translate-y-32", + "translate-x-36", + "translate-y-36", + "translate-x-40", + "translate-y-40", + "translate-x-44", + "translate-y-44", + "translate-x-48", + "translate-y-48", + "translate-x-52", + "translate-y-52", + "translate-x-56", + "translate-y-56", + "translate-x-60", + "translate-y-60", + "translate-x-64", + "translate-y-64", + "translate-x-72", + "translate-y-72", + "translate-x-80", + "translate-y-80", + "translate-x-96", + "translate-y-96", + "translate-x-1/2", + "translate-x-1/3", + "translate-x-2/3", + "translate-x-1/4", + "translate-x-2/4", + "translate-x-3/4", + "translate-x-full", + "translate-y-1/2", + "translate-y-1/3", + "translate-y-2/3", + "translate-y-1/4", + "translate-y-2/4", + "translate-y-3/4", + "translate-y-full", + "skew-x-0", + "skew-y-0", + "skew-x-1", + "skew-y-1", + "skew-x-2", + "skew-y-2", + "skew-x-3", + "skew-y-3", + "skew-x-6", + "skew-y-6", + "skew-x-12", + "skew-y-12", + "origin-center", + "origin-top", + "origin-top-right", + "origin-right", + "origin-bottom-right", + "origin-bottom", + "origin-bottom-left", + "origin-left", + "origin-top-left", + "accent-inherit", + "accent-current", + "accent-transparent", + "accent-black", + "accent-white", + "accent-slate-50", + "accent-slate-100", + "accent-slate-200", + "accent-slate-300", + "accent-slate-400", + "accent-slate-500", + "accent-slate-600", + "accent-slate-700", + "accent-slate-800", + "accent-slate-900", + "accent-slate-950", + "accent-gray-50", + "accent-gray-100", + "accent-gray-200", + "accent-gray-300", + "accent-gray-400", + "accent-gray-500", + "accent-gray-600", + "accent-gray-700", + "accent-gray-800", + "accent-gray-900", + "accent-gray-950", + "accent-zinc-50", + "accent-zinc-100", + "accent-zinc-200", + "accent-zinc-300", + "accent-zinc-400", + "accent-zinc-500", + "accent-zinc-600", + "accent-zinc-700", + "accent-zinc-800", + "accent-zinc-900", + "accent-zinc-950", + "accent-neutral-50", + "accent-neutral-100", + "accent-neutral-200", + "accent-neutral-300", + "accent-neutral-400", + "accent-neutral-500", + "accent-neutral-600", + "accent-neutral-700", + "accent-neutral-800", + "accent-neutral-900", + "accent-neutral-950", + "accent-stone-50", + "accent-stone-100", + "accent-stone-200", + "accent-stone-300", + "accent-stone-400", + "accent-stone-500", + "accent-stone-600", + "accent-stone-700", + "accent-stone-800", + "accent-stone-900", + "accent-stone-950", + "accent-red-50", + "accent-red-100", + "accent-red-200", + "accent-red-300", + "accent-red-400", + "accent-red-500", + "accent-red-600", + "accent-red-700", + "accent-red-800", + "accent-red-900", + "accent-red-950", + "accent-orange-50", + "accent-orange-100", + "accent-orange-200", + "accent-orange-300", + "accent-orange-400", + "accent-orange-500", + "accent-orange-600", + "accent-orange-700", + "accent-orange-800", + "accent-orange-900", + "accent-orange-950", + "accent-amber-50", + "accent-amber-100", + "accent-amber-200", + "accent-amber-300", + "accent-amber-400", + "accent-amber-500", + "accent-amber-600", + "accent-amber-700", + "accent-amber-800", + "accent-amber-900", + "accent-amber-950", + "accent-yellow-50", + "accent-yellow-100", + "accent-yellow-200", + "accent-yellow-300", + "accent-yellow-400", + "accent-yellow-500", + "accent-yellow-600", + "accent-yellow-700", + "accent-yellow-800", + "accent-yellow-900", + "accent-yellow-950", + "accent-lime-50", + "accent-lime-100", + "accent-lime-200", + "accent-lime-300", + "accent-lime-400", + "accent-lime-500", + "accent-lime-600", + "accent-lime-700", + "accent-lime-800", + "accent-lime-900", + "accent-lime-950", + "accent-green-50", + "accent-green-100", + "accent-green-200", + "accent-green-300", + "accent-green-400", + "accent-green-500", + "accent-green-600", + "accent-green-700", + "accent-green-800", + "accent-green-900", + "accent-green-950", + "accent-emerald-50", + "accent-emerald-100", + "accent-emerald-200", + "accent-emerald-300", + "accent-emerald-400", + "accent-emerald-500", + "accent-emerald-600", + "accent-emerald-700", + "accent-emerald-800", + "accent-emerald-900", + "accent-emerald-950", + "accent-teal-50", + "accent-teal-100", + "accent-teal-200", + "accent-teal-300", + "accent-teal-400", + "accent-teal-500", + "accent-teal-600", + "accent-teal-700", + "accent-teal-800", + "accent-teal-900", + "accent-teal-950", + "accent-cyan-50", + "accent-cyan-100", + "accent-cyan-200", + "accent-cyan-300", + "accent-cyan-400", + "accent-cyan-500", + "accent-cyan-600", + "accent-cyan-700", + "accent-cyan-800", + "accent-cyan-900", + "accent-cyan-950", + "accent-sky-50", + "accent-sky-100", + "accent-sky-200", + "accent-sky-300", + "accent-sky-400", + "accent-sky-500", + "accent-sky-600", + "accent-sky-700", + "accent-sky-800", + "accent-sky-900", + "accent-sky-950", + "accent-blue-50", + "accent-blue-100", + "accent-blue-200", + "accent-blue-300", + "accent-blue-400", + "accent-blue-500", + "accent-blue-600", + "accent-blue-700", + "accent-blue-800", + "accent-blue-900", + "accent-blue-950", + "accent-indigo-50", + "accent-indigo-100", + "accent-indigo-200", + "accent-indigo-300", + "accent-indigo-400", + "accent-indigo-500", + "accent-indigo-600", + "accent-indigo-700", + "accent-indigo-800", + "accent-indigo-900", + "accent-indigo-950", + "accent-violet-50", + "accent-violet-100", + "accent-violet-200", + "accent-violet-300", + "accent-violet-400", + "accent-violet-500", + "accent-violet-600", + "accent-violet-700", + "accent-violet-800", + "accent-violet-900", + "accent-violet-950", + "accent-purple-50", + "accent-purple-100", + "accent-purple-200", + "accent-purple-300", + "accent-purple-400", + "accent-purple-500", + "accent-purple-600", + "accent-purple-700", + "accent-purple-800", + "accent-purple-900", + "accent-purple-950", + "accent-fuchsia-50", + "accent-fuchsia-100", + "accent-fuchsia-200", + "accent-fuchsia-300", + "accent-fuchsia-400", + "accent-fuchsia-500", + "accent-fuchsia-600", + "accent-fuchsia-700", + "accent-fuchsia-800", + "accent-fuchsia-900", + "accent-fuchsia-950", + "accent-pink-50", + "accent-pink-100", + "accent-pink-200", + "accent-pink-300", + "accent-pink-400", + "accent-pink-500", + "accent-pink-600", + "accent-pink-700", + "accent-pink-800", + "accent-pink-900", + "accent-pink-950", + "accent-rose-50", + "accent-rose-100", + "accent-rose-200", + "accent-rose-300", + "accent-rose-400", + "accent-rose-500", + "accent-rose-600", + "accent-rose-700", + "accent-rose-800", + "accent-rose-900", + "accent-rose-950", + "accent-auto", + "appearance-none", + "appearance-auto", + "cursor-auto", + "cursor-default", + "cursor-pointer", + "cursor-wait", + "cursor-text", + "cursor-move", + "cursor-help", + "cursor-not-allowed", + "cursor-none", + "cursor-context-menu", + "cursor-progress", + "cursor-cell", + "cursor-crosshair", + "cursor-vertical-text", + "cursor-alias", + "cursor-copy", + "cursor-no-drop", + "cursor-grab", + "cursor-grabbing", + "cursor-all-scroll", + "cursor-col-resize", + "cursor-row-resize", + "cursor-n-resize", + "cursor-e-resize", + "cursor-s-resize", + "cursor-w-resize", + "cursor-ne-resize", + "cursor-nw-resize", + "cursor-se-resize", + "cursor-sw-resize", + "cursor-ew-resize", + "cursor-ns-resize", + "cursor-nesw-resize", + "cursor-nwse-resize", + "cursor-zoom-in", + "cursor-zoom-out", + "caret-inherit", + "caret-current", + "caret-transparent", + "caret-black", + "caret-white", + "caret-slate-50", + "caret-slate-100", + "caret-slate-200", + "caret-slate-300", + "caret-slate-400", + "caret-slate-500", + "caret-slate-600", + "caret-slate-700", + "caret-slate-800", + "caret-slate-900", + "caret-slate-950", + "caret-gray-50", + "caret-gray-100", + "caret-gray-200", + "caret-gray-300", + "caret-gray-400", + "caret-gray-500", + "caret-gray-600", + "caret-gray-700", + "caret-gray-800", + "caret-gray-900", + "caret-gray-950", + "caret-zinc-50", + "caret-zinc-100", + "caret-zinc-200", + "caret-zinc-300", + "caret-zinc-400", + "caret-zinc-500", + "caret-zinc-600", + "caret-zinc-700", + "caret-zinc-800", + "caret-zinc-900", + "caret-zinc-950", + "caret-neutral-50", + "caret-neutral-100", + "caret-neutral-200", + "caret-neutral-300", + "caret-neutral-400", + "caret-neutral-500", + "caret-neutral-600", + "caret-neutral-700", + "caret-neutral-800", + "caret-neutral-900", + "caret-neutral-950", + "caret-stone-50", + "caret-stone-100", + "caret-stone-200", + "caret-stone-300", + "caret-stone-400", + "caret-stone-500", + "caret-stone-600", + "caret-stone-700", + "caret-stone-800", + "caret-stone-900", + "caret-stone-950", + "caret-red-50", + "caret-red-100", + "caret-red-200", + "caret-red-300", + "caret-red-400", + "caret-red-500", + "caret-red-600", + "caret-red-700", + "caret-red-800", + "caret-red-900", + "caret-red-950", + "caret-orange-50", + "caret-orange-100", + "caret-orange-200", + "caret-orange-300", + "caret-orange-400", + "caret-orange-500", + "caret-orange-600", + "caret-orange-700", + "caret-orange-800", + "caret-orange-900", + "caret-orange-950", + "caret-amber-50", + "caret-amber-100", + "caret-amber-200", + "caret-amber-300", + "caret-amber-400", + "caret-amber-500", + "caret-amber-600", + "caret-amber-700", + "caret-amber-800", + "caret-amber-900", + "caret-amber-950", + "caret-yellow-50", + "caret-yellow-100", + "caret-yellow-200", + "caret-yellow-300", + "caret-yellow-400", + "caret-yellow-500", + "caret-yellow-600", + "caret-yellow-700", + "caret-yellow-800", + "caret-yellow-900", + "caret-yellow-950", + "caret-lime-50", + "caret-lime-100", + "caret-lime-200", + "caret-lime-300", + "caret-lime-400", + "caret-lime-500", + "caret-lime-600", + "caret-lime-700", + "caret-lime-800", + "caret-lime-900", + "caret-lime-950", + "caret-green-50", + "caret-green-100", + "caret-green-200", + "caret-green-300", + "caret-green-400", + "caret-green-500", + "caret-green-600", + "caret-green-700", + "caret-green-800", + "caret-green-900", + "caret-green-950", + "caret-emerald-50", + "caret-emerald-100", + "caret-emerald-200", + "caret-emerald-300", + "caret-emerald-400", + "caret-emerald-500", + "caret-emerald-600", + "caret-emerald-700", + "caret-emerald-800", + "caret-emerald-900", + "caret-emerald-950", + "caret-teal-50", + "caret-teal-100", + "caret-teal-200", + "caret-teal-300", + "caret-teal-400", + "caret-teal-500", + "caret-teal-600", + "caret-teal-700", + "caret-teal-800", + "caret-teal-900", + "caret-teal-950", + "caret-cyan-50", + "caret-cyan-100", + "caret-cyan-200", + "caret-cyan-300", + "caret-cyan-400", + "caret-cyan-500", + "caret-cyan-600", + "caret-cyan-700", + "caret-cyan-800", + "caret-cyan-900", + "caret-cyan-950", + "caret-sky-50", + "caret-sky-100", + "caret-sky-200", + "caret-sky-300", + "caret-sky-400", + "caret-sky-500", + "caret-sky-600", + "caret-sky-700", + "caret-sky-800", + "caret-sky-900", + "caret-sky-950", + "caret-blue-50", + "caret-blue-100", + "caret-blue-200", + "caret-blue-300", + "caret-blue-400", + "caret-blue-500", + "caret-blue-600", + "caret-blue-700", + "caret-blue-800", + "caret-blue-900", + "caret-blue-950", + "caret-indigo-50", + "caret-indigo-100", + "caret-indigo-200", + "caret-indigo-300", + "caret-indigo-400", + "caret-indigo-500", + "caret-indigo-600", + "caret-indigo-700", + "caret-indigo-800", + "caret-indigo-900", + "caret-indigo-950", + "caret-violet-50", + "caret-violet-100", + "caret-violet-200", + "caret-violet-300", + "caret-violet-400", + "caret-violet-500", + "caret-violet-600", + "caret-violet-700", + "caret-violet-800", + "caret-violet-900", + "caret-violet-950", + "caret-purple-50", + "caret-purple-100", + "caret-purple-200", + "caret-purple-300", + "caret-purple-400", + "caret-purple-500", + "caret-purple-600", + "caret-purple-700", + "caret-purple-800", + "caret-purple-900", + "caret-purple-950", + "caret-fuchsia-50", + "caret-fuchsia-100", + "caret-fuchsia-200", + "caret-fuchsia-300", + "caret-fuchsia-400", + "caret-fuchsia-500", + "caret-fuchsia-600", + "caret-fuchsia-700", + "caret-fuchsia-800", + "caret-fuchsia-900", + "caret-fuchsia-950", + "caret-pink-50", + "caret-pink-100", + "caret-pink-200", + "caret-pink-300", + "caret-pink-400", + "caret-pink-500", + "caret-pink-600", + "caret-pink-700", + "caret-pink-800", + "caret-pink-900", + "caret-pink-950", + "caret-rose-50", + "caret-rose-100", + "caret-rose-200", + "caret-rose-300", + "caret-rose-400", + "caret-rose-500", + "caret-rose-600", + "caret-rose-700", + "caret-rose-800", + "caret-rose-900", + "caret-rose-950", + "pointer-events-none", + "pointer-events-auto", + "resize-none", + "resize-y", + "resize-x", + "resize", + "scroll-auto", + "scroll-smooth", + "scroll-m-0", + "scroll-mx-0", + "scroll-my-0", + "scroll-ms-0", + "scroll-me-0", + "scroll-mt-0", + "scroll-mr-0", + "scroll-mb-0", + "scroll-ml-0", + "scroll-m-px", + "scroll-mx-px", + "scroll-my-px", + "scroll-ms-px", + "scroll-me-px", + "scroll-mt-px", + "scroll-mr-px", + "scroll-mb-px", + "scroll-ml-px", + "scroll-m-0.5", + "scroll-mx-0.5", + "scroll-my-0.5", + "scroll-ms-0.5", + "scroll-me-0.5", + "scroll-mt-0.5", + "scroll-mr-0.5", + "scroll-mb-0.5", + "scroll-ml-0.5", + "scroll-m-1", + "scroll-mx-1", + "scroll-my-1", + "scroll-ms-1", + "scroll-me-1", + "scroll-mt-1", + "scroll-mr-1", + "scroll-mb-1", + "scroll-ml-1", + "scroll-m-1.5", + "scroll-mx-1.5", + "scroll-my-1.5", + "scroll-ms-1.5", + "scroll-me-1.5", + "scroll-mt-1.5", + "scroll-mr-1.5", + "scroll-mb-1.5", + "scroll-ml-1.5", + "scroll-m-2", + "scroll-mx-2", + "scroll-my-2", + "scroll-ms-2", + "scroll-me-2", + "scroll-mt-2", + "scroll-mr-2", + "scroll-mb-2", + "scroll-ml-2", + "scroll-m-2.5", + "scroll-mx-2.5", + "scroll-my-2.5", + "scroll-ms-2.5", + "scroll-me-2.5", + "scroll-mt-2.5", + "scroll-mr-2.5", + "scroll-mb-2.5", + "scroll-ml-2.5", + "scroll-m-3", + "scroll-mx-3", + "scroll-my-3", + "scroll-ms-3", + "scroll-me-3", + "scroll-mt-3", + "scroll-mr-3", + "scroll-mb-3", + "scroll-ml-3", + "scroll-m-3.5", + "scroll-mx-3.5", + "scroll-my-3.5", + "scroll-ms-3.5", + "scroll-me-3.5", + "scroll-mt-3.5", + "scroll-mr-3.5", + "scroll-mb-3.5", + "scroll-ml-3.5", + "scroll-m-4", + "scroll-mx-4", + "scroll-my-4", + "scroll-ms-4", + "scroll-me-4", + "scroll-mt-4", + "scroll-mr-4", + "scroll-mb-4", + "scroll-ml-4", + "scroll-m-5", + "scroll-mx-5", + "scroll-my-5", + "scroll-ms-5", + "scroll-me-5", + "scroll-mt-5", + "scroll-mr-5", + "scroll-mb-5", + "scroll-ml-5", + "scroll-m-6", + "scroll-mx-6", + "scroll-my-6", + "scroll-ms-6", + "scroll-me-6", + "scroll-mt-6", + "scroll-mr-6", + "scroll-mb-6", + "scroll-ml-6", + "scroll-m-7", + "scroll-mx-7", + "scroll-my-7", + "scroll-ms-7", + "scroll-me-7", + "scroll-mt-7", + "scroll-mr-7", + "scroll-mb-7", + "scroll-ml-7", + "scroll-m-8", + "scroll-mx-8", + "scroll-my-8", + "scroll-ms-8", + "scroll-me-8", + "scroll-mt-8", + "scroll-mr-8", + "scroll-mb-8", + "scroll-ml-8", + "scroll-m-9", + "scroll-mx-9", + "scroll-my-9", + "scroll-ms-9", + "scroll-me-9", + "scroll-mt-9", + "scroll-mr-9", + "scroll-mb-9", + "scroll-ml-9", + "scroll-m-10", + "scroll-mx-10", + "scroll-my-10", + "scroll-ms-10", + "scroll-me-10", + "scroll-mt-10", + "scroll-mr-10", + "scroll-mb-10", + "scroll-ml-10", + "scroll-m-11", + "scroll-mx-11", + "scroll-my-11", + "scroll-ms-11", + "scroll-me-11", + "scroll-mt-11", + "scroll-mr-11", + "scroll-mb-11", + "scroll-ml-11", + "scroll-m-12", + "scroll-mx-12", + "scroll-my-12", + "scroll-ms-12", + "scroll-me-12", + "scroll-mt-12", + "scroll-mr-12", + "scroll-mb-12", + "scroll-ml-12", + "scroll-m-14", + "scroll-mx-14", + "scroll-my-14", + "scroll-ms-14", + "scroll-me-14", + "scroll-mt-14", + "scroll-mr-14", + "scroll-mb-14", + "scroll-ml-14", + "scroll-m-16", + "scroll-mx-16", + "scroll-my-16", + "scroll-ms-16", + "scroll-me-16", + "scroll-mt-16", + "scroll-mr-16", + "scroll-mb-16", + "scroll-ml-16", + "scroll-m-20", + "scroll-mx-20", + "scroll-my-20", + "scroll-ms-20", + "scroll-me-20", + "scroll-mt-20", + "scroll-mr-20", + "scroll-mb-20", + "scroll-ml-20", + "scroll-m-24", + "scroll-mx-24", + "scroll-my-24", + "scroll-ms-24", + "scroll-me-24", + "scroll-mt-24", + "scroll-mr-24", + "scroll-mb-24", + "scroll-ml-24", + "scroll-m-28", + "scroll-mx-28", + "scroll-my-28", + "scroll-ms-28", + "scroll-me-28", + "scroll-mt-28", + "scroll-mr-28", + "scroll-mb-28", + "scroll-ml-28", + "scroll-m-32", + "scroll-mx-32", + "scroll-my-32", + "scroll-ms-32", + "scroll-me-32", + "scroll-mt-32", + "scroll-mr-32", + "scroll-mb-32", + "scroll-ml-32", + "scroll-m-36", + "scroll-mx-36", + "scroll-my-36", + "scroll-ms-36", + "scroll-me-36", + "scroll-mt-36", + "scroll-mr-36", + "scroll-mb-36", + "scroll-ml-36", + "scroll-m-40", + "scroll-mx-40", + "scroll-my-40", + "scroll-ms-40", + "scroll-me-40", + "scroll-mt-40", + "scroll-mr-40", + "scroll-mb-40", + "scroll-ml-40", + "scroll-m-44", + "scroll-mx-44", + "scroll-my-44", + "scroll-ms-44", + "scroll-me-44", + "scroll-mt-44", + "scroll-mr-44", + "scroll-mb-44", + "scroll-ml-44", + "scroll-m-48", + "scroll-mx-48", + "scroll-my-48", + "scroll-ms-48", + "scroll-me-48", + "scroll-mt-48", + "scroll-mr-48", + "scroll-mb-48", + "scroll-ml-48", + "scroll-m-52", + "scroll-mx-52", + "scroll-my-52", + "scroll-ms-52", + "scroll-me-52", + "scroll-mt-52", + "scroll-mr-52", + "scroll-mb-52", + "scroll-ml-52", + "scroll-m-56", + "scroll-mx-56", + "scroll-my-56", + "scroll-ms-56", + "scroll-me-56", + "scroll-mt-56", + "scroll-mr-56", + "scroll-mb-56", + "scroll-ml-56", + "scroll-m-60", + "scroll-mx-60", + "scroll-my-60", + "scroll-ms-60", + "scroll-me-60", + "scroll-mt-60", + "scroll-mr-60", + "scroll-mb-60", + "scroll-ml-60", + "scroll-m-64", + "scroll-mx-64", + "scroll-my-64", + "scroll-ms-64", + "scroll-me-64", + "scroll-mt-64", + "scroll-mr-64", + "scroll-mb-64", + "scroll-ml-64", + "scroll-m-72", + "scroll-mx-72", + "scroll-my-72", + "scroll-ms-72", + "scroll-me-72", + "scroll-mt-72", + "scroll-mr-72", + "scroll-mb-72", + "scroll-ml-72", + "scroll-m-80", + "scroll-mx-80", + "scroll-my-80", + "scroll-ms-80", + "scroll-me-80", + "scroll-mt-80", + "scroll-mr-80", + "scroll-mb-80", + "scroll-ml-80", + "scroll-m-96", + "scroll-mx-96", + "scroll-my-96", + "scroll-ms-96", + "scroll-me-96", + "scroll-mt-96", + "scroll-mr-96", + "scroll-mb-96", + "scroll-ml-96", + "scroll-p-0", + "scroll-px-0", + "scroll-py-0", + "scroll-ps-0", + "scroll-pe-0", + "scroll-pt-0", + "scroll-pr-0", + "scroll-pb-0", + "scroll-pl-0", + "scroll-p-px", + "scroll-px-px", + "scroll-py-px", + "scroll-ps-px", + "scroll-pe-px", + "scroll-pt-px", + "scroll-pr-px", + "scroll-pb-px", + "scroll-pl-px", + "scroll-p-0.5", + "scroll-px-0.5", + "scroll-py-0.5", + "scroll-ps-0.5", + "scroll-pe-0.5", + "scroll-pt-0.5", + "scroll-pr-0.5", + "scroll-pb-0.5", + "scroll-pl-0.5", + "scroll-p-1", + "scroll-px-1", + "scroll-py-1", + "scroll-ps-1", + "scroll-pe-1", + "scroll-pt-1", + "scroll-pr-1", + "scroll-pb-1", + "scroll-pl-1", + "scroll-p-1.5", + "scroll-px-1.5", + "scroll-py-1.5", + "scroll-ps-1.5", + "scroll-pe-1.5", + "scroll-pt-1.5", + "scroll-pr-1.5", + "scroll-pb-1.5", + "scroll-pl-1.5", + "scroll-p-2", + "scroll-px-2", + "scroll-py-2", + "scroll-ps-2", + "scroll-pe-2", + "scroll-pt-2", + "scroll-pr-2", + "scroll-pb-2", + "scroll-pl-2", + "scroll-p-2.5", + "scroll-px-2.5", + "scroll-py-2.5", + "scroll-ps-2.5", + "scroll-pe-2.5", + "scroll-pt-2.5", + "scroll-pr-2.5", + "scroll-pb-2.5", + "scroll-pl-2.5", + "scroll-p-3", + "scroll-px-3", + "scroll-py-3", + "scroll-ps-3", + "scroll-pe-3", + "scroll-pt-3", + "scroll-pr-3", + "scroll-pb-3", + "scroll-pl-3", + "scroll-p-3.5", + "scroll-px-3.5", + "scroll-py-3.5", + "scroll-ps-3.5", + "scroll-pe-3.5", + "scroll-pt-3.5", + "scroll-pr-3.5", + "scroll-pb-3.5", + "scroll-pl-3.5", + "scroll-p-4", + "scroll-px-4", + "scroll-py-4", + "scroll-ps-4", + "scroll-pe-4", + "scroll-pt-4", + "scroll-pr-4", + "scroll-pb-4", + "scroll-pl-4", + "scroll-p-5", + "scroll-px-5", + "scroll-py-5", + "scroll-ps-5", + "scroll-pe-5", + "scroll-pt-5", + "scroll-pr-5", + "scroll-pb-5", + "scroll-pl-5", + "scroll-p-6", + "scroll-px-6", + "scroll-py-6", + "scroll-ps-6", + "scroll-pe-6", + "scroll-pt-6", + "scroll-pr-6", + "scroll-pb-6", + "scroll-pl-6", + "scroll-p-7", + "scroll-px-7", + "scroll-py-7", + "scroll-ps-7", + "scroll-pe-7", + "scroll-pt-7", + "scroll-pr-7", + "scroll-pb-7", + "scroll-pl-7", + "scroll-p-8", + "scroll-px-8", + "scroll-py-8", + "scroll-ps-8", + "scroll-pe-8", + "scroll-pt-8", + "scroll-pr-8", + "scroll-pb-8", + "scroll-pl-8", + "scroll-p-9", + "scroll-px-9", + "scroll-py-9", + "scroll-ps-9", + "scroll-pe-9", + "scroll-pt-9", + "scroll-pr-9", + "scroll-pb-9", + "scroll-pl-9", + "scroll-p-10", + "scroll-px-10", + "scroll-py-10", + "scroll-ps-10", + "scroll-pe-10", + "scroll-pt-10", + "scroll-pr-10", + "scroll-pb-10", + "scroll-pl-10", + "scroll-p-11", + "scroll-px-11", + "scroll-py-11", + "scroll-ps-11", + "scroll-pe-11", + "scroll-pt-11", + "scroll-pr-11", + "scroll-pb-11", + "scroll-pl-11", + "scroll-p-12", + "scroll-px-12", + "scroll-py-12", + "scroll-ps-12", + "scroll-pe-12", + "scroll-pt-12", + "scroll-pr-12", + "scroll-pb-12", + "scroll-pl-12", + "scroll-p-14", + "scroll-px-14", + "scroll-py-14", + "scroll-ps-14", + "scroll-pe-14", + "scroll-pt-14", + "scroll-pr-14", + "scroll-pb-14", + "scroll-pl-14", + "scroll-p-16", + "scroll-px-16", + "scroll-py-16", + "scroll-ps-16", + "scroll-pe-16", + "scroll-pt-16", + "scroll-pr-16", + "scroll-pb-16", + "scroll-pl-16", + "scroll-p-20", + "scroll-px-20", + "scroll-py-20", + "scroll-ps-20", + "scroll-pe-20", + "scroll-pt-20", + "scroll-pr-20", + "scroll-pb-20", + "scroll-pl-20", + "scroll-p-24", + "scroll-px-24", + "scroll-py-24", + "scroll-ps-24", + "scroll-pe-24", + "scroll-pt-24", + "scroll-pr-24", + "scroll-pb-24", + "scroll-pl-24", + "scroll-p-28", + "scroll-px-28", + "scroll-py-28", + "scroll-ps-28", + "scroll-pe-28", + "scroll-pt-28", + "scroll-pr-28", + "scroll-pb-28", + "scroll-pl-28", + "scroll-p-32", + "scroll-px-32", + "scroll-py-32", + "scroll-ps-32", + "scroll-pe-32", + "scroll-pt-32", + "scroll-pr-32", + "scroll-pb-32", + "scroll-pl-32", + "scroll-p-36", + "scroll-px-36", + "scroll-py-36", + "scroll-ps-36", + "scroll-pe-36", + "scroll-pt-36", + "scroll-pr-36", + "scroll-pb-36", + "scroll-pl-36", + "scroll-p-40", + "scroll-px-40", + "scroll-py-40", + "scroll-ps-40", + "scroll-pe-40", + "scroll-pt-40", + "scroll-pr-40", + "scroll-pb-40", + "scroll-pl-40", + "scroll-p-44", + "scroll-px-44", + "scroll-py-44", + "scroll-ps-44", + "scroll-pe-44", + "scroll-pt-44", + "scroll-pr-44", + "scroll-pb-44", + "scroll-pl-44", + "scroll-p-48", + "scroll-px-48", + "scroll-py-48", + "scroll-ps-48", + "scroll-pe-48", + "scroll-pt-48", + "scroll-pr-48", + "scroll-pb-48", + "scroll-pl-48", + "scroll-p-52", + "scroll-px-52", + "scroll-py-52", + "scroll-ps-52", + "scroll-pe-52", + "scroll-pt-52", + "scroll-pr-52", + "scroll-pb-52", + "scroll-pl-52", + "scroll-p-56", + "scroll-px-56", + "scroll-py-56", + "scroll-ps-56", + "scroll-pe-56", + "scroll-pt-56", + "scroll-pr-56", + "scroll-pb-56", + "scroll-pl-56", + "scroll-p-60", + "scroll-px-60", + "scroll-py-60", + "scroll-ps-60", + "scroll-pe-60", + "scroll-pt-60", + "scroll-pr-60", + "scroll-pb-60", + "scroll-pl-60", + "scroll-p-64", + "scroll-px-64", + "scroll-py-64", + "scroll-ps-64", + "scroll-pe-64", + "scroll-pt-64", + "scroll-pr-64", + "scroll-pb-64", + "scroll-pl-64", + "scroll-p-72", + "scroll-px-72", + "scroll-py-72", + "scroll-ps-72", + "scroll-pe-72", + "scroll-pt-72", + "scroll-pr-72", + "scroll-pb-72", + "scroll-pl-72", + "scroll-p-80", + "scroll-px-80", + "scroll-py-80", + "scroll-ps-80", + "scroll-pe-80", + "scroll-pt-80", + "scroll-pr-80", + "scroll-pb-80", + "scroll-pl-80", + "scroll-p-96", + "scroll-px-96", + "scroll-py-96", + "scroll-ps-96", + "scroll-pe-96", + "scroll-pt-96", + "scroll-pr-96", + "scroll-pb-96", + "scroll-pl-96", + "snap-start", + "snap-end", + "snap-center", + "snap-align-none", + "snap-normal", + "snap-always", + "snap-none", + "snap-x", + "snap-y", + "snap-both", + "snap-mandatory", + "snap-proximity", + "touch-auto", + "touch-none", + "touch-pan-x", + "touch-pan-left", + "touch-pan-right", + "touch-pan-y", + "touch-pan-up", + "touch-pan-down", + "touch-pinch-zoom", + "touch-manipulation", + "select-none", + "select-text", + "select-all", + "select-auto", + "will-change-auto", + "will-change-scroll", + "will-change-contents", + "will-change-transform", + "fill-none", + "fill-inherit", + "fill-current", + "fill-transparent", + "fill-black", + "fill-white", + "fill-slate-50", + "fill-slate-100", + "fill-slate-200", + "fill-slate-300", + "fill-slate-400", + "fill-slate-500", + "fill-slate-600", + "fill-slate-700", + "fill-slate-800", + "fill-slate-900", + "fill-slate-950", + "fill-gray-50", + "fill-gray-100", + "fill-gray-200", + "fill-gray-300", + "fill-gray-400", + "fill-gray-500", + "fill-gray-600", + "fill-gray-700", + "fill-gray-800", + "fill-gray-900", + "fill-gray-950", + "fill-zinc-50", + "fill-zinc-100", + "fill-zinc-200", + "fill-zinc-300", + "fill-zinc-400", + "fill-zinc-500", + "fill-zinc-600", + "fill-zinc-700", + "fill-zinc-800", + "fill-zinc-900", + "fill-zinc-950", + "fill-neutral-50", + "fill-neutral-100", + "fill-neutral-200", + "fill-neutral-300", + "fill-neutral-400", + "fill-neutral-500", + "fill-neutral-600", + "fill-neutral-700", + "fill-neutral-800", + "fill-neutral-900", + "fill-neutral-950", + "fill-stone-50", + "fill-stone-100", + "fill-stone-200", + "fill-stone-300", + "fill-stone-400", + "fill-stone-500", + "fill-stone-600", + "fill-stone-700", + "fill-stone-800", + "fill-stone-900", + "fill-stone-950", + "fill-red-50", + "fill-red-100", + "fill-red-200", + "fill-red-300", + "fill-red-400", + "fill-red-500", + "fill-red-600", + "fill-red-700", + "fill-red-800", + "fill-red-900", + "fill-red-950", + "fill-orange-50", + "fill-orange-100", + "fill-orange-200", + "fill-orange-300", + "fill-orange-400", + "fill-orange-500", + "fill-orange-600", + "fill-orange-700", + "fill-orange-800", + "fill-orange-900", + "fill-orange-950", + "fill-amber-50", + "fill-amber-100", + "fill-amber-200", + "fill-amber-300", + "fill-amber-400", + "fill-amber-500", + "fill-amber-600", + "fill-amber-700", + "fill-amber-800", + "fill-amber-900", + "fill-amber-950", + "fill-yellow-50", + "fill-yellow-100", + "fill-yellow-200", + "fill-yellow-300", + "fill-yellow-400", + "fill-yellow-500", + "fill-yellow-600", + "fill-yellow-700", + "fill-yellow-800", + "fill-yellow-900", + "fill-yellow-950", + "fill-lime-50", + "fill-lime-100", + "fill-lime-200", + "fill-lime-300", + "fill-lime-400", + "fill-lime-500", + "fill-lime-600", + "fill-lime-700", + "fill-lime-800", + "fill-lime-900", + "fill-lime-950", + "fill-green-50", + "fill-green-100", + "fill-green-200", + "fill-green-300", + "fill-green-400", + "fill-green-500", + "fill-green-600", + "fill-green-700", + "fill-green-800", + "fill-green-900", + "fill-green-950", + "fill-emerald-50", + "fill-emerald-100", + "fill-emerald-200", + "fill-emerald-300", + "fill-emerald-400", + "fill-emerald-500", + "fill-emerald-600", + "fill-emerald-700", + "fill-emerald-800", + "fill-emerald-900", + "fill-emerald-950", + "fill-teal-50", + "fill-teal-100", + "fill-teal-200", + "fill-teal-300", + "fill-teal-400", + "fill-teal-500", + "fill-teal-600", + "fill-teal-700", + "fill-teal-800", + "fill-teal-900", + "fill-teal-950", + "fill-cyan-50", + "fill-cyan-100", + "fill-cyan-200", + "fill-cyan-300", + "fill-cyan-400", + "fill-cyan-500", + "fill-cyan-600", + "fill-cyan-700", + "fill-cyan-800", + "fill-cyan-900", + "fill-cyan-950", + "fill-sky-50", + "fill-sky-100", + "fill-sky-200", + "fill-sky-300", + "fill-sky-400", + "fill-sky-500", + "fill-sky-600", + "fill-sky-700", + "fill-sky-800", + "fill-sky-900", + "fill-sky-950", + "fill-blue-50", + "fill-blue-100", + "fill-blue-200", + "fill-blue-300", + "fill-blue-400", + "fill-blue-500", + "fill-blue-600", + "fill-blue-700", + "fill-blue-800", + "fill-blue-900", + "fill-blue-950", + "fill-indigo-50", + "fill-indigo-100", + "fill-indigo-200", + "fill-indigo-300", + "fill-indigo-400", + "fill-indigo-500", + "fill-indigo-600", + "fill-indigo-700", + "fill-indigo-800", + "fill-indigo-900", + "fill-indigo-950", + "fill-violet-50", + "fill-violet-100", + "fill-violet-200", + "fill-violet-300", + "fill-violet-400", + "fill-violet-500", + "fill-violet-600", + "fill-violet-700", + "fill-violet-800", + "fill-violet-900", + "fill-violet-950", + "fill-purple-50", + "fill-purple-100", + "fill-purple-200", + "fill-purple-300", + "fill-purple-400", + "fill-purple-500", + "fill-purple-600", + "fill-purple-700", + "fill-purple-800", + "fill-purple-900", + "fill-purple-950", + "fill-fuchsia-50", + "fill-fuchsia-100", + "fill-fuchsia-200", + "fill-fuchsia-300", + "fill-fuchsia-400", + "fill-fuchsia-500", + "fill-fuchsia-600", + "fill-fuchsia-700", + "fill-fuchsia-800", + "fill-fuchsia-900", + "fill-fuchsia-950", + "fill-pink-50", + "fill-pink-100", + "fill-pink-200", + "fill-pink-300", + "fill-pink-400", + "fill-pink-500", + "fill-pink-600", + "fill-pink-700", + "fill-pink-800", + "fill-pink-900", + "fill-pink-950", + "fill-rose-50", + "fill-rose-100", + "fill-rose-200", + "fill-rose-300", + "fill-rose-400", + "fill-rose-500", + "fill-rose-600", + "fill-rose-700", + "fill-rose-800", + "fill-rose-900", + "fill-rose-950", + "stroke-none", + "stroke-inherit", + "stroke-current", + "stroke-transparent", + "stroke-black", + "stroke-white", + "stroke-slate-50", + "stroke-slate-100", + "stroke-slate-200", + "stroke-slate-300", + "stroke-slate-400", + "stroke-slate-500", + "stroke-slate-600", + "stroke-slate-700", + "stroke-slate-800", + "stroke-slate-900", + "stroke-slate-950", + "stroke-gray-50", + "stroke-gray-100", + "stroke-gray-200", + "stroke-gray-300", + "stroke-gray-400", + "stroke-gray-500", + "stroke-gray-600", + "stroke-gray-700", + "stroke-gray-800", + "stroke-gray-900", + "stroke-gray-950", + "stroke-zinc-50", + "stroke-zinc-100", + "stroke-zinc-200", + "stroke-zinc-300", + "stroke-zinc-400", + "stroke-zinc-500", + "stroke-zinc-600", + "stroke-zinc-700", + "stroke-zinc-800", + "stroke-zinc-900", + "stroke-zinc-950", + "stroke-neutral-50", + "stroke-neutral-100", + "stroke-neutral-200", + "stroke-neutral-300", + "stroke-neutral-400", + "stroke-neutral-500", + "stroke-neutral-600", + "stroke-neutral-700", + "stroke-neutral-800", + "stroke-neutral-900", + "stroke-neutral-950", + "stroke-stone-50", + "stroke-stone-100", + "stroke-stone-200", + "stroke-stone-300", + "stroke-stone-400", + "stroke-stone-500", + "stroke-stone-600", + "stroke-stone-700", + "stroke-stone-800", + "stroke-stone-900", + "stroke-stone-950", + "stroke-red-50", + "stroke-red-100", + "stroke-red-200", + "stroke-red-300", + "stroke-red-400", + "stroke-red-500", + "stroke-red-600", + "stroke-red-700", + "stroke-red-800", + "stroke-red-900", + "stroke-red-950", + "stroke-orange-50", + "stroke-orange-100", + "stroke-orange-200", + "stroke-orange-300", + "stroke-orange-400", + "stroke-orange-500", + "stroke-orange-600", + "stroke-orange-700", + "stroke-orange-800", + "stroke-orange-900", + "stroke-orange-950", + "stroke-amber-50", + "stroke-amber-100", + "stroke-amber-200", + "stroke-amber-300", + "stroke-amber-400", + "stroke-amber-500", + "stroke-amber-600", + "stroke-amber-700", + "stroke-amber-800", + "stroke-amber-900", + "stroke-amber-950", + "stroke-yellow-50", + "stroke-yellow-100", + "stroke-yellow-200", + "stroke-yellow-300", + "stroke-yellow-400", + "stroke-yellow-500", + "stroke-yellow-600", + "stroke-yellow-700", + "stroke-yellow-800", + "stroke-yellow-900", + "stroke-yellow-950", + "stroke-lime-50", + "stroke-lime-100", + "stroke-lime-200", + "stroke-lime-300", + "stroke-lime-400", + "stroke-lime-500", + "stroke-lime-600", + "stroke-lime-700", + "stroke-lime-800", + "stroke-lime-900", + "stroke-lime-950", + "stroke-green-50", + "stroke-green-100", + "stroke-green-200", + "stroke-green-300", + "stroke-green-400", + "stroke-green-500", + "stroke-green-600", + "stroke-green-700", + "stroke-green-800", + "stroke-green-900", + "stroke-green-950", + "stroke-emerald-50", + "stroke-emerald-100", + "stroke-emerald-200", + "stroke-emerald-300", + "stroke-emerald-400", + "stroke-emerald-500", + "stroke-emerald-600", + "stroke-emerald-700", + "stroke-emerald-800", + "stroke-emerald-900", + "stroke-emerald-950", + "stroke-teal-50", + "stroke-teal-100", + "stroke-teal-200", + "stroke-teal-300", + "stroke-teal-400", + "stroke-teal-500", + "stroke-teal-600", + "stroke-teal-700", + "stroke-teal-800", + "stroke-teal-900", + "stroke-teal-950", + "stroke-cyan-50", + "stroke-cyan-100", + "stroke-cyan-200", + "stroke-cyan-300", + "stroke-cyan-400", + "stroke-cyan-500", + "stroke-cyan-600", + "stroke-cyan-700", + "stroke-cyan-800", + "stroke-cyan-900", + "stroke-cyan-950", + "stroke-sky-50", + "stroke-sky-100", + "stroke-sky-200", + "stroke-sky-300", + "stroke-sky-400", + "stroke-sky-500", + "stroke-sky-600", + "stroke-sky-700", + "stroke-sky-800", + "stroke-sky-900", + "stroke-sky-950", + "stroke-blue-50", + "stroke-blue-100", + "stroke-blue-200", + "stroke-blue-300", + "stroke-blue-400", + "stroke-blue-500", + "stroke-blue-600", + "stroke-blue-700", + "stroke-blue-800", + "stroke-blue-900", + "stroke-blue-950", + "stroke-indigo-50", + "stroke-indigo-100", + "stroke-indigo-200", + "stroke-indigo-300", + "stroke-indigo-400", + "stroke-indigo-500", + "stroke-indigo-600", + "stroke-indigo-700", + "stroke-indigo-800", + "stroke-indigo-900", + "stroke-indigo-950", + "stroke-violet-50", + "stroke-violet-100", + "stroke-violet-200", + "stroke-violet-300", + "stroke-violet-400", + "stroke-violet-500", + "stroke-violet-600", + "stroke-violet-700", + "stroke-violet-800", + "stroke-violet-900", + "stroke-violet-950", + "stroke-purple-50", + "stroke-purple-100", + "stroke-purple-200", + "stroke-purple-300", + "stroke-purple-400", + "stroke-purple-500", + "stroke-purple-600", + "stroke-purple-700", + "stroke-purple-800", + "stroke-purple-900", + "stroke-purple-950", + "stroke-fuchsia-50", + "stroke-fuchsia-100", + "stroke-fuchsia-200", + "stroke-fuchsia-300", + "stroke-fuchsia-400", + "stroke-fuchsia-500", + "stroke-fuchsia-600", + "stroke-fuchsia-700", + "stroke-fuchsia-800", + "stroke-fuchsia-900", + "stroke-fuchsia-950", + "stroke-pink-50", + "stroke-pink-100", + "stroke-pink-200", + "stroke-pink-300", + "stroke-pink-400", + "stroke-pink-500", + "stroke-pink-600", + "stroke-pink-700", + "stroke-pink-800", + "stroke-pink-900", + "stroke-pink-950", + "stroke-rose-50", + "stroke-rose-100", + "stroke-rose-200", + "stroke-rose-300", + "stroke-rose-400", + "stroke-rose-500", + "stroke-rose-600", + "stroke-rose-700", + "stroke-rose-800", + "stroke-rose-900", + "stroke-rose-950", + "stroke-0", + "stroke-1", + "stroke-2", + "sr-only", + "not-sr-only", + "forced-color-adjust-auto", + "forced-color-adjust-none", + "transform", + "transform-none", + "transform-gpu", + "transform-cpu", + "group", + "peer" +]); +//# sourceMappingURL=tailwind-classes.js.map \ No newline at end of file diff --git a/build/utils/tailwind-classes.js.map b/build/utils/tailwind-classes.js.map new file mode 100644 index 0000000000000000000000000000000000000000..a73b827835f9f93c6ae877be1407407d880e0f46 --- /dev/null +++ b/build/utils/tailwind-classes.js.map @@ -0,0 +1 @@ +{"version":3,"file":"tailwind-classes.js","sourceRoot":"","sources":["../../src/utils/tailwind-classes.ts"],"names":[],"mappings":"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ACP,OAAO;IACP,OAAO;IACP,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,KAAK;IACL,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,OAAO;IACP,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,KAAK;IACL,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,OAAO;IACP,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,KAAK;IACL,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,OAAO;IACP,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,KAAK;IACL,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,KAAK;IACL,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,KAAK;IACL,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,KAAK;IACL,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,KAAK;IACL,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,KAAK;IACL,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,MAAM;IACN,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,MAAM;IACN,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,MAAM;IACN,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,MAAM;IACN,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,MAAM;IACN,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,MAAM;IACN,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,MAAM;IACN,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,MAAM;IACN,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,MAAM;IACN,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,MAAM;IACN,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,MAAM;IACN,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,MAAM;IACN,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,MAAM;IACN,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,MAAM;IACN,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,MAAM;IACN,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,MAAM;IACN,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,MAAM;IACN,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,MAAM;IACN,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,MAAM;IACN,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,KAAK;IACL,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,KAAK;IACL,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,OAAO;IACP,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,KAAK;IACL,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,OAAO;IACP,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,KAAK;IACL,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,OAAO;IACP,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,KAAK;IACL,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,KAAK;IACL,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,KAAK;IACL,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,KAAK;IACL,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,KAAK;IACL,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,KAAK;IACL,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,MAAM;IACN,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,MAAM;IACN,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,MAAM;IACN,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,MAAM;IACN,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,MAAM;IACN,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,MAAM;IACN,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,MAAM;IACN,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,MAAM;IACN,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,MAAM;IACN,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,MAAM;IACN,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,MAAM;IACN,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,MAAM;IACN,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,MAAM;IACN,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,MAAM;IACN,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,MAAM;IACN,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,MAAM;IACN,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,MAAM;IACN,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,MAAM;IACN,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;I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UAAU;IACV,UAAU;IACV,UAAU;IACV,UAAU;IACV,UAAU;IACV,WAAW;IACX,WAAW;IACX,WAAW;IACX,WAAW;IACX,WAAW;IACX,WAAW;IACX,YAAY;IACZ,WAAW;IACX,WAAW;IACX,WAAW;IACX,aAAa;IACb,iBAAiB;IACjB,iBAAiB;IACjB,iBAAiB;IACjB,iBAAiB;IACjB,kBAAkB;IAClB,KAAK;IACL,MAAM;IACN,OAAO;IACP,KAAK;IACL,OAAO;IACP,KAAK;IACL,OAAO;IACP,KAAK;IACL,OAAO;IACP,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,QAAQ;IACR,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,QAAQ;IACR,UAAU;IACV,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACP,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,UAAU;IACV,UAAU;IACV,UAAU;IACV,UAAU;IACV,UAAU;IACV,UAAU;IACV,UAAU;IACV,UAAU;IACV,UAAU;IACV,UAAU;IACV,UAAU;IACV,UAAU;IACV,UAAU;IACV,UAAU;IACV,UAAU;IACV,UAAU;IACV,UAAU;IACV,UAAU;IACV,UAAU;IACV,UAAU;IACV,UAAU;IACV,WAAW;IACX,WAAW;IACX,WAAW;IACX,WAAW;IACX,YAAY;IACZ,cAAc;IACd,WAAW;IACX,WAAW;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iBAAiB;IACjB,iBAAiB;IACjB,iBAAiB;IACjB,iBAAiB;IACjB,iBAAiB;IACjB,iBAAiB;IACjB,iBAAiB;IACjB,kBAAkB;IAClB,kBAAkB;IAClB,kBAAkB;IAClB,kBAAkB;IAClB,kBAAkB;IAClB,kBAAkB;IAClB,kBAAkB;IAClB,kBAAkB;IAClB,kBAAkB;IAClB,kBAAkB;IAClB,cAAc;IACd,eAAe;IACf,eAAe;IACf,eAAe;IACf,eAAe;IACf,eAAe;IACf,eAAe;IACf,eAAe;IACf,eAAe;IACf,eAAe;IACf,eAAe;IACf,cAAc;IACd,eAAe;IACf,eAAe;IACf,eAAe;IACf,eAAe;IACf,eAAe;IACf,eAAe;IACf,eAAe;IACf,eAAe;IACf,eAAe;IACf,eAAe;IACf,SAAS;IACT,SAAS;IACT,UAAU;IACV,UAAU;IACV,UAAU;IACV,UAAU;IACV,UAAU;IACV,UAAU;IACV,UAAU;IACV,UAAU;IACV,UAAU;IACV,UAAU;IACV,UAAU;IACV,UAAU;IACV,UAAU;IACV,UAAU;IACV,UAAU;IACV,UAAU;IACV,UAAU;IACV,UAAU;IACV,WAAW;IACX,aAAa;IACb,aAAa;IACb,iBAAiB;IACjB,WAAW;IACX,WAAW;IACX,cAAc;IACd,eAAe;IACf,eAAe;IACf,eAAe;IACf,eAAe;IACf,eAAe;IACf,eAAe;IACf,eAAe;IACf,eAAe;IACf,eAAe;IACf,eAAe;IACf,aAAa;IACb,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,aAAa;IACb,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,gBAAgB;IAChB,iBAAiB;IACjB,iBAAiB;IACjB,iBAAiB;IACjB,iBAAiB;IACjB,iBAAiB;IACjB,iBAAiB;IACjB,iBAAiB;IACjB,iBAAiB;IACjB,iBAAiB;IACjB,iBAAiB;IACjB,cAAc;IACd,eAAe;IACf,eAA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a;IACb,aAAa;IACb,aAAa;IACb,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,eAAe;IACf,eAAe;IACf,eAAe;IACf,eAAe;IACf,eAAe;IACf,eAAe;IACf,eAAe;IACf,eAAe;IACf,YAAY;IACZ,aAAa;IACb,aAAa;IACb,aAAa;IACb,aAAa;IACb,aAAa;IACb,aAAa;IACb,aAAa;IACb,aAAa;IACb,cAAc;IACd,eAAe;IACf,eAAe;IACf,eAAe;IACf,eAAe;IACf,eAAe;IACf,eAAe;IACf,eAAe;IACf,eAAe;IACf,YAAY;IACZ,aAAa;IACb,aAAa;IACb,aAAa;IACb,aAAa;IACb,aAAa;IACb,aAAa;IACb,aAAa;IACb,aAAa;IACb,cAAc;IACd,eAAe;IACf,eAAe;IACf,eAAe;IACf,eAAe;IACf,eAAe;IACf,eAAe;IACf,eAAe;IACf,eAAe;IACf,YAAY;IACZ,aAAa;IACb,aAAa;IACb,aAAa;IACb,aAAa;IACb,aAAa;IACb,aAAa;IACb,aAAa;IACb,aAAa;IACb,cAAc;IACd,eAAe;IACf,eAAe;IACf,eAAe;IACf,eAAe;IACf,eAAe;IACf,eAAe;IACf,eAAe;IACf,eAAe;IACf,YAAY;IACZ,aAAa;IACb,aAAa;IACb,aAAa;IACb,aAAa;IACb,aAAa;IACb,aAAa;IACb,aAAa;IACb,aAAa;IACb,YAAY;IACZ,aAAa;IACb,aAAa;IACb,aAAa;IACb,aAAa;IACb,aAAa;IACb,aAAa;IACb,aAAa;IACb,aAAa;IACb,YAAY;IACZ,aAAa;IACb,aAAa;IACb,aAAa;IACb,aAAa;IACb,aAAa;IACb,aAAa;IACb,aAAa;IACb,aAAa;IACb,YAAY;IACZ,aAAa;IACb,aAAa;IACb,aAAa;IACb,aAAa;IACb,aAAa;IACb,aAAa;IACb,aAAa;IACb,aAAa;IACb,YAAY;IACZ,aAAa;IACb,aAAa;IACb,aAAa;IACb,aAAa;IACb,aAAa;IACb,aAAa;IACb,aAAa;IACb,aAAa;IACb,YAAY;IACZ,aAAa;IACb,aAAa;IACb,aAAa;IACb,aAAa;IACb,aAAa;IACb,aAAa;IACb,aAAa;IACb,aAAa;IACb,aAAa;IACb,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,aAAa;IACb,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,aAAa;IACb,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,aAAa;IACb,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,aAAa;IACb,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,aAAa;IACb,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,aAAa;IACb,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,aAAa;IACb,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,aAAa;IACb,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,aAAa;IACb,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,aAAa;IACb,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,aAAa;IACb,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,aAAa;IACb,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,aAAa;IACb,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,aAAa;IACb,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,aAAa;IACb,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,aAAa;IACb,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,aAAa;IACb,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,aAAa;IACb,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,aAAa;IACb,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,YAAY;IACZ,aAAa;IACb,aAAa;IACb,aAAa;IACb,aAAa;IACb,aAAa;IACb,aAAa;IACb,aAAa;IACb,aAAa;IACb,aAAa;IACb,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,eAAe;IACf,eAAe;IACf,eAAe;IACf,eAAe;IACf,eAAe;IACf,eAAe;IACf,eAAe;IACf,eAAe;IACf,YAAY;IACZ,aAAa;IACb,aAAa;IACb,aAAa;IACb,aAAa;IACb,aAAa;IACb,aAAa;IACb,aAAa;IACb,aAAa;IACb,cAAc;IACd,eAAe;IACf,eAAe;IACf,eAAe;IACf,eAAe;IACf,eAAe;IACf,eAAe;IACf,eAAe;IACf,eAAe;IACf,YAAY;IACZ,aAAa;IACb,aAAa;IACb,aAAa;IACb,aAAa;IACb,aAAa;IACb,aAAa;IACb,aAAa;IACb,aAAa;IACb,cAAc;IACd,eAAe;IACf,eAAe;IACf,eAAe;IACf,eAAe;IACf,eAAe;IACf,eAAe;IACf,eAAe;IACf,eAAe;IACf,YAAY;IACZ,aAAa;IACb,aAAa;IACb,aAAa;IACb,aAAa;IACb,aAAa;IACb,aAAa;IACb,aAAa;IACb,aAAa;IACb,cAAc;IACd,eAAe;IACf,eAAe;IACf,eAAe;IACf,eAAe;IACf,eAAe;IACf,eAAe;IACf,eAAe;IACf,eAAe;IACf,YAAY;IACZ,aAAa;IACb,aAAa;IACb,aAAa;IACb,aAAa;IACb,aAAa;IACb,aAAa;IACb,aAAa;IACb,aAAa;IACb,YAAY;IACZ,aAAa;IACb,aAAa;IACb,aAAa;IACb,aAAa;IACb,aAAa;IACb,aAAa;IACb,aAAa;IACb,aAAa;IACb,YAAY;IACZ,aAAa;IACb,aAAa;IACb,aAAa;IACb,aAAa;IACb,aAAa;IACb,aAAa;IACb,aAAa;IACb,aAAa;IACb,YAAY;IACZ,aAAa;IACb,aAAa;IACb,aAAa;IACb,aAAa;IACb,aAAa;IACb,aAAa;IACb,aAAa;IACb,aAAa;IACb,YAAY;IACZ,aAAa;IACb,aAAa;IACb,aAAa;IACb,aAAa;IACb,aAAa;IACb,aAAa;IACb,aAAa;IACb,aAAa;IACb,YAAY;IACZ,aAAa;IACb,aAAa;IACb,aAAa;IACb,aAAa;IACb,aAAa;IACb,aAAa;IACb,aAAa;IACb,aAAa;IACb,aAAa;IACb,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,aAAa;IACb,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,aAAa;IACb,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,aAAa;IACb,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,aAAa;IACb,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,aAAa;IACb,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,aAAa;IACb,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,aAAa;IACb,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,aAAa;IACb,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,aAAa;IACb,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,aAAa;IACb,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,aAAa;IACb,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,aAAa;IACb,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,aAAa;IACb,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,aAAa;IACb,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,aAAa;IACb,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,aAAa;IACb,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAAc;IACd,aAAa;IACb,cAAc;IACd,cAAc;IACd,cAAc;IACd,cAA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"} \ No newline at end of file