diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index c8b22fd7..70941b49 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -20,7 +20,7 @@ concurrency: jobs: # 构建工作 - build: + build-and-deploy: runs-on: ubuntu-latest steps: - name: Checkout @@ -49,14 +49,13 @@ jobs: with: path: docs/.vitepress/dist - # 部署工作 - deploy: - environment: - name: github-pages - url: ${{ steps.deployment.outputs.page_url }} - needs: build - runs-on: ubuntu-latest - steps: - name: Deploy to GitHub Pages id: deployment - uses: actions/deploy-pages@v4 \ No newline at end of file + uses: actions/deploy-pages@v4 + + - name: Refresh CDN Cache + env: + TENCENT_CLOUD_SECRET_ID: ${{ secrets.TENCENT_CLOUD_SECRET_ID }} + TENCENT_CLOUD_SECRET_KEY: ${{ secrets.TENCENT_CLOUD_SECRET_KEY }} + TENCENT_CLOUD_ZONE_ID: ${{ secrets.TENCENT_CLOUD_ZONE_ID }} + run: node scripts/cdn-fresh.mjs \ No newline at end of file diff --git a/docs/.vitepress/config.mts.timestamp-1742482973657-8bee96eedb873.mjs b/docs/.vitepress/config.mts.timestamp-1742482973657-8bee96eedb873.mjs new file mode 100644 index 00000000..14d6e0ea --- /dev/null +++ b/docs/.vitepress/config.mts.timestamp-1742482973657-8bee96eedb873.mjs @@ -0,0 +1,476 @@ +// docs/.vitepress/config.mts +import { fileURLToPath, URL } from "node:url"; + +// scripts/sidebar.ts +import fs2 from "fs/promises"; +import path2 from "path"; +import fg from "file:///Users/fangyizhou/Documents/coding/netease-modsdk-wiki/node_modules/fast-glob/out/index.js"; +import matter2 from "file:///Users/fangyizhou/Documents/coding/netease-modsdk-wiki/node_modules/gray-matter/index.js"; + +// scripts/sidebar-wiki.ts +import fs from "fs"; +import path from "path"; +import matter from "file:///Users/fangyizhou/Documents/coding/netease-modsdk-wiki/node_modules/gray-matter/index.js"; +var excludeFiles = [ + "entities/vanilla-usage-components.md", + "entities/vanilla-usage-spawn-rules.md", + "entities/vuc-full.md", + "entities/vusr-full.md" +]; +var fastBuild = process.env.fastBuild === "true "; +if (fastBuild && process.env.NODE_ENV == "production") { + console.log( + ` +INFO: fastBuild selected. the files: +${JSON.stringify( + excludeFiles, + null, + 4 + )} +will not be compiled! +` + ); +} +function formatLink(path3) { + return path3.split(/\\|\//g).join("/").replace(".md", ""); +} +function getCategoryOrder(frontMatter) { + const data = {}; + if (!frontMatter.data.categories) { + return data; + } + frontMatter.data.categories.forEach(function(category, index) { + data[category.title] = index + 1; + }); + return data; +} +function getCategories(frontMatter) { + const data = []; + if (!frontMatter.data.categories) { + return data; + } + frontMatter.data.categories.forEach(function(category, index) { + category.nav_order = -1; + category.category = category.title; + data.push({ + text: category.title, + data: category, + tags: category.tags, + prefix: category.prefix, + section: true, + color: category.color, + link: "", + activeMatch: " " + }); + }); + return data; +} +var order; +function generateWikiSidebar(base, dir) { + const data = []; + const files = fs.readdirSync(dir); + files.forEach(function(file) { + let joinedPath = path.join(dir, file); + const stats = fs.statSync(joinedPath); + if (stats.isDirectory() && fs.existsSync(path.join(joinedPath, "index.md"))) { + const str = fs.readFileSync( + path.join(joinedPath, "index.md"), + "utf8" + ); + let frontMatter; + try { + frontMatter = matter(str); + } catch (e) { + joinedPath = path.relative( + process.cwd(), + path.join(joinedPath, "index.md") + ); + console.log( + // @ts-ignore + `::error file=${joinedPath},line=1,col=1::File ${joinedPath} has invalid frontmatter! ${e.message}` + ); + throw new Error( + // @ts-ignore + `File ${joinedPath} has invalid frontmatter! ${e.message}` + ); + } + order = getCategoryOrder(frontMatter); + const children = generateWikiSidebar(base, joinedPath).concat( + getCategories(frontMatter) + ); + children.sort( + ({ data: dataA, text: textA }, { data: dataB, text: textB }) => { + const navA = (dataA.nav_order || 50) + (order[dataA.category] || 0) * 100 || Number.MAX_SAFE_INTEGER; + const navB = (dataB.nav_order || 50) + (order[dataB.category] || 0) * 100 || Number.MAX_SAFE_INTEGER; + if (navA == navB) { + return textA.localeCompare(textB); + } + return navA - navB; + } + ); + data.push({ + text: frontMatter.data.title, + data: frontMatter.data, + children + }); + if (frontMatter.data.title === void 0) { + throw new Error( + "File " + path.join(joinedPath, "index.md") + " has invalid frontmatter!" + ); + } + } else if (stats.isFile()) { + if (!file.endsWith(".md") || file.endsWith("index.md")) return; + const str = fs.readFileSync(joinedPath, "utf8"); + let frontMatter; + try { + frontMatter = matter(str); + } catch (e) { + joinedPath = path.relative(process.cwd(), joinedPath); + console.log( + // @ts-ignore + `::error file=${joinedPath},line=1,col=1::File ${joinedPath} has invalid frontmatter! ${e.message}` + ); + throw new Error( + // @ts-ignore + `File ${joinedPath} has invalid frontmatter! ${e.message}` + ); + } + const link = formatLink(joinedPath.toString().replace(base, "")); + if (frontMatter.data.hidden === true) return; + let prefix = null; + if (frontMatter.data.prefix != null) { + prefix = frontMatter.data.prefix; + } + let tags = null; + if (frontMatter.data.tags != null) { + tags = frontMatter.data.tags; + } + data.push({ + text: frontMatter.data.title, + data: frontMatter.data, + tags, + prefix, + section: frontMatter.data.section || false, + color: frontMatter.data.color || "none", + link, + activeMatch: `^${link}` + }); + if (frontMatter.data.title === void 0) { + joinedPath = path.relative(process.cwd(), joinedPath); + console.log( + `::error file=${joinedPath},line=1,col=1::File ${joinedPath} has invalid frontmatter!` + ); + throw new Error(`File ${joinedPath} has invalid frontmatter!`); + } + } + }); + return data.sort( + ({ data: dataA, text: textA }, { data: dataB, text: textB }) => { + const navA = (dataA.nav_order || 50) + (order[dataA.category] || 0) * 100 || Number.MAX_SAFE_INTEGER; + const navB = (dataB.nav_order || 50) + (order[dataB.category] || 0) * 100 || Number.MAX_SAFE_INTEGER; + if (navA == navB) { + return textA.localeCompare(textB); + } + return navA - navB; + } + ); +} + +// scripts/sidebar.ts +var DOCS_DIR = "docs"; +var IGNORE_PATHS = ["README.md", "readme.md", "index.md"]; +var DEFAULT_COLLAPSED_INDEX_MAP = { + "wiki": 1, + "mcdocs": 1, + "mcguide": 0, + "mconline": 0 +}; +var CATEGORY_MAP = { + "wiki": "Wiki", + "mcdocs": "API\u6587\u6863", + "mcguide": "\u5F00\u53D1\u6307\u5357", + "mconline": "\u6559\u5B66\u8BFE\u7A0B" +}; +function extractOrderNumber(name, matterData) { + const match = name.match(/^(\d+)-/); + if (match) { + return parseInt(match[1], 10); + } else if (matterData.order) { + return parseInt(matterData.order); + } else if (matterData.nav_order) { + return parseInt(matterData.nav_order); + } + return Number.MAX_SAFE_INTEGER; +} +async function generateSidebar() { + const sidebar = {}; + const files = await fg([`${DOCS_DIR}/**/*.md`]); + for (const filePath of files) { + if (filePath.includes("wiki")) continue; + const relativePath = path2.relative(DOCS_DIR, filePath); + if (IGNORE_PATHS.some((ignore) => relativePath.toLowerCase().includes(ignore.toLowerCase()))) continue; + const segments = relativePath.split(path2.sep); + const categoryKey = segments[0]; + const fileContent = await fs2.readFile(filePath, "utf-8"); + const { data: matterData } = matter2(fileContent); + if (matterData.hidden) { + continue; + } + const categoryName = CATEGORY_MAP[categoryKey] || categoryKey; + let currentLevel = sidebar[categoryKey] || []; + if (!sidebar[categoryKey]) { + sidebar[categoryKey] = currentLevel; + } + for (let i = 0; i < segments.length; i++) { + const segment = segments[i].replace(".md", ""); + const isLast = i === segments.length - 1; + let link; + if (isLast) { + link = `/${segments.slice(0, i + 1).join("/")}`.replace(/\.md$/, ""); + } else if (i === 0) { + link = `/${segment}`; + } + const order2 = extractOrderNumber(segment, matterData); + if (isLast) { + const title = await getTitleFromFile(filePath, matterData); + const activeMatch = `^${link}(?:/|$)`; + currentLevel.push({ text: title, link, order: order2, activeMatch }); + } else { + let displayText = i === 0 ? categoryName : segment; + displayText = displayText.replace(/^\d+-\s*/, ""); + let group = currentLevel.find( + (item) => i === 0 && item.text === categoryName || i !== 0 && item.text === displayText + ); + if (!group) { + const groupLink = i === 0 ? `/${segment}` : void 0; + group = { + text: displayText, + items: [], + order: order2, + collapsed: i > DEFAULT_COLLAPSED_INDEX_MAP[segments[0]], + // 为目录添加活动匹配模式 + activeMatch: `^/${segment}(?:/|$)`, + link: groupLink + }; + currentLevel.push(group); + } + currentLevel = group.items || []; + } + } + } + for (const key in sidebar) { + sortSidebarItems(sidebar[key]); + } + const sidebarFlat = {}; + for (const key in sidebar) { + sidebarFlat[key] = []; + sidebar[key].forEach((item) => { + if (item.items) { + sidebarFlat[key].push(...item.items); + } else { + sidebarFlat[key].push(item); + } + }); + } + const wiki = generateWikiSidebar(path2.join(process.cwd(), "docs"), path2.join(process.cwd(), "docs/wiki")); + const wikiSidebar = []; + wiki.forEach((item) => { + if (item.data.categories) { + const secondUrls = []; + const second = item.data.categories.map((category) => { + ; + return { + text: category.title, + collapsed: false, + items: item.children.filter((child) => child.data.category === category.title).filter((child) => child.link).map((child) => { + secondUrls.push(child.link); + return { + text: child.text, + link: child.link, + activeMatch: child.activeMatch + }; + }) + }; + }); + const notMatched = item.children.filter((child) => !secondUrls.includes(child.link)).filter((child) => child.link).map((child) => { + return { + text: child.text, + link: child.link, + activeMatch: child.activeMatch + }; + }); + wikiSidebar.push({ + text: item.data.title, + collapsed: true, + items: [...second, ...notMatched] + }); + } else { + wikiSidebar.push({ + text: item.text, + collapsed: true, + items: item.children.filter((child) => child.link).map((child) => { + return { + text: child.text, + link: child.link, + activeMatch: child.activeMatch + }; + }) + }); + } + }); + sidebarFlat["wiki"] = wikiSidebar; + return sidebarFlat; +} +function sortSidebarItems(items) { + items.sort((a, b) => { + const orderA = a.order ?? Number.MAX_SAFE_INTEGER; + const orderB = b.order ?? Number.MAX_SAFE_INTEGER; + return orderA - orderB; + }); + items.forEach((item) => { + if (item.items && item.items.length > 0) { + sortSidebarItems(item.items); + } + }); +} +async function getTitleFromFile(filePath, matterData) { + if (matterData.title) { + return matterData.title.trim().replace(/['"]/g, ""); + } + const basename = path2.basename(filePath, ".md"); + return basename.replace(/^\d+-\s*/, "").replace(/-/g, " "); +} +var sidebar_default = generateSidebar; + +// docs/.vitepress/config.mts +import { withMermaid } from "file:///Users/fangyizhou/Documents/coding/netease-modsdk-wiki/node_modules/vitepress-plugin-mermaid/dist/vitepress-plugin-mermaid.es.mjs"; +var __vite_injected_original_import_meta_url = "file:///Users/fangyizhou/Documents/coding/netease-modsdk-wiki/docs/.vitepress/config.mts"; +var config_default = withMermaid({ + lang: "zh-CN", + title: "\u6211\u7684\u4E16\u754C\u4E2D\u56FD\u7248 Wiki", + description: "ModSDK \u5F00\u53D1\u8005\u6587\u6863 \u955C\u50CF\uFF0C\u4F46\u63D0\u4F9B\u66F4\u4F18\u8D28\u7684\u641C\u7D22", + ignoreDeadLinks: true, + // 替换原生搜索组件,自定义展示的搜索结果内容 + vite: { + resolve: { + alias: [ + { + find: /^.*\/VPAlgoliaSearchBox\.vue$/, + replacement: fileURLToPath( + new URL("./theme/components/AlgoliaSearch.vue", __vite_injected_original_import_meta_url) + ) + } + ] + } + }, + locales: { + root: { + label: "\u7B80\u4F53\u4E2D\u6587", + lang: "zh-CN", + themeConfig: { + // 右侧导航栏的本地化文本 + outlineTitle: "\u672C\u9875\u76EE\u5F55", + // 文档底部的本地化文本 + docFooter: { + prev: "\u4E0A\u4E00\u9875", + next: "\u4E0B\u4E00\u9875" + }, + // 最后更新时间的本地化文本 + lastUpdatedText: "\u6700\u540E\u66F4\u65B0\u4E8E", + // 返回顶部按钮的本地化文本 + returnToTopLabel: "\u8FD4\u56DE\u9876\u90E8", + // 移动端菜单的本地化文本 + sidebarMenuLabel: "\u83DC\u5355", + darkModeSwitchLabel: "\u4E3B\u9898", + lightModeSwitchTitle: "\u5207\u6362\u5230\u6D45\u8272\u6A21\u5F0F", + darkModeSwitchTitle: "\u5207\u6362\u5230\u6DF1\u8272\u6A21\u5F0F" + } + } + }, + head: [ + ["script", { async: "", src: "https://www.googletagmanager.com/gtag/js?id=G-HPBDPVLP03" }], + ["script", {}, ` + window.dataLayer = window.dataLayer || []; + function gtag(){dataLayer.push(arguments);} + gtag('js', new Date()); + gtag('config', 'G-HPBDPVLP03'); + `] + ], + themeConfig: { + // https://vitepress.dev/reference/default-theme-config + nav: [ + { text: "\u9996\u9875", link: "/" }, + { text: "Wiki", link: "/wiki" }, + { text: "API\u6587\u6863", link: "/mcdocs/0-\u6B22\u8FCE" }, + { text: "\u5F00\u53D1\u6307\u5357", link: "/mcguide/0-\u6B22\u8FCE" }, + { text: "\u6559\u5B66\u8BFE\u7A0B", link: "/mconline/0-\u6B22\u8FCE" } + ], + sidebar: await sidebar_default(), + socialLinks: [ + { icon: "github", link: "https://github.com/EaseCation/netease-modsdk-wiki" } + ], + editLink: { + pattern: "https://github.com/EaseCation/netease-modsdk-wiki/edit/main/docs/:path", + text: "\u5728 GitHub \u4E0A\u7F16\u8F91\u6B64\u9875" + }, + search: { + provider: "algolia", + options: { + appId: "F8HD84CUON", + apiKey: "ccaf9255472c593d8a8b0724a940bb29", + indexName: "netease-modsdk", + searchParameters: { + // 筛选掉 rootType 为 mconline 的项目 + facetFilters: ["rootType:-mconline"] + }, + locales: { + root: { + placeholder: "\u641C\u7D22\u6587\u6863", + translations: { + button: { + buttonText: "\u641C\u7D22\u6587\u6863", + buttonAriaLabel: "\u641C\u7D22\u6587\u6863" + }, + modal: { + searchBox: { + resetButtonTitle: "\u6E05\u9664\u67E5\u8BE2\u6761\u4EF6", + resetButtonAriaLabel: "\u6E05\u9664\u67E5\u8BE2\u6761\u4EF6", + cancelButtonText: "\u53D6\u6D88", + cancelButtonAriaLabel: "\u53D6\u6D88" + }, + startScreen: { + recentSearchesTitle: "\u641C\u7D22\u5386\u53F2", + noRecentSearchesText: "\u6CA1\u6709\u641C\u7D22\u5386\u53F2", + saveRecentSearchButtonTitle: "\u4FDD\u5B58\u81F3\u641C\u7D22\u5386\u53F2", + removeRecentSearchButtonTitle: "\u4ECE\u641C\u7D22\u5386\u53F2\u4E2D\u79FB\u9664", + favoriteSearchesTitle: "\u6536\u85CF", + removeFavoriteSearchButtonTitle: "\u4ECE\u6536\u85CF\u4E2D\u79FB\u9664" + }, + errorScreen: { + titleText: "\u65E0\u6CD5\u83B7\u53D6\u7ED3\u679C", + helpText: "\u4F60\u53EF\u80FD\u9700\u8981\u68C0\u67E5\u4F60\u7684\u7F51\u7EDC\u8FDE\u63A5" + }, + footer: { + selectText: "\u9009\u62E9", + navigateText: "\u5207\u6362", + closeText: "\u5173\u95ED", + searchByText: "\u641C\u7D22\u63D0\u4F9B\u5546" + }, + noResultsScreen: { + noResultsText: "\u65E0\u6CD5\u627E\u5230\u76F8\u5173\u7ED3\u679C", + suggestedQueryText: "\u4F60\u53EF\u4EE5\u5C1D\u8BD5\u67E5\u8BE2", + reportMissingResultsText: "\u4F60\u8BA4\u4E3A\u8BE5\u67E5\u8BE2\u5E94\u8BE5\u6709\u7ED3\u679C\uFF1F", + reportMissingResultsLinkText: "\u70B9\u51FB\u53CD\u9988" + } + } + } + } + } + } + } + } +}); +export { + config_default as default +}; +//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiZG9jcy8udml0ZXByZXNzL2NvbmZpZy5tdHMiLCAic2NyaXB0cy9zaWRlYmFyLnRzIiwgInNjcmlwdHMvc2lkZWJhci13aWtpLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJjb25zdCBfX3ZpdGVfaW5qZWN0ZWRfb3JpZ2luYWxfZGlybmFtZSA9IFwiL1VzZXJzL2Zhbmd5aXpob3UvRG9jdW1lbnRzL2NvZGluZy9uZXRlYXNlLW1vZHNkay13aWtpL2RvY3MvLnZpdGVwcmVzc1wiO2NvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9maWxlbmFtZSA9IFwiL1VzZXJzL2Zhbmd5aXpob3UvRG9jdW1lbnRzL2NvZGluZy9uZXRlYXNlLW1vZHNkay13aWtpL2RvY3MvLnZpdGVwcmVzcy9jb25maWcubXRzXCI7Y29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2ltcG9ydF9tZXRhX3VybCA9IFwiZmlsZTovLy9Vc2Vycy9mYW5neWl6aG91L0RvY3VtZW50cy9jb2RpbmcvbmV0ZWFzZS1tb2RzZGstd2lraS9kb2NzLy52aXRlcHJlc3MvY29uZmlnLm10c1wiO2ltcG9ydCB7IGRlZmluZUNvbmZpZyB9IGZyb20gJ3ZpdGVwcmVzcyc7XG5pbXBvcnQgeyBmaWxlVVJMVG9QYXRoLCBVUkwgfSBmcm9tICdub2RlOnVybCdcbmltcG9ydCBnZW5lcmF0ZVNpZGViYXIgZnJvbSAnLi4vLi4vc2NyaXB0cy9zaWRlYmFyLmpzJztcbmltcG9ydCB7IHdpdGhNZXJtYWlkIH0gZnJvbSBcInZpdGVwcmVzcy1wbHVnaW4tbWVybWFpZFwiO1xuXG4vLyBodHRwczovL3ZpdGVwcmVzcy5kZXYvcmVmZXJlbmNlL3NpdGUtY29uZmlnXG5leHBvcnQgZGVmYXVsdCB3aXRoTWVybWFpZCh7XG4gIGxhbmc6ICd6aC1DTicsXG4gIHRpdGxlOiBcIlx1NjIxMVx1NzY4NFx1NEUxNlx1NzU0Q1x1NEUyRFx1NTZGRFx1NzI0OCBXaWtpXCIsXG4gIGRlc2NyaXB0aW9uOiBcIk1vZFNESyBcdTVGMDBcdTUzRDFcdTgwMDVcdTY1ODdcdTY4NjMgXHU5NTVDXHU1MENGXHVGRjBDXHU0RjQ2XHU2M0QwXHU0RjlCXHU2NkY0XHU0RjE4XHU4RDI4XHU3Njg0XHU2NDFDXHU3RDIyXCIsXG4gIGlnbm9yZURlYWRMaW5rczogdHJ1ZSxcbiAgLy8gXHU2NkZGXHU2MzYyXHU1MzlGXHU3NTFGXHU2NDFDXHU3RDIyXHU3RUM0XHU0RUY2XHVGRjBDXHU4MUVBXHU1QjlBXHU0RTQ5XHU1QzU1XHU3OTNBXHU3Njg0XHU2NDFDXHU3RDIyXHU3RUQzXHU2NzlDXHU1MTg1XHU1QkI5XG4gIHZpdGU6IHtcbiAgICByZXNvbHZlOiB7XG4gICAgICBhbGlhczogW1xuICAgICAgICB7XG4gICAgICAgICAgZmluZDogL14uKlxcL1ZQQWxnb2xpYVNlYXJjaEJveFxcLnZ1ZSQvLFxuICAgICAgICAgIHJlcGxhY2VtZW50OiBmaWxlVVJMVG9QYXRoKFxuICAgICAgICAgICAgbmV3IFVSTCgnLi90aGVtZS9jb21wb25lbnRzL0FsZ29saWFTZWFyY2gudnVlJywgaW1wb3J0Lm1ldGEudXJsKVxuICAgICAgICAgIClcbiAgICAgICAgfVxuICAgICAgXVxuICAgIH1cbiAgfSxcbiAgbG9jYWxlczoge1xuICAgIHJvb3Q6IHtcbiAgICAgIGxhYmVsOiAnXHU3QjgwXHU0RjUzXHU0RTJEXHU2NTg3JyxcbiAgICAgIGxhbmc6ICd6aC1DTicsXG4gICAgICB0aGVtZUNvbmZpZzoge1xuICAgICAgICAvLyBcdTUzRjNcdTRGQTdcdTVCRkNcdTgyMkFcdTY4MEZcdTc2ODRcdTY3MkNcdTU3MzBcdTUzMTZcdTY1ODdcdTY3MkNcbiAgICAgICAgb3V0bGluZVRpdGxlOiAnXHU2NzJDXHU5ODc1XHU3NkVFXHU1RjU1JyxcbiAgICAgICAgLy8gXHU2NTg3XHU2ODYzXHU1RTk1XHU5MEU4XHU3Njg0XHU2NzJDXHU1NzMwXHU1MzE2XHU2NTg3XHU2NzJDXG4gICAgICAgIGRvY0Zvb3Rlcjoge1xuICAgICAgICAgIHByZXY6ICdcdTRFMEFcdTRFMDBcdTk4NzUnLFxuICAgICAgICAgIG5leHQ6ICdcdTRFMEJcdTRFMDBcdTk4NzUnXG4gICAgICAgIH0sXG4gICAgICAgIC8vIFx1NjcwMFx1NTQwRVx1NjZGNFx1NjVCMFx1NjVGNlx1OTVGNFx1NzY4NFx1NjcyQ1x1NTczMFx1NTMxNlx1NjU4N1x1NjcyQ1xuICAgICAgICBsYXN0VXBkYXRlZFRleHQ6ICdcdTY3MDBcdTU0MEVcdTY2RjRcdTY1QjBcdTRFOEUnLFxuICAgICAgICAvLyBcdThGRDRcdTU2REVcdTk4NzZcdTkwRThcdTYzMDlcdTk0QUVcdTc2ODRcdTY3MkNcdTU3MzBcdTUzMTZcdTY1ODdcdTY3MkNcbiAgICAgICAgcmV0dXJuVG9Ub3BMYWJlbDogJ1x1OEZENFx1NTZERVx1OTg3Nlx1OTBFOCcsXG4gICAgICAgIC8vIFx1NzlGQlx1NTJBOFx1N0FFRlx1ODNEQ1x1NTM1NVx1NzY4NFx1NjcyQ1x1NTczMFx1NTMxNlx1NjU4N1x1NjcyQ1xuICAgICAgICBzaWRlYmFyTWVudUxhYmVsOiAnXHU4M0RDXHU1MzU1JyxcbiAgICAgICAgZGFya01vZGVTd2l0Y2hMYWJlbDogJ1x1NEUzQlx1OTg5OCcsXG4gICAgICAgIGxpZ2h0TW9kZVN3aXRjaFRpdGxlOiAnXHU1MjA3XHU2MzYyXHU1MjMwXHU2RDQ1XHU4MjcyXHU2QTIxXHU1RjBGJyxcbiAgICAgICAgZGFya01vZGVTd2l0Y2hUaXRsZTogJ1x1NTIwN1x1NjM2Mlx1NTIzMFx1NkRGMVx1ODI3Mlx1NkEyMVx1NUYwRidcbiAgICAgIH1cbiAgICB9XG4gIH0sXG4gIGhlYWQ6IFtcbiAgICBbJ3NjcmlwdCcsIHsgYXN5bmM6ICcnLCBzcmM6ICdodHRwczovL3d3dy5nb29nbGV0YWdtYW5hZ2VyLmNvbS9ndGFnL2pzP2lkPUctSFBCRFBWTFAwMycgfV0sXG4gICAgWydzY3JpcHQnLCB7fSwgYFxuICAgICAgd2luZG93LmRhdGFMYXllciA9IHdpbmRvdy5kYXRhTGF5ZXIgfHwgW107XG4gICAgICBmdW5jdGlvbiBndGFnKCl7ZGF0YUxheWVyLnB1c2goYXJndW1lbnRzKTt9XG4gICAgICBndGFnKCdqcycsIG5ldyBEYXRlKCkpO1xuICAgICAgZ3RhZygnY29uZmlnJywgJ0ctSFBCRFBWTFAwMycpO1xuICAgIGBdXG4gIF0sXG4gIHRoZW1lQ29uZmlnOiB7XG4gICAgLy8gaHR0cHM6Ly92aXRlcHJlc3MuZGV2L3JlZmVyZW5jZS9kZWZhdWx0LXRoZW1lLWNvbmZpZ1xuICAgIG5hdjogW1xuICAgICAgeyB0ZXh0OiAnXHU5OTk2XHU5ODc1JywgbGluazogJy8nIH0sXG4gICAgICB7IHRleHQ6ICdXaWtpJywgbGluazogJy93aWtpJyB9LFxuICAgICAgeyB0ZXh0OiAnQVBJXHU2NTg3XHU2ODYzJywgbGluazogJy9tY2RvY3MvMC1cdTZCMjJcdThGQ0UnIH0sXG4gICAgICB7IHRleHQ6ICdcdTVGMDBcdTUzRDFcdTYzMDdcdTUzNTcnLCBsaW5rOiAnL21jZ3VpZGUvMC1cdTZCMjJcdThGQ0UnIH0sXG4gICAgICB7IHRleHQ6ICdcdTY1NTlcdTVCNjZcdThCRkVcdTdBMEInLCBsaW5rOiAnL21jb25saW5lLzAtXHU2QjIyXHU4RkNFJyB9LFxuICAgIF0sXG5cbiAgICBzaWRlYmFyOiBhd2FpdCBnZW5lcmF0ZVNpZGViYXIoKSxcblxuICAgIHNvY2lhbExpbmtzOiBbXG4gICAgICB7IGljb246ICdnaXRodWInLCBsaW5rOiAnaHR0cHM6Ly9naXRodWIuY29tL0Vhc2VDYXRpb24vbmV0ZWFzZS1tb2RzZGstd2lraScgfVxuICAgIF0sXG5cbiAgICBlZGl0TGluazoge1xuICAgICAgcGF0dGVybjogJ2h0dHBzOi8vZ2l0aHViLmNvbS9FYXNlQ2F0aW9uL25ldGVhc2UtbW9kc2RrLXdpa2kvZWRpdC9tYWluL2RvY3MvOnBhdGgnLFxuICAgICAgdGV4dDogJ1x1NTcyOCBHaXRIdWIgXHU0RTBBXHU3RjE2XHU4RjkxXHU2QjY0XHU5ODc1J1xuICAgIH0sXG5cbiAgICBzZWFyY2g6IHtcbiAgICAgIHByb3ZpZGVyOiAnYWxnb2xpYScsXG4gICAgICBvcHRpb25zOiB7XG4gICAgICAgIGFwcElkOiAnRjhIRDg0Q1VPTicsXG4gICAgICAgIGFwaUtleTogJ2NjYWY5MjU1NDcyYzU5M2Q4YThiMDcyNGE5NDBiYjI5JyxcbiAgICAgICAgaW5kZXhOYW1lOiAnbmV0ZWFzZS1tb2RzZGsnLFxuICAgICAgICBzZWFyY2hQYXJhbWV0ZXJzOiB7XG4gICAgICAgICAgLy8gXHU3QjVCXHU5MDA5XHU2Mzg5IHJvb3RUeXBlIFx1NEUzQSBtY29ubGluZSBcdTc2ODRcdTk4NzlcdTc2RUVcbiAgICAgICAgICBmYWNldEZpbHRlcnM6IFsncm9vdFR5cGU6LW1jb25saW5lJ11cbiAgICAgICAgfSxcbiAgICAgICAgbG9jYWxlczoge1xuICAgICAgICAgIHJvb3Q6IHtcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyOiAnXHU2NDFDXHU3RDIyXHU2NTg3XHU2ODYzJyxcbiAgICAgICAgICAgIHRyYW5zbGF0aW9uczoge1xuICAgICAgICAgICAgICBidXR0b246IHtcbiAgICAgICAgICAgICAgICBidXR0b25UZXh0OiAnXHU2NDFDXHU3RDIyXHU2NTg3XHU2ODYzJyxcbiAgICAgICAgICAgICAgICBidXR0b25BcmlhTGFiZWw6ICdcdTY0MUNcdTdEMjJcdTY1ODdcdTY4NjMnXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIG1vZGFsOiB7XG4gICAgICAgICAgICAgICAgc2VhcmNoQm94OiB7XG4gICAgICAgICAgICAgICAgICByZXNldEJ1dHRvblRpdGxlOiAnXHU2RTA1XHU5NjY0XHU2N0U1XHU4QkUyXHU2NzYxXHU0RUY2JyxcbiAgICAgICAgICAgICAgICAgIHJlc2V0QnV0dG9uQXJpYUxhYmVsOiAnXHU2RTA1XHU5NjY0XHU2N0U1XHU4QkUyXHU2NzYxXHU0RUY2JyxcbiAgICAgICAgICAgICAgICAgIGNhbmNlbEJ1dHRvblRleHQ6ICdcdTUzRDZcdTZEODgnLFxuICAgICAgICAgICAgICAgICAgY2FuY2VsQnV0dG9uQXJpYUxhYmVsOiAnXHU1M0Q2XHU2RDg4J1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgc3RhcnRTY3JlZW46IHtcbiAgICAgICAgICAgICAgICAgIHJlY2VudFNlYXJjaGVzVGl0bGU6ICdcdTY0MUNcdTdEMjJcdTUzODZcdTUzRjInLFxuICAgICAgICAgICAgICAgICAgbm9SZWNlbnRTZWFyY2hlc1RleHQ6ICdcdTZDQTFcdTY3MDlcdTY0MUNcdTdEMjJcdTUzODZcdTUzRjInLFxuICAgICAgICAgICAgICAgICAgc2F2ZVJlY2VudFNlYXJjaEJ1dHRvblRpdGxlOiAnXHU0RkREXHU1QjU4XHU4MUYzXHU2NDFDXHU3RDIyXHU1Mzg2XHU1M0YyJyxcbiAgICAgICAgICAgICAgICAgIHJlbW92ZVJlY2VudFNlYXJjaEJ1dHRvblRpdGxlOiAnXHU0RUNFXHU2NDFDXHU3RDIyXHU1Mzg2XHU1M0YyXHU0RTJEXHU3OUZCXHU5NjY0JyxcbiAgICAgICAgICAgICAgICAgIGZhdm9yaXRlU2VhcmNoZXNUaXRsZTogJ1x1NjUzNlx1ODVDRicsXG4gICAgICAgICAgICAgICAgICByZW1vdmVGYXZvcml0ZVNlYXJjaEJ1dHRvblRpdGxlOiAnXHU0RUNFXHU2NTM2XHU4NUNGXHU0RTJEXHU3OUZCXHU5NjY0J1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgZXJyb3JTY3JlZW46IHtcbiAgICAgICAgICAgICAgICAgIHRpdGxlVGV4dDogJ1x1NjVFMFx1NkNENVx1ODNCN1x1NTNENlx1N0VEM1x1Njc5QycsXG4gICAgICAgICAgICAgICAgICBoZWxwVGV4dDogJ1x1NEY2MFx1NTNFRlx1ODBGRFx1OTcwMFx1ODk4MVx1NjhDMFx1NjdFNVx1NEY2MFx1NzY4NFx1N0Y1MVx1N0VEQ1x1OEZERVx1NjNBNSdcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGZvb3Rlcjoge1xuICAgICAgICAgICAgICAgICAgc2VsZWN0VGV4dDogJ1x1OTAwOVx1NjJFOScsXG4gICAgICAgICAgICAgICAgICBuYXZpZ2F0ZVRleHQ6ICdcdTUyMDdcdTYzNjInLFxuICAgICAgICAgICAgICAgICAgY2xvc2VUZXh0OiAnXHU1MTczXHU5NUVEJyxcbiAgICAgICAgICAgICAgICAgIHNlYXJjaEJ5VGV4dDogJ1x1NjQxQ1x1N0QyMlx1NjNEMFx1NEY5Qlx1NTU0NidcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIG5vUmVzdWx0c1NjcmVlbjoge1xuICAgICAgICAgICAgICAgICAgbm9SZXN1bHRzVGV4dDogJ1x1NjVFMFx1NkNENVx1NjI3RVx1NTIzMFx1NzZGOFx1NTE3M1x1N0VEM1x1Njc5QycsXG4gICAgICAgICAgICAgICAgICBzdWdnZXN0ZWRRdWVyeVRleHQ6ICdcdTRGNjBcdTUzRUZcdTRFRTVcdTVDMURcdThCRDVcdTY3RTVcdThCRTInLFxuICAgICAgICAgICAgICAgICAgcmVwb3J0TWlzc2luZ1Jlc3VsdHNUZXh0OiAnXHU0RjYwXHU4QkE0XHU0RTNBXHU4QkU1XHU2N0U1XHU4QkUyXHU1RTk0XHU4QkU1XHU2NzA5XHU3RUQzXHU2NzlDXHVGRjFGJyxcbiAgICAgICAgICAgICAgICAgIHJlcG9ydE1pc3NpbmdSZXN1bHRzTGlua1RleHQ6ICdcdTcwQjlcdTUxRkJcdTUzQ0RcdTk5ODgnXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59KVxuIiwgImNvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9kaXJuYW1lID0gXCIvVXNlcnMvZmFuZ3lpemhvdS9Eb2N1bWVudHMvY29kaW5nL25ldGVhc2UtbW9kc2RrLXdpa2kvc2NyaXB0c1wiO2NvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9maWxlbmFtZSA9IFwiL1VzZXJzL2Zhbmd5aXpob3UvRG9jdW1lbnRzL2NvZGluZy9uZXRlYXNlLW1vZHNkay13aWtpL3NjcmlwdHMvc2lkZWJhci50c1wiO2NvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9pbXBvcnRfbWV0YV91cmwgPSBcImZpbGU6Ly8vVXNlcnMvZmFuZ3lpemhvdS9Eb2N1bWVudHMvY29kaW5nL25ldGVhc2UtbW9kc2RrLXdpa2kvc2NyaXB0cy9zaWRlYmFyLnRzXCI7aW1wb3J0IGZzIGZyb20gJ2ZzL3Byb21pc2VzJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IGZnIGZyb20gJ2Zhc3QtZ2xvYic7XG5pbXBvcnQgbWF0dGVyIGZyb20gJ2dyYXktbWF0dGVyJztcbmltcG9ydCB7IGdlbmVyYXRlV2lraVNpZGViYXIgfSBmcm9tICcuL3NpZGViYXItd2lraSc7XG5cbi8vIFx1NUI5QVx1NEU0OVx1NEZBN1x1OEZCOVx1NjgwRlx1OTg3OVx1NzZFRVx1NjNBNVx1NTNFM1xuaW50ZXJmYWNlIFNpZGViYXJJdGVtIHtcbiAgICB0ZXh0OiBzdHJpbmc7XG4gICAgbGluaz86IHN0cmluZztcbiAgICBpdGVtcz86IFNpZGViYXJJdGVtW107XG4gICAgb3JkZXI/OiBudW1iZXI7IC8vIFx1NkRGQlx1NTJBMFx1NjM5Mlx1NUU4Rlx1NUI1N1x1NkJCNVxuICAgIGNvbGxhcHNlZD86IGJvb2xlYW47IC8vIFx1NkRGQlx1NTJBMFx1NjI5OFx1NTNFMFx1NzJCNlx1NjAwMVx1NjNBN1x1NTIzNlxuICAgIGFjdGl2ZU1hdGNoPzogc3RyaW5nOyAvLyBcdTZERkJcdTUyQTBcdTZEM0JcdTUyQThcdTUzMzlcdTkxNERcdTZBMjFcdTVGMEZcbn1cblxuLy8gXHU5MTREXHU3RjZFXHU1M0MyXHU2NTcwXG5jb25zdCBET0NTX0RJUiA9ICdkb2NzJzsgICAgICAgICAgLy8gXHU2NTg3XHU2ODYzXHU2ODM5XHU3NkVFXHU1RjU1XG5jb25zdCBJR05PUkVfUEFUSFMgPSBbJ1JFQURNRS5tZCcsICdyZWFkbWUubWQnLCAnaW5kZXgubWQnXTsgLy8gXHU1RkZEXHU3NTY1XHU3Njg0XHU2NTg3XHU0RUY2XHU1NDBEXG5jb25zdCBERUZBVUxUX0NPTExBUFNFRF9JTkRFWF9NQVAgPSB7XG4gICAgJ3dpa2knOiAxLFxuICAgICdtY2RvY3MnOiAxLFxuICAgICdtY2d1aWRlJzogMCxcbiAgICAnbWNvbmxpbmUnOiAwXG59O1xuXG4vLyBcdTRFMDBcdTdFQTdcdTc2RUVcdTVGNTVcdTU0MERcdTc5RjBcdTY2MjBcdTVDMDRcdTg4NjhcbmNvbnN0IENBVEVHT1JZX01BUDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICBcIndpa2lcIjogXCJXaWtpXCIsXG4gICAgJ21jZG9jcyc6ICdBUElcdTY1ODdcdTY4NjMnLFxuICAgICdtY2d1aWRlJzogJ1x1NUYwMFx1NTNEMVx1NjMwN1x1NTM1NycsXG4gICAgJ21jb25saW5lJzogJ1x1NjU1OVx1NUI2Nlx1OEJGRVx1N0EwQidcbn07XG5cbi8qKlxuICogXHU0RUNFXHU1NDBEXHU3OUYwXHU0RTJEXHU2M0QwXHU1M0Q2XHU2MzkyXHU1RThGXHU2NTcwXHU1QjU3XG4gKiBcdTRGOEJcdTU5ODJcdUZGMUEnMC1cdTY5ODJcdThGRjAnIFx1OEZENFx1NTZERSAwXHVGRjBDJzEtXHU1N0ZBXHU3ODQwJyBcdThGRDRcdTU2REUgMVxuICovXG5mdW5jdGlvbiBleHRyYWN0T3JkZXJOdW1iZXIobmFtZTogc3RyaW5nLCBtYXR0ZXJEYXRhOiBhbnkpOiBudW1iZXIge1xuICAgIGNvbnN0IG1hdGNoID0gbmFtZS5tYXRjaCgvXihcXGQrKS0vKTtcbiAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgcmV0dXJuIHBhcnNlSW50KG1hdGNoWzFdLCAxMCk7XG4gICAgfSBlbHNlIGlmIChtYXR0ZXJEYXRhLm9yZGVyKSB7XG4gICAgICAgIHJldHVybiBwYXJzZUludChtYXR0ZXJEYXRhLm9yZGVyKTtcbiAgICB9IGVsc2UgaWYgKG1hdHRlckRhdGEubmF2X29yZGVyKSB7XG4gICAgICAgIHJldHVybiBwYXJzZUludChtYXR0ZXJEYXRhLm5hdl9vcmRlcik7XG4gICAgfVxuICAgIHJldHVybiBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUjtcbn1cblxuLyoqXG4gKiBcdTc1MUZcdTYyMTBcdTRGQTdcdThGQjlcdTY4MEZcdTkxNERcdTdGNkVcdTk4NzlcbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVTaWRlYmFyKCk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgU2lkZWJhckl0ZW1bXT4+IHtcbiAgICBjb25zdCBzaWRlYmFyOiBSZWNvcmQ8c3RyaW5nLCBTaWRlYmFySXRlbVtdPiA9IHt9O1xuICAgIGNvbnN0IGZpbGVzID0gYXdhaXQgZmcoW2Ake0RPQ1NfRElSfS8qKi8qLm1kYF0pO1xuXG4gICAgLy8gXHU1OTA0XHU3NDA2XHU2MjQwXHU2NzA5XHU5NzVFIHdpa2kgXHU2NTg3XHU0RUY2XG4gICAgZm9yIChjb25zdCBmaWxlUGF0aCBvZiBmaWxlcykge1xuICAgICAgICAvLyBcdThERjNcdThGQzd3aWtpXG4gICAgICAgIGlmIChmaWxlUGF0aC5pbmNsdWRlcygnd2lraScpKSBjb250aW51ZTtcbiAgICAgICAgY29uc3QgcmVsYXRpdmVQYXRoID0gcGF0aC5yZWxhdGl2ZShET0NTX0RJUiwgZmlsZVBhdGgpO1xuICAgICAgICBpZiAoSUdOT1JFX1BBVEhTLnNvbWUoaWdub3JlID0+IHJlbGF0aXZlUGF0aC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKGlnbm9yZS50b0xvd2VyQ2FzZSgpKSkpIGNvbnRpbnVlO1xuXG4gICAgICAgIGNvbnN0IHNlZ21lbnRzID0gcmVsYXRpdmVQYXRoLnNwbGl0KHBhdGguc2VwKTtcbiAgICAgICAgY29uc3QgY2F0ZWdvcnlLZXkgPSBzZWdtZW50c1swXTtcblxuICAgICAgICAvLyBcdThCRkJcdTUzRDZcdTY1ODdcdTRFRjZcdTUxODVcdTVCQjlcdUZGMENcdTcxMzZcdTU0MEVcdTkwMUFcdThGQzdtYXR0ZXJcdThCRkJcdTUzRDZcdTU5MzRcdTkwRThcdTRGRTFcdTYwNkZcbiAgICAgICAgY29uc3QgZmlsZUNvbnRlbnQgPSBhd2FpdCBmcy5yZWFkRmlsZShmaWxlUGF0aCwgJ3V0Zi04Jyk7XG4gICAgICAgIGNvbnN0IHsgZGF0YTogbWF0dGVyRGF0YSB9ID0gbWF0dGVyKGZpbGVDb250ZW50KTtcblxuICAgICAgICBpZiAobWF0dGVyRGF0YS5oaWRkZW4pIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gXHU0RjdGXHU3NTI4XHU2NjIwXHU1QzA0XHU4ODY4XHU4M0I3XHU1M0Q2XHU2NjNFXHU3OTNBXHU1NDBEXHU3OUYwXG4gICAgICAgIGNvbnN0IGNhdGVnb3J5TmFtZSA9IENBVEVHT1JZX01BUFtjYXRlZ29yeUtleV0gfHwgY2F0ZWdvcnlLZXk7XG5cbiAgICAgICAgbGV0IGN1cnJlbnRMZXZlbDogU2lkZWJhckl0ZW1bXSA9IHNpZGViYXJbY2F0ZWdvcnlLZXldIHx8IFtdO1xuXG4gICAgICAgIGlmICghc2lkZWJhcltjYXRlZ29yeUtleV0pIHtcbiAgICAgICAgICAgIHNpZGViYXJbY2F0ZWdvcnlLZXldID0gY3VycmVudExldmVsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gXHU5MDEyXHU1RjUyXHU2Nzg0XHU1RUZBXHU1QzQyXHU3RUE3XHU3RUQzXHU2Nzg0XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2VnbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHNlZ21lbnQgPSBzZWdtZW50c1tpXS5yZXBsYWNlKCcubWQnLCAnJyk7XG4gICAgICAgICAgICBjb25zdCBpc0xhc3QgPSBpID09PSBzZWdtZW50cy5sZW5ndGggLSAxO1xuXG4gICAgICAgICAgICAvLyBcdTRGRUVcdTY1MzlcdTk0RkVcdTYzQTVcdTc1MUZcdTYyMTBcdTkwM0JcdThGOTFcbiAgICAgICAgICAgIGxldCBsaW5rO1xuICAgICAgICAgICAgaWYgKGlzTGFzdCkge1xuICAgICAgICAgICAgICAgIC8vIFx1NEUzQVx1NjU4N1x1NEVGNlx1NzUxRlx1NjIxMFx1OTRGRVx1NjNBNVxuICAgICAgICAgICAgICAgIGxpbmsgPSBgLyR7c2VnbWVudHMuc2xpY2UoMCwgaSArIDEpLmpvaW4oJy8nKX1gLnJlcGxhY2UoL1xcLm1kJC8sICcnKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaSA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGxpbmsgPSBgLyR7c2VnbWVudH1gO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBvcmRlciA9IGV4dHJhY3RPcmRlck51bWJlcihzZWdtZW50LCBtYXR0ZXJEYXRhKTsgLy8gXHU2M0QwXHU1M0Q2XHU2MzkyXHU1RThGXHU1M0Y3XG5cbiAgICAgICAgICAgIGlmIChpc0xhc3QpIHtcbiAgICAgICAgICAgICAgICAvLyBcdTZERkJcdTUyQTBcdTY3MDBcdTdFQzhcdTY1ODdcdTRFRjZcdTk4NzlcbiAgICAgICAgICAgICAgICBjb25zdCB0aXRsZSA9IGF3YWl0IGdldFRpdGxlRnJvbUZpbGUoZmlsZVBhdGgsIG1hdHRlckRhdGEpO1xuICAgICAgICAgICAgICAgIC8vIFx1NkRGQlx1NTJBMCBhY3RpdmVNYXRjaCBcdTRFRTVcdTY1MkZcdTYzMDFcdTY2RjRcdTdDQkVcdTc4NkVcdTc2ODRcdTlBRDhcdTRFQUVcdTUzMzlcdTkxNERcbiAgICAgICAgICAgICAgICBjb25zdCBhY3RpdmVNYXRjaCA9IGBeJHtsaW5rfSg/Oi98JClgO1xuICAgICAgICAgICAgICAgIGN1cnJlbnRMZXZlbC5wdXNoKHsgdGV4dDogdGl0bGUsIGxpbmssIG9yZGVyLCBhY3RpdmVNYXRjaCB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gXHU2N0U1XHU2MjdFXHU2MjE2XHU1MjFCXHU1RUZBXHU3NkVFXHU1RjU1XHU1MjA2XHU3RUM0XG4gICAgICAgICAgICAgICAgbGV0IGRpc3BsYXlUZXh0ID0gaSA9PT0gMCA/IGNhdGVnb3J5TmFtZSA6IHNlZ21lbnQ7XG5cbiAgICAgICAgICAgICAgICAvLyBcdTc5RkJcdTk2NjRcdTY1NzBcdTVCNTdcdTUyNERcdTdGMDBcbiAgICAgICAgICAgICAgICBkaXNwbGF5VGV4dCA9IGRpc3BsYXlUZXh0LnJlcGxhY2UoL15cXGQrLVxccyovLCAnJyk7XG5cbiAgICAgICAgICAgICAgICBsZXQgZ3JvdXAgPSBjdXJyZW50TGV2ZWwuZmluZChpdGVtID0+XG4gICAgICAgICAgICAgICAgICAgIChpID09PSAwICYmIGl0ZW0udGV4dCA9PT0gY2F0ZWdvcnlOYW1lKSB8fFxuICAgICAgICAgICAgICAgICAgICAoaSAhPT0gMCAmJiBpdGVtLnRleHQgPT09IGRpc3BsYXlUZXh0KVxuICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICBpZiAoIWdyb3VwKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGdyb3VwTGluayA9IGkgPT09IDAgPyBgLyR7c2VnbWVudH1gIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICBncm91cCA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6IGRpc3BsYXlUZXh0LFxuICAgICAgICAgICAgICAgICAgICAgICAgaXRlbXM6IFtdLFxuICAgICAgICAgICAgICAgICAgICAgICAgb3JkZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2xsYXBzZWQ6IGkgPiBERUZBVUxUX0NPTExBUFNFRF9JTkRFWF9NQVBbc2VnbWVudHNbMF1dLFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gXHU0RTNBXHU3NkVFXHU1RjU1XHU2REZCXHU1MkEwXHU2RDNCXHU1MkE4XHU1MzM5XHU5MTREXHU2QTIxXHU1RjBGXG4gICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmVNYXRjaDogYF4vJHtzZWdtZW50fSg/Oi98JClgLFxuICAgICAgICAgICAgICAgICAgICAgICAgbGluazogZ3JvdXBMaW5rXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRMZXZlbC5wdXNoKGdyb3VwKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY3VycmVudExldmVsID0gZ3JvdXAuaXRlbXMgfHwgW107XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBcdTVCRjlcdTZCQ0ZcdTRFMkFcdTVDNDJcdTdFQTdcdThGREJcdTg4NENcdTYzOTJcdTVFOEZcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBzaWRlYmFyKSB7XG4gICAgICAgIHNvcnRTaWRlYmFySXRlbXMoc2lkZWJhcltrZXldKTtcbiAgICB9XG5cbiAgICAvLyBcdTc5RkJcdTk2NjRcdTdCMkNcdTRFMDBcdTdFQTdcdUZGMENcdTVDMDZcdTZCQ0ZcdTRFMDBcdTRFMkFcdTdCMkNcdTRFMDBcdTdFQTdcdTRFMkRcdTc2ODRpdGVtc1x1NUU3M1x1OTRGQVx1NTIzMFx1NEUwMFx1N0VBN1xuICAgIGNvbnN0IHNpZGViYXJGbGF0OiBSZWNvcmQ8c3RyaW5nLCBTaWRlYmFySXRlbVtdPiA9IHt9O1xuICAgIGZvciAoY29uc3Qga2V5IGluIHNpZGViYXIpIHtcbiAgICAgICAgc2lkZWJhckZsYXRba2V5XSA9IFtdO1xuICAgICAgICBzaWRlYmFyW2tleV0uZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgIGlmIChpdGVtLml0ZW1zKSB7XG4gICAgICAgICAgICAgICAgc2lkZWJhckZsYXRba2V5XS5wdXNoKC4uLml0ZW0uaXRlbXMpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBzaWRlYmFyRmxhdFtrZXldLnB1c2goaXRlbSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIFx1NTkwNFx1NzQwNndpa2lcbiAgICBjb25zdCB3aWtpID0gZ2VuZXJhdGVXaWtpU2lkZWJhcihwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwgJ2RvY3MnKSwgcGF0aC5qb2luKHByb2Nlc3MuY3dkKCksICdkb2NzL3dpa2knKSk7XG4gICAgY29uc3Qgd2lraVNpZGViYXI6IFNpZGViYXJJdGVtW10gPSBbXTtcbiAgICB3aWtpLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgIGlmIChpdGVtLmRhdGEuY2F0ZWdvcmllcykge1xuICAgICAgICAgICAgLy8gXHU0RTAwXHU3RUE3XHU1OTI3XHU1MjA2XHU3QzdCXG5cbiAgICAgICAgICAgIC8vIFx1NEU4Q1x1N0VBN1x1NTIwNlx1N0M3QlxuICAgICAgICAgICAgY29uc3Qgc2Vjb25kVXJsczogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgICAgIGNvbnN0IHNlY29uZCA9IGl0ZW0uZGF0YS5jYXRlZ29yaWVzLm1hcCgoY2F0ZWdvcnk6IGFueSkgPT4geztcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICB0ZXh0OiBjYXRlZ29yeS50aXRsZSxcbiAgICAgICAgICAgICAgICAgICAgY29sbGFwc2VkOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgaXRlbXM6IGl0ZW0uY2hpbGRyZW5cbiAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoY2hpbGQgPT4gY2hpbGQuZGF0YS5jYXRlZ29yeSA9PT0gY2F0ZWdvcnkudGl0bGUpXG4gICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKGNoaWxkID0+IGNoaWxkLmxpbmspXG4gICAgICAgICAgICAgICAgICAgICAgICAubWFwKGNoaWxkID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNvbmRVcmxzLnB1c2goY2hpbGQubGluayk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogY2hpbGQudGV4dCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluazogY2hpbGQubGluayxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlTWF0Y2g6IGNoaWxkLmFjdGl2ZU1hdGNoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIC8vIFx1NTMzOVx1OTE0RFx1NTIzMFx1NEUwMFx1N0VBN1x1NEY0Nlx1NjYyRlx1NjcyQVx1NTMzOVx1OTE0RFx1NTIzMFx1NEU4Q1x1N0VBN1xuICAgICAgICAgICAgY29uc3Qgbm90TWF0Y2hlZCA9IGl0ZW0uY2hpbGRyZW5cbiAgICAgICAgICAgICAgICAuZmlsdGVyKGNoaWxkID0+ICFzZWNvbmRVcmxzLmluY2x1ZGVzKGNoaWxkLmxpbmspKVxuICAgICAgICAgICAgICAgIC5maWx0ZXIoY2hpbGQgPT4gY2hpbGQubGluaylcbiAgICAgICAgICAgICAgICAubWFwKGNoaWxkID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6IGNoaWxkLnRleHQsXG4gICAgICAgICAgICAgICAgICAgICAgICBsaW5rOiBjaGlsZC5saW5rLFxuICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlTWF0Y2g6IGNoaWxkLmFjdGl2ZU1hdGNoXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgd2lraVNpZGViYXIucHVzaCh7XG4gICAgICAgICAgICAgICAgdGV4dDogaXRlbS5kYXRhLnRpdGxlLFxuICAgICAgICAgICAgICAgIGNvbGxhcHNlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBpdGVtczogWy4uLnNlY29uZCwgLi4ubm90TWF0Y2hlZF1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gXHU0RTAwXHU3RUE3XHU1OTI3XHU1MjA2XHU3QzdCXG4gICAgICAgICAgICB3aWtpU2lkZWJhci5wdXNoKHtcbiAgICAgICAgICAgICAgICB0ZXh0OiBpdGVtLnRleHQsXG4gICAgICAgICAgICAgICAgY29sbGFwc2VkOiB0cnVlLFxuICAgICAgICAgICAgICAgIGl0ZW1zOiBpdGVtLmNoaWxkcmVuXG4gICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoY2hpbGQgPT4gY2hpbGQubGluaylcbiAgICAgICAgICAgICAgICAgICAgLm1hcChjaGlsZCA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6IGNoaWxkLnRleHQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluazogY2hpbGQubGluayxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmVNYXRjaDogY2hpbGQuYWN0aXZlTWF0Y2hcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgLy8gXHU2REZCXHU1MkEwIHdpa2lcbiAgICBzaWRlYmFyRmxhdFsnd2lraSddID0gd2lraVNpZGViYXI7XG5cbiAgICByZXR1cm4gc2lkZWJhckZsYXQ7XG59XG5cbi8qKlxuICogXHU5MDEyXHU1RjUyXHU2MzkyXHU1RThGXHU0RkE3XHU4RkI5XHU2ODBGXHU5ODc5XHU3NkVFXG4gKi9cbmZ1bmN0aW9uIHNvcnRTaWRlYmFySXRlbXMoaXRlbXM6IFNpZGViYXJJdGVtW10pOiB2b2lkIHtcbiAgICAvLyBcdTY4MzlcdTYzNkUgb3JkZXIgXHU1QjU3XHU2QkI1XHU2MzkyXHU1RThGXG4gICAgaXRlbXMuc29ydCgoYSwgYikgPT4ge1xuICAgICAgICBjb25zdCBvcmRlckEgPSBhLm9yZGVyID8/IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSO1xuICAgICAgICBjb25zdCBvcmRlckIgPSBiLm9yZGVyID8/IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSO1xuICAgICAgICByZXR1cm4gb3JkZXJBIC0gb3JkZXJCO1xuICAgIH0pO1xuXG4gICAgLy8gXHU5MDEyXHU1RjUyXHU2MzkyXHU1RThGXHU1QjUwXHU5ODc5XG4gICAgaXRlbXMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgaWYgKGl0ZW0uaXRlbXMgJiYgaXRlbS5pdGVtcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBzb3J0U2lkZWJhckl0ZW1zKGl0ZW0uaXRlbXMpO1xuICAgICAgICB9XG4gICAgfSk7XG59XG5cbi8qKlxuICogXHU0RUNFXHU2NTg3XHU0RUY2IEZyb250bWF0dGVyIFx1NjIxNlx1NjU4N1x1NEVGNlx1NTQwRFx1NjNEMFx1NTNENlx1NjgwN1x1OTg5OFxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRUaXRsZUZyb21GaWxlKGZpbGVQYXRoOiBzdHJpbmcsIG1hdHRlckRhdGE6IGFueSk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgaWYgKG1hdHRlckRhdGEudGl0bGUpIHtcbiAgICAgICAgcmV0dXJuIG1hdHRlckRhdGEudGl0bGUudHJpbSgpLnJlcGxhY2UoL1snXCJdL2csICcnKTtcbiAgICB9XG4gICAgLy8gXHU1OTgyXHU2NzlDXHU2Q0ExXHU2NzA5IGZyb250bWF0dGVyIHRpdGxlXHVGRjBDXHU0RUNFXHU2NTg3XHU0RUY2XHU1NDBEXHU4M0I3XHU1M0Q2XG4gICAgY29uc3QgYmFzZW5hbWUgPSBwYXRoLmJhc2VuYW1lKGZpbGVQYXRoLCAnLm1kJyk7XG4gICAgLy8gXHU2NjZFXHU5MDFBXHU2NTg3XHU0RUY2XHVGRjBDXHU3OUZCXHU5NjY0XHU2NTcwXHU1QjU3XHU1MjREXHU3RjAwXHU1NDhDXHU4RkRFXHU1QjU3XHU3QjI2XG4gICAgcmV0dXJuIGJhc2VuYW1lLnJlcGxhY2UoL15cXGQrLVxccyovLCAnJykucmVwbGFjZSgvLS9nLCAnICcpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBnZW5lcmF0ZVNpZGViYXI7XG4iLCAiY29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2Rpcm5hbWUgPSBcIi9Vc2Vycy9mYW5neWl6aG91L0RvY3VtZW50cy9jb2RpbmcvbmV0ZWFzZS1tb2RzZGstd2lraS9zY3JpcHRzXCI7Y29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2ZpbGVuYW1lID0gXCIvVXNlcnMvZmFuZ3lpemhvdS9Eb2N1bWVudHMvY29kaW5nL25ldGVhc2UtbW9kc2RrLXdpa2kvc2NyaXB0cy9zaWRlYmFyLXdpa2kudHNcIjtjb25zdCBfX3ZpdGVfaW5qZWN0ZWRfb3JpZ2luYWxfaW1wb3J0X21ldGFfdXJsID0gXCJmaWxlOi8vL1VzZXJzL2Zhbmd5aXpob3UvRG9jdW1lbnRzL2NvZGluZy9uZXRlYXNlLW1vZHNkay13aWtpL3NjcmlwdHMvc2lkZWJhci13aWtpLnRzXCI7aW1wb3J0IGZzIGZyb20gJ2ZzJ1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCdcbmltcG9ydCBtYXR0ZXIgZnJvbSAnZ3JheS1tYXR0ZXInXG5pbXBvcnQgZmV0Y2ggZnJvbSAnbm9kZS1mZXRjaCdcblxuY29uc3QgYmFzZVVybCA9ICcvJ1xuXG4vLyBkZWZpbmUgd2hldGhlciBiaWcgcGFnZXMgc2hvdWxkIGJlIGJ1aWx0LlxuLy8gZmFzdEJ1aWxkIHNob3VsZCBvbmx5IGJlIHVzZWQgd2hlbiB0ZXN0aW5nLCBzaW5jZSBpdCB3aWxsIG5vdCBjb21waWxlIHNvbWUgb2YgdGhlIHdpa2lzIGNvbnRlbnQuXG5jb25zdCBleGNsdWRlRmlsZXMgPSBbXG4gICAgJ2VudGl0aWVzL3ZhbmlsbGEtdXNhZ2UtY29tcG9uZW50cy5tZCcsXG4gICAgJ2VudGl0aWVzL3ZhbmlsbGEtdXNhZ2Utc3Bhd24tcnVsZXMubWQnLFxuICAgICdlbnRpdGllcy92dWMtZnVsbC5tZCcsXG4gICAgJ2VudGl0aWVzL3Z1c3ItZnVsbC5tZCcsXG5dXG5cbmNvbnN0IGZhc3RCdWlsZCA9IHByb2Nlc3MuZW52LmZhc3RCdWlsZCA9PT0gJ3RydWUgJyAvLyBTUEFDRSBoYXMgdG8gYmUgdGhlcmUsIHNpbmNlIHRoZSBTRVQgdmFyPXZhbCBjb21tYW5kIGFkZHMgYSBzcGFjZSBhdCB0aGUgZW5kIVxuXG5pZiAoZmFzdEJ1aWxkICYmIHByb2Nlc3MuZW52Lk5PREVfRU5WID09ICdwcm9kdWN0aW9uJykge1xuICAgIGNvbnNvbGUubG9nKFxuICAgICAgICBgXFxuSU5GTzogZmFzdEJ1aWxkIHNlbGVjdGVkLiB0aGUgZmlsZXM6XFxuJHtKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICAgIGV4Y2x1ZGVGaWxlcyxcbiAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICA0XG4gICAgICAgICl9XFxud2lsbCBub3QgYmUgY29tcGlsZWQhXFxuYFxuICAgIClcbn1cblxuZnVuY3Rpb24gZm9ybWF0TGluayhwYXRoOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gcGF0aC5zcGxpdCgvXFxcXHxcXC8vZykuam9pbignLycpLnJlcGxhY2UoJy5tZCcsICcnKVxufVxuXG4vKlxuR2V0cyB0aGUgY2F0ZWdvcmllcyBmcm9tIHdpdGhpbiB0aGUgZnJvbnRtYXR0ZXIgb2YgYW4gaW5kZXgubWQgZmlsZSwgYW5kIHJldHVybnMgdGhlbSBhcyBsaXN0LlxuICovXG5mdW5jdGlvbiBnZXRDYXRlZ29yeU9yZGVyKGZyb250TWF0dGVyOiBtYXR0ZXIuR3JheU1hdHRlckZpbGU8c3RyaW5nPikge1xuICAgIGNvbnN0IGRhdGE6IHsgW0tleTogc3RyaW5nXTogbnVtYmVyIH0gPSB7fVxuICAgIGlmICghZnJvbnRNYXR0ZXIuZGF0YS5jYXRlZ29yaWVzKSB7XG4gICAgICAgIHJldHVybiBkYXRhXG4gICAgfVxuXG4gICAgZnJvbnRNYXR0ZXIuZGF0YS5jYXRlZ29yaWVzLmZvckVhY2goZnVuY3Rpb24gKFxuICAgICAgICBjYXRlZ29yeTogeyB0aXRsZTogc3RyaW5nIHwgbnVtYmVyIH0sXG4gICAgICAgIGluZGV4OiBudW1iZXJcbiAgICApIHtcbiAgICAgICAgZGF0YVtjYXRlZ29yeS50aXRsZV0gPSBpbmRleCArIDFcbiAgICB9KVxuXG4gICAgcmV0dXJuIGRhdGFcbn1cblxuZnVuY3Rpb24gZ2V0Q2F0ZWdvcmllcyhmcm9udE1hdHRlcjogbWF0dGVyLkdyYXlNYXR0ZXJGaWxlPHN0cmluZz4pIHtcbiAgICBjb25zdCBkYXRhOiB7XG4gICAgICAgIHRleHQ6IGFueVxuICAgICAgICBkYXRhOiBhbnlcbiAgICAgICAgdGFnczogYW55XG4gICAgICAgIHByZWZpeDogYW55XG4gICAgICAgIHNlY3Rpb246IGJvb2xlYW5cbiAgICAgICAgY29sb3I6IGFueVxuICAgICAgICBsaW5rOiBzdHJpbmdcbiAgICAgICAgYWN0aXZlTWF0Y2g6IHN0cmluZ1xuICAgIH1bXSA9IFtdXG4gICAgaWYgKCFmcm9udE1hdHRlci5kYXRhLmNhdGVnb3JpZXMpIHtcbiAgICAgICAgcmV0dXJuIGRhdGFcbiAgICB9XG5cbiAgICBmcm9udE1hdHRlci5kYXRhLmNhdGVnb3JpZXMuZm9yRWFjaChmdW5jdGlvbiAoXG4gICAgICAgIGNhdGVnb3J5OiB7XG4gICAgICAgICAgICBuYXZfb3JkZXI6IG51bWJlclxuICAgICAgICAgICAgY2F0ZWdvcnk6IGFueVxuICAgICAgICAgICAgdGl0bGU6IGFueVxuICAgICAgICAgICAgdGFnczogYW55XG4gICAgICAgICAgICBwcmVmaXg6IGFueVxuICAgICAgICAgICAgY29sb3I6IGFueVxuICAgICAgICB9LFxuICAgICAgICBpbmRleDogYW55XG4gICAgKSB7XG4gICAgICAgIGNhdGVnb3J5Lm5hdl9vcmRlciA9IC0xXG4gICAgICAgIGNhdGVnb3J5LmNhdGVnb3J5ID0gY2F0ZWdvcnkudGl0bGVcbiAgICAgICAgZGF0YS5wdXNoKHtcbiAgICAgICAgICAgIHRleHQ6IGNhdGVnb3J5LnRpdGxlLFxuICAgICAgICAgICAgZGF0YTogY2F0ZWdvcnksXG4gICAgICAgICAgICB0YWdzOiBjYXRlZ29yeS50YWdzLFxuICAgICAgICAgICAgcHJlZml4OiBjYXRlZ29yeS5wcmVmaXgsXG4gICAgICAgICAgICBzZWN0aW9uOiB0cnVlLFxuICAgICAgICAgICAgY29sb3I6IGNhdGVnb3J5LmNvbG9yLFxuICAgICAgICAgICAgbGluazogJycsXG4gICAgICAgICAgICBhY3RpdmVNYXRjaDogJyAnLFxuICAgICAgICB9KVxuICAgIH0pXG5cbiAgICByZXR1cm4gZGF0YVxufVxuXG5sZXQgb3JkZXI6IHsgW0tleTogc3RyaW5nXTogbnVtYmVyIH1cblxuLypcblJlY3Vyc2l2ZWx5IGdlbmVyYXRlIHRoZSBuYXZpZ2F0aW9uIGxpbmtzIGZvciB0aGUgc2lkZWJhci5cbiovXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVXaWtpU2lkZWJhcihiYXNlOiBzdHJpbmcsIGRpcjogc3RyaW5nKSB7XG4gICAgY29uc3QgZGF0YToge1xuICAgICAgICB0ZXh0OiBhbnlcbiAgICAgICAgZGF0YTogeyBba2V5OiBzdHJpbmddOiBhbnkgfVxuICAgICAgICBjaGlsZHJlbj86IGFueVxuICAgICAgICB0YWdzPzogYW55XG4gICAgICAgIHByZWZpeD86IGFueVxuICAgICAgICBzZWN0aW9uPzogYW55XG4gICAgICAgIGNvbG9yPzogYW55XG4gICAgICAgIGxpbms/OiBzdHJpbmdcbiAgICAgICAgYWN0aXZlTWF0Y2g/OiBzdHJpbmdcbiAgICB9W10gPSBbXVxuICAgIGNvbnN0IGZpbGVzID0gZnMucmVhZGRpclN5bmMoZGlyKVxuXG4gICAgZmlsZXMuZm9yRWFjaChmdW5jdGlvbiAoZmlsZSkge1xuICAgICAgICBsZXQgam9pbmVkUGF0aCA9IHBhdGguam9pbihkaXIsIGZpbGUpXG4gICAgICAgIGNvbnN0IHN0YXRzID0gZnMuc3RhdFN5bmMoam9pbmVkUGF0aClcbiAgICAgICAgLy8gSGFuZGxlIHRvcCBsZXZlbCBkaXJlY3Rvcmllc1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICBzdGF0cy5pc0RpcmVjdG9yeSgpICYmXG4gICAgICAgICAgICBmcy5leGlzdHNTeW5jKHBhdGguam9pbihqb2luZWRQYXRoLCAnaW5kZXgubWQnKSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBjb25zdCBzdHIgPSBmcy5yZWFkRmlsZVN5bmMoXG4gICAgICAgICAgICAgICAgcGF0aC5qb2luKGpvaW5lZFBhdGgsICdpbmRleC5tZCcpLFxuICAgICAgICAgICAgICAgICd1dGY4J1xuICAgICAgICAgICAgKVxuICAgICAgICAgICAgbGV0IGZyb250TWF0dGVyXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGZyb250TWF0dGVyID0gbWF0dGVyKHN0cilcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBqb2luZWRQYXRoID0gcGF0aC5yZWxhdGl2ZShcbiAgICAgICAgICAgICAgICAgICAgcHJvY2Vzcy5jd2QoKSxcbiAgICAgICAgICAgICAgICAgICAgcGF0aC5qb2luKGpvaW5lZFBhdGgsICdpbmRleC5tZCcpXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgIGA6OmVycm9yIGZpbGU9JHtqb2luZWRQYXRofSxsaW5lPTEsY29sPTE6OkZpbGUgJHtqb2luZWRQYXRofSBoYXMgaW52YWxpZCBmcm9udG1hdHRlciEgJHtlLm1lc3NhZ2V9YFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgYEZpbGUgJHtqb2luZWRQYXRofSBoYXMgaW52YWxpZCBmcm9udG1hdHRlciEgJHtlLm1lc3NhZ2V9YFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgb3JkZXIgPSBnZXRDYXRlZ29yeU9yZGVyKGZyb250TWF0dGVyKVxuXG4gICAgICAgICAgICBjb25zdCBjaGlsZHJlbiA9IGdlbmVyYXRlV2lraVNpZGViYXIoYmFzZSwgam9pbmVkUGF0aCkuY29uY2F0KFxuICAgICAgICAgICAgICAgIGdldENhdGVnb3JpZXMoZnJvbnRNYXR0ZXIpXG4gICAgICAgICAgICApXG5cbiAgICAgICAgICAgIGNoaWxkcmVuLnNvcnQoXG4gICAgICAgICAgICAgICAgKFxuICAgICAgICAgICAgICAgICAgICB7IGRhdGE6IGRhdGFBLCB0ZXh0OiB0ZXh0QSB9LFxuICAgICAgICAgICAgICAgICAgICB7IGRhdGE6IGRhdGFCLCB0ZXh0OiB0ZXh0QiB9XG4gICAgICAgICAgICAgICAgKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8vIERlZmF1bHQgdG8gbWF4IGludCwgc28gd2l0aG91dCBuYXYgb3JkZXIgeW91IHdpbGwgc2hvdyBzZWNvbmRcbiAgICAgICAgICAgICAgICAgICAgLy8gTXVsdGlwbHkgYnkgY2F0ZWdvcnkgdmFsdWUgaWYgaXQgZXhpc3RzXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5hdkEgPVxuICAgICAgICAgICAgICAgICAgICAgICAgKGRhdGFBLm5hdl9vcmRlciB8fCA1MCkgK1xuICAgICAgICAgICAgICAgICAgICAgICAgKG9yZGVyW2RhdGFBLmNhdGVnb3J5XSB8fCAwKSAqIDEwMCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmF2QiA9XG4gICAgICAgICAgICAgICAgICAgICAgICAoZGF0YUIubmF2X29yZGVyIHx8IDUwKSArXG4gICAgICAgICAgICAgICAgICAgICAgICAob3JkZXJbZGF0YUIuY2F0ZWdvcnldIHx8IDApICogMTAwIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUlxuXG4gICAgICAgICAgICAgICAgICAgIC8vIFRpZSBnb2VzIHRvIHRoZSB0ZXh0IGNvbXBhcmUhIChXaWxsIGFsc28gYXBwbHkgZm9yIGVsZW1lbnRzIHdpdGhvdXQgbmF2IG9yZGVyKVxuICAgICAgICAgICAgICAgICAgICBpZiAobmF2QSA9PSBuYXZCKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGV4dEEubG9jYWxlQ29tcGFyZSh0ZXh0QilcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIFJldHVybiBuYXYgb3JkZXJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5hdkEgLSBuYXZCXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgZGF0YS5wdXNoKHtcbiAgICAgICAgICAgICAgICB0ZXh0OiBmcm9udE1hdHRlci5kYXRhLnRpdGxlLFxuICAgICAgICAgICAgICAgIGRhdGE6IGZyb250TWF0dGVyLmRhdGEsXG4gICAgICAgICAgICAgICAgY2hpbGRyZW46IGNoaWxkcmVuLFxuICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgaWYgKGZyb250TWF0dGVyLmRhdGEudGl0bGUgPT09IHZvaWQgMCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgJ0ZpbGUgJyArXG4gICAgICAgICAgICAgICAgICAgIHBhdGguam9pbihqb2luZWRQYXRoLCAnaW5kZXgubWQnKSArXG4gICAgICAgICAgICAgICAgICAgICcgaGFzIGludmFsaWQgZnJvbnRtYXR0ZXIhJ1xuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEhhbmRsZSB0aGUgbm9ybWFsIGZpbGVzXG4gICAgICAgIGVsc2UgaWYgKHN0YXRzLmlzRmlsZSgpKSB7XG4gICAgICAgICAgICAvLyBEb24ndCBpbmNsdWRlIG5vbi1tYXJrZG93biBmaWxlcywgb3IgdGhlIGluZGV4IHBhZ2UgaXRzZWxmXG4gICAgICAgICAgICBpZiAoIWZpbGUuZW5kc1dpdGgoJy5tZCcpIHx8IGZpbGUuZW5kc1dpdGgoJ2luZGV4Lm1kJykpIHJldHVyblxuXG4gICAgICAgICAgICBjb25zdCBzdHIgPSBmcy5yZWFkRmlsZVN5bmMoam9pbmVkUGF0aCwgJ3V0ZjgnKVxuICAgICAgICAgICAgbGV0IGZyb250TWF0dGVyXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGZyb250TWF0dGVyID0gbWF0dGVyKHN0cilcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBqb2luZWRQYXRoID0gcGF0aC5yZWxhdGl2ZShwcm9jZXNzLmN3ZCgpLCBqb2luZWRQYXRoKVxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgIGA6OmVycm9yIGZpbGU9JHtqb2luZWRQYXRofSxsaW5lPTEsY29sPTE6OkZpbGUgJHtqb2luZWRQYXRofSBoYXMgaW52YWxpZCBmcm9udG1hdHRlciEgJHtlLm1lc3NhZ2V9YFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgYEZpbGUgJHtqb2luZWRQYXRofSBoYXMgaW52YWxpZCBmcm9udG1hdHRlciEgJHtlLm1lc3NhZ2V9YFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGxpbmsgPSBmb3JtYXRMaW5rKGpvaW5lZFBhdGgudG9TdHJpbmcoKS5yZXBsYWNlKGJhc2UsICcnKSlcblxuICAgICAgICAgICAgLy8gRG9uJ3QgaW5jbHVkZSBoaWRkZW4gcGFnZXMgKGlnbm9yZXMgY2hpbGRyZW4pXG4gICAgICAgICAgICBpZiAoZnJvbnRNYXR0ZXIuZGF0YS5oaWRkZW4gPT09IHRydWUpIHJldHVyblxuXG4gICAgICAgICAgICBsZXQgcHJlZml4ID0gbnVsbFxuXG4gICAgICAgICAgICBpZiAoZnJvbnRNYXR0ZXIuZGF0YS5wcmVmaXggIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHByZWZpeCA9IGZyb250TWF0dGVyLmRhdGEucHJlZml4XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCB0YWdzID0gbnVsbFxuXG4gICAgICAgICAgICBpZiAoZnJvbnRNYXR0ZXIuZGF0YS50YWdzICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0YWdzID0gZnJvbnRNYXR0ZXIuZGF0YS50YWdzXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkYXRhLnB1c2goe1xuICAgICAgICAgICAgICAgIHRleHQ6IGZyb250TWF0dGVyLmRhdGEudGl0bGUsXG4gICAgICAgICAgICAgICAgZGF0YTogZnJvbnRNYXR0ZXIuZGF0YSxcbiAgICAgICAgICAgICAgICB0YWdzOiB0YWdzLFxuICAgICAgICAgICAgICAgIHByZWZpeDogcHJlZml4LFxuICAgICAgICAgICAgICAgIHNlY3Rpb246IGZyb250TWF0dGVyLmRhdGEuc2VjdGlvbiB8fCBmYWxzZSxcbiAgICAgICAgICAgICAgICBjb2xvcjogZnJvbnRNYXR0ZXIuZGF0YS5jb2xvciB8fCAnbm9uZScsXG4gICAgICAgICAgICAgICAgbGluayxcbiAgICAgICAgICAgICAgICBhY3RpdmVNYXRjaDogYF4ke2xpbmt9YCxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICBpZiAoZnJvbnRNYXR0ZXIuZGF0YS50aXRsZSA9PT0gdm9pZCAwKSB7XG4gICAgICAgICAgICAgICAgam9pbmVkUGF0aCA9IHBhdGgucmVsYXRpdmUocHJvY2Vzcy5jd2QoKSwgam9pbmVkUGF0aClcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgICAgICAgICAgYDo6ZXJyb3IgZmlsZT0ke2pvaW5lZFBhdGh9LGxpbmU9MSxjb2w9MTo6RmlsZSAke2pvaW5lZFBhdGh9IGhhcyBpbnZhbGlkIGZyb250bWF0dGVyIWBcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGaWxlICR7am9pbmVkUGF0aH0gaGFzIGludmFsaWQgZnJvbnRtYXR0ZXIhYClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pXG5cbiAgICByZXR1cm4gZGF0YS5zb3J0KFxuICAgICAgICAoeyBkYXRhOiBkYXRhQSwgdGV4dDogdGV4dEEgfSwgeyBkYXRhOiBkYXRhQiwgdGV4dDogdGV4dEIgfSkgPT4ge1xuICAgICAgICAgICAgLy8gRGVmYXVsdCB0byBtYXggaW50LCBzbyB3aXRob3V0IG5hdiBvcmRlciB5b3Ugd2lsbCBzaG93IHNlY29uZFxuICAgICAgICAgICAgLy8gTXVsdGlwbHkgYnkgY2F0ZWdvcnkgdmFsdWUgaWYgaXQgZXhpc3RzXG4gICAgICAgICAgICBjb25zdCBuYXZBID1cbiAgICAgICAgICAgICAgICAoZGF0YUEubmF2X29yZGVyIHx8IDUwKSArIChvcmRlcltkYXRhQS5jYXRlZ29yeV0gfHwgMCkgKiAxMDAgfHxcbiAgICAgICAgICAgICAgICBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUlxuICAgICAgICAgICAgY29uc3QgbmF2QiA9XG4gICAgICAgICAgICAgICAgKGRhdGFCLm5hdl9vcmRlciB8fCA1MCkgKyAob3JkZXJbZGF0YUIuY2F0ZWdvcnldIHx8IDApICogMTAwIHx8XG4gICAgICAgICAgICAgICAgTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVJcblxuICAgICAgICAgICAgLy8gVGllIGdvZXMgdG8gdGhlIHRleHQgY29tcGFyZSEgKFdpbGwgYWxzbyBhcHBseSBmb3IgZWxlbWVudHMgd2l0aG91dCBuYXYgb3JkZXIpXG4gICAgICAgICAgICBpZiAobmF2QSA9PSBuYXZCKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRleHRBLmxvY2FsZUNvbXBhcmUodGV4dEIpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFJldHVybiBuYXYgb3JkZXJcbiAgICAgICAgICAgIHJldHVybiBuYXZBIC0gbmF2QlxuICAgICAgICB9XG4gICAgKVxufSJdLAogICJtYXBwaW5ncyI6ICI7QUFDQSxTQUFTLGVBQWUsV0FBVzs7O0FDRGlVLE9BQU9BLFNBQVE7QUFDblgsT0FBT0MsV0FBVTtBQUNqQixPQUFPLFFBQVE7QUFDZixPQUFPQyxhQUFZOzs7QUNIMlYsT0FBTyxRQUFRO0FBQzdYLE9BQU8sVUFBVTtBQUNqQixPQUFPLFlBQVk7QUFPbkIsSUFBTSxlQUFlO0FBQUEsRUFDakI7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFDSjtBQUVBLElBQU0sWUFBWSxRQUFRLElBQUksY0FBYztBQUU1QyxJQUFJLGFBQWEsUUFBUSxJQUFJLFlBQVksY0FBYztBQUNuRCxVQUFRO0FBQUEsSUFDSjtBQUFBO0FBQUEsRUFBMkMsS0FBSztBQUFBLE1BQzVDO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxJQUNKLENBQUM7QUFBQTtBQUFBO0FBQUEsRUFDTDtBQUNKO0FBRUEsU0FBUyxXQUFXQyxPQUFjO0FBQzlCLFNBQU9BLE1BQUssTUFBTSxRQUFRLEVBQUUsS0FBSyxHQUFHLEVBQUUsUUFBUSxPQUFPLEVBQUU7QUFDM0Q7QUFLQSxTQUFTLGlCQUFpQixhQUE0QztBQUNsRSxRQUFNLE9BQWtDLENBQUM7QUFDekMsTUFBSSxDQUFDLFlBQVksS0FBSyxZQUFZO0FBQzlCLFdBQU87QUFBQSxFQUNYO0FBRUEsY0FBWSxLQUFLLFdBQVcsUUFBUSxTQUNoQyxVQUNBLE9BQ0Y7QUFDRSxTQUFLLFNBQVMsS0FBSyxJQUFJLFFBQVE7QUFBQSxFQUNuQyxDQUFDO0FBRUQsU0FBTztBQUNYO0FBRUEsU0FBUyxjQUFjLGFBQTRDO0FBQy9ELFFBQU0sT0FTQSxDQUFDO0FBQ1AsTUFBSSxDQUFDLFlBQVksS0FBSyxZQUFZO0FBQzlCLFdBQU87QUFBQSxFQUNYO0FBRUEsY0FBWSxLQUFLLFdBQVcsUUFBUSxTQUNoQyxVQVFBLE9BQ0Y7QUFDRSxhQUFTLFlBQVk7QUFDckIsYUFBUyxXQUFXLFNBQVM7QUFDN0IsU0FBSyxLQUFLO0FBQUEsTUFDTixNQUFNLFNBQVM7QUFBQSxNQUNmLE1BQU07QUFBQSxNQUNOLE1BQU0sU0FBUztBQUFBLE1BQ2YsUUFBUSxTQUFTO0FBQUEsTUFDakIsU0FBUztBQUFBLE1BQ1QsT0FBTyxTQUFTO0FBQUEsTUFDaEIsTUFBTTtBQUFBLE1BQ04sYUFBYTtBQUFBLElBQ2pCLENBQUM7QUFBQSxFQUNMLENBQUM7QUFFRCxTQUFPO0FBQ1g7QUFFQSxJQUFJO0FBS0csU0FBUyxvQkFBb0IsTUFBYyxLQUFhO0FBQzNELFFBQU0sT0FVQSxDQUFDO0FBQ1AsUUFBTSxRQUFRLEdBQUcsWUFBWSxHQUFHO0FBRWhDLFFBQU0sUUFBUSxTQUFVLE1BQU07QUFDMUIsUUFBSSxhQUFhLEtBQUssS0FBSyxLQUFLLElBQUk7QUFDcEMsVUFBTSxRQUFRLEdBQUcsU0FBUyxVQUFVO0FBRXBDLFFBQ0ksTUFBTSxZQUFZLEtBQ2xCLEdBQUcsV0FBVyxLQUFLLEtBQUssWUFBWSxVQUFVLENBQUMsR0FDakQ7QUFDRSxZQUFNLE1BQU0sR0FBRztBQUFBLFFBQ1gsS0FBSyxLQUFLLFlBQVksVUFBVTtBQUFBLFFBQ2hDO0FBQUEsTUFDSjtBQUNBLFVBQUk7QUFDSixVQUFJO0FBQ0Esc0JBQWMsT0FBTyxHQUFHO0FBQUEsTUFDNUIsU0FBUyxHQUFHO0FBQ1IscUJBQWEsS0FBSztBQUFBLFVBQ2QsUUFBUSxJQUFJO0FBQUEsVUFDWixLQUFLLEtBQUssWUFBWSxVQUFVO0FBQUEsUUFDcEM7QUFDQSxnQkFBUTtBQUFBO0FBQUEsVUFFSixnQkFBZ0IsVUFBVSx1QkFBdUIsVUFBVSw2QkFBNkIsRUFBRSxPQUFPO0FBQUEsUUFDckc7QUFDQSxjQUFNLElBQUk7QUFBQTtBQUFBLFVBRU4sUUFBUSxVQUFVLDZCQUE2QixFQUFFLE9BQU87QUFBQSxRQUM1RDtBQUFBLE1BQ0o7QUFFQSxjQUFRLGlCQUFpQixXQUFXO0FBRXBDLFlBQU0sV0FBVyxvQkFBb0IsTUFBTSxVQUFVLEVBQUU7QUFBQSxRQUNuRCxjQUFjLFdBQVc7QUFBQSxNQUM3QjtBQUVBLGVBQVM7QUFBQSxRQUNMLENBQ0ksRUFBRSxNQUFNLE9BQU8sTUFBTSxNQUFNLEdBQzNCLEVBQUUsTUFBTSxPQUFPLE1BQU0sTUFBTSxNQUMxQjtBQUdELGdCQUFNLFFBQ0QsTUFBTSxhQUFhLE9BQ25CLE1BQU0sTUFBTSxRQUFRLEtBQUssS0FBSyxPQUMvQixPQUFPO0FBQ1gsZ0JBQU0sUUFDRCxNQUFNLGFBQWEsT0FDbkIsTUFBTSxNQUFNLFFBQVEsS0FBSyxLQUFLLE9BQy9CLE9BQU87QUFHWCxjQUFJLFFBQVEsTUFBTTtBQUNkLG1CQUFPLE1BQU0sY0FBYyxLQUFLO0FBQUEsVUFDcEM7QUFHQSxpQkFBTyxPQUFPO0FBQUEsUUFDbEI7QUFBQSxNQUNKO0FBQ0EsV0FBSyxLQUFLO0FBQUEsUUFDTixNQUFNLFlBQVksS0FBSztBQUFBLFFBQ3ZCLE1BQU0sWUFBWTtBQUFBLFFBQ2xCO0FBQUEsTUFDSixDQUFDO0FBRUQsVUFBSSxZQUFZLEtBQUssVUFBVSxRQUFRO0FBQ25DLGNBQU0sSUFBSTtBQUFBLFVBQ04sVUFDQSxLQUFLLEtBQUssWUFBWSxVQUFVLElBQ2hDO0FBQUEsUUFDSjtBQUFBLE1BQ0o7QUFBQSxJQUNKLFdBR1MsTUFBTSxPQUFPLEdBQUc7QUFFckIsVUFBSSxDQUFDLEtBQUssU0FBUyxLQUFLLEtBQUssS0FBSyxTQUFTLFVBQVUsRUFBRztBQUV4RCxZQUFNLE1BQU0sR0FBRyxhQUFhLFlBQVksTUFBTTtBQUM5QyxVQUFJO0FBQ0osVUFBSTtBQUNBLHNCQUFjLE9BQU8sR0FBRztBQUFBLE1BQzVCLFNBQVMsR0FBRztBQUNSLHFCQUFhLEtBQUssU0FBUyxRQUFRLElBQUksR0FBRyxVQUFVO0FBQ3BELGdCQUFRO0FBQUE7QUFBQSxVQUVKLGdCQUFnQixVQUFVLHVCQUF1QixVQUFVLDZCQUE2QixFQUFFLE9BQU87QUFBQSxRQUNyRztBQUNBLGNBQU0sSUFBSTtBQUFBO0FBQUEsVUFFTixRQUFRLFVBQVUsNkJBQTZCLEVBQUUsT0FBTztBQUFBLFFBQzVEO0FBQUEsTUFDSjtBQUNBLFlBQU0sT0FBTyxXQUFXLFdBQVcsU0FBUyxFQUFFLFFBQVEsTUFBTSxFQUFFLENBQUM7QUFHL0QsVUFBSSxZQUFZLEtBQUssV0FBVyxLQUFNO0FBRXRDLFVBQUksU0FBUztBQUViLFVBQUksWUFBWSxLQUFLLFVBQVUsTUFBTTtBQUNqQyxpQkFBUyxZQUFZLEtBQUs7QUFBQSxNQUM5QjtBQUVBLFVBQUksT0FBTztBQUVYLFVBQUksWUFBWSxLQUFLLFFBQVEsTUFBTTtBQUMvQixlQUFPLFlBQVksS0FBSztBQUFBLE1BQzVCO0FBQ0EsV0FBSyxLQUFLO0FBQUEsUUFDTixNQUFNLFlBQVksS0FBSztBQUFBLFFBQ3ZCLE1BQU0sWUFBWTtBQUFBLFFBQ2xCO0FBQUEsUUFDQTtBQUFBLFFBQ0EsU0FBUyxZQUFZLEtBQUssV0FBVztBQUFBLFFBQ3JDLE9BQU8sWUFBWSxLQUFLLFNBQVM7QUFBQSxRQUNqQztBQUFBLFFBQ0EsYUFBYSxJQUFJLElBQUk7QUFBQSxNQUN6QixDQUFDO0FBQ0QsVUFBSSxZQUFZLEtBQUssVUFBVSxRQUFRO0FBQ25DLHFCQUFhLEtBQUssU0FBUyxRQUFRLElBQUksR0FBRyxVQUFVO0FBQ3BELGdCQUFRO0FBQUEsVUFDSixnQkFBZ0IsVUFBVSx1QkFBdUIsVUFBVTtBQUFBLFFBQy9EO0FBQ0EsY0FBTSxJQUFJLE1BQU0sUUFBUSxVQUFVLDJCQUEyQjtBQUFBLE1BQ2pFO0FBQUEsSUFDSjtBQUFBLEVBQ0osQ0FBQztBQUVELFNBQU8sS0FBSztBQUFBLElBQ1IsQ0FBQyxFQUFFLE1BQU0sT0FBTyxNQUFNLE1BQU0sR0FBRyxFQUFFLE1BQU0sT0FBTyxNQUFNLE1BQU0sTUFBTTtBQUc1RCxZQUFNLFFBQ0QsTUFBTSxhQUFhLE9BQU8sTUFBTSxNQUFNLFFBQVEsS0FBSyxLQUFLLE9BQ3pELE9BQU87QUFDWCxZQUFNLFFBQ0QsTUFBTSxhQUFhLE9BQU8sTUFBTSxNQUFNLFFBQVEsS0FBSyxLQUFLLE9BQ3pELE9BQU87QUFHWCxVQUFJLFFBQVEsTUFBTTtBQUNkLGVBQU8sTUFBTSxjQUFjLEtBQUs7QUFBQSxNQUNwQztBQUdBLGFBQU8sT0FBTztBQUFBLElBQ2xCO0FBQUEsRUFDSjtBQUNKOzs7QUR4UEEsSUFBTSxXQUFXO0FBQ2pCLElBQU0sZUFBZSxDQUFDLGFBQWEsYUFBYSxVQUFVO0FBQzFELElBQU0sOEJBQThCO0FBQUEsRUFDaEMsUUFBUTtBQUFBLEVBQ1IsVUFBVTtBQUFBLEVBQ1YsV0FBVztBQUFBLEVBQ1gsWUFBWTtBQUNoQjtBQUdBLElBQU0sZUFBdUM7QUFBQSxFQUN6QyxRQUFRO0FBQUEsRUFDUixVQUFVO0FBQUEsRUFDVixXQUFXO0FBQUEsRUFDWCxZQUFZO0FBQ2hCO0FBTUEsU0FBUyxtQkFBbUIsTUFBYyxZQUF5QjtBQUMvRCxRQUFNLFFBQVEsS0FBSyxNQUFNLFNBQVM7QUFDbEMsTUFBSSxPQUFPO0FBQ1AsV0FBTyxTQUFTLE1BQU0sQ0FBQyxHQUFHLEVBQUU7QUFBQSxFQUNoQyxXQUFXLFdBQVcsT0FBTztBQUN6QixXQUFPLFNBQVMsV0FBVyxLQUFLO0FBQUEsRUFDcEMsV0FBVyxXQUFXLFdBQVc7QUFDN0IsV0FBTyxTQUFTLFdBQVcsU0FBUztBQUFBLEVBQ3hDO0FBQ0EsU0FBTyxPQUFPO0FBQ2xCO0FBS0EsZUFBZSxrQkFBMEQ7QUFDckUsUUFBTSxVQUF5QyxDQUFDO0FBQ2hELFFBQU0sUUFBUSxNQUFNLEdBQUcsQ0FBQyxHQUFHLFFBQVEsVUFBVSxDQUFDO0FBRzlDLGFBQVcsWUFBWSxPQUFPO0FBRTFCLFFBQUksU0FBUyxTQUFTLE1BQU0sRUFBRztBQUMvQixVQUFNLGVBQWVDLE1BQUssU0FBUyxVQUFVLFFBQVE7QUFDckQsUUFBSSxhQUFhLEtBQUssWUFBVSxhQUFhLFlBQVksRUFBRSxTQUFTLE9BQU8sWUFBWSxDQUFDLENBQUMsRUFBRztBQUU1RixVQUFNLFdBQVcsYUFBYSxNQUFNQSxNQUFLLEdBQUc7QUFDNUMsVUFBTSxjQUFjLFNBQVMsQ0FBQztBQUc5QixVQUFNLGNBQWMsTUFBTUMsSUFBRyxTQUFTLFVBQVUsT0FBTztBQUN2RCxVQUFNLEVBQUUsTUFBTSxXQUFXLElBQUlDLFFBQU8sV0FBVztBQUUvQyxRQUFJLFdBQVcsUUFBUTtBQUNuQjtBQUFBLElBQ0o7QUFHQSxVQUFNLGVBQWUsYUFBYSxXQUFXLEtBQUs7QUFFbEQsUUFBSSxlQUE4QixRQUFRLFdBQVcsS0FBSyxDQUFDO0FBRTNELFFBQUksQ0FBQyxRQUFRLFdBQVcsR0FBRztBQUN2QixjQUFRLFdBQVcsSUFBSTtBQUFBLElBQzNCO0FBR0EsYUFBUyxJQUFJLEdBQUcsSUFBSSxTQUFTLFFBQVEsS0FBSztBQUN0QyxZQUFNLFVBQVUsU0FBUyxDQUFDLEVBQUUsUUFBUSxPQUFPLEVBQUU7QUFDN0MsWUFBTSxTQUFTLE1BQU0sU0FBUyxTQUFTO0FBR3ZDLFVBQUk7QUFDSixVQUFJLFFBQVE7QUFFUixlQUFPLElBQUksU0FBUyxNQUFNLEdBQUcsSUFBSSxDQUFDLEVBQUUsS0FBSyxHQUFHLENBQUMsR0FBRyxRQUFRLFNBQVMsRUFBRTtBQUFBLE1BQ3ZFLFdBQVcsTUFBTSxHQUFHO0FBQ2hCLGVBQU8sSUFBSSxPQUFPO0FBQUEsTUFDdEI7QUFFQSxZQUFNQyxTQUFRLG1CQUFtQixTQUFTLFVBQVU7QUFFcEQsVUFBSSxRQUFRO0FBRVIsY0FBTSxRQUFRLE1BQU0saUJBQWlCLFVBQVUsVUFBVTtBQUV6RCxjQUFNLGNBQWMsSUFBSSxJQUFJO0FBQzVCLHFCQUFhLEtBQUssRUFBRSxNQUFNLE9BQU8sTUFBTSxPQUFBQSxRQUFPLFlBQVksQ0FBQztBQUFBLE1BQy9ELE9BQU87QUFFSCxZQUFJLGNBQWMsTUFBTSxJQUFJLGVBQWU7QUFHM0Msc0JBQWMsWUFBWSxRQUFRLFlBQVksRUFBRTtBQUVoRCxZQUFJLFFBQVEsYUFBYTtBQUFBLFVBQUssVUFDekIsTUFBTSxLQUFLLEtBQUssU0FBUyxnQkFDekIsTUFBTSxLQUFLLEtBQUssU0FBUztBQUFBLFFBQzlCO0FBRUEsWUFBSSxDQUFDLE9BQU87QUFDUixnQkFBTSxZQUFZLE1BQU0sSUFBSSxJQUFJLE9BQU8sS0FBSztBQUM1QyxrQkFBUTtBQUFBLFlBQ0osTUFBTTtBQUFBLFlBQ04sT0FBTyxDQUFDO0FBQUEsWUFDUixPQUFBQTtBQUFBLFlBQ0EsV0FBVyxJQUFJLDRCQUE0QixTQUFTLENBQUMsQ0FBQztBQUFBO0FBQUEsWUFFdEQsYUFBYSxLQUFLLE9BQU87QUFBQSxZQUN6QixNQUFNO0FBQUEsVUFDVjtBQUNBLHVCQUFhLEtBQUssS0FBSztBQUFBLFFBQzNCO0FBQ0EsdUJBQWUsTUFBTSxTQUFTLENBQUM7QUFBQSxNQUNuQztBQUFBLElBQ0o7QUFBQSxFQUNKO0FBR0EsYUFBVyxPQUFPLFNBQVM7QUFDdkIscUJBQWlCLFFBQVEsR0FBRyxDQUFDO0FBQUEsRUFDakM7QUFHQSxRQUFNLGNBQTZDLENBQUM7QUFDcEQsYUFBVyxPQUFPLFNBQVM7QUFDdkIsZ0JBQVksR0FBRyxJQUFJLENBQUM7QUFDcEIsWUFBUSxHQUFHLEVBQUUsUUFBUSxVQUFRO0FBQ3pCLFVBQUksS0FBSyxPQUFPO0FBQ1osb0JBQVksR0FBRyxFQUFFLEtBQUssR0FBRyxLQUFLLEtBQUs7QUFBQSxNQUN2QyxPQUFPO0FBQ0gsb0JBQVksR0FBRyxFQUFFLEtBQUssSUFBSTtBQUFBLE1BQzlCO0FBQUEsSUFDSixDQUFDO0FBQUEsRUFDTDtBQUdBLFFBQU0sT0FBTyxvQkFBb0JILE1BQUssS0FBSyxRQUFRLElBQUksR0FBRyxNQUFNLEdBQUdBLE1BQUssS0FBSyxRQUFRLElBQUksR0FBRyxXQUFXLENBQUM7QUFDeEcsUUFBTSxjQUE2QixDQUFDO0FBQ3BDLE9BQUssUUFBUSxVQUFRO0FBQ2pCLFFBQUksS0FBSyxLQUFLLFlBQVk7QUFJdEIsWUFBTSxhQUF1QixDQUFDO0FBQzlCLFlBQU0sU0FBUyxLQUFLLEtBQUssV0FBVyxJQUFJLENBQUMsYUFBa0I7QUFBQztBQUN4RCxlQUFPO0FBQUEsVUFDSCxNQUFNLFNBQVM7QUFBQSxVQUNmLFdBQVc7QUFBQSxVQUNYLE9BQU8sS0FBSyxTQUNQLE9BQU8sV0FBUyxNQUFNLEtBQUssYUFBYSxTQUFTLEtBQUssRUFDdEQsT0FBTyxXQUFTLE1BQU0sSUFBSSxFQUMxQixJQUFJLFdBQVM7QUFDVix1QkFBVyxLQUFLLE1BQU0sSUFBSTtBQUMxQixtQkFBTztBQUFBLGNBQ0gsTUFBTSxNQUFNO0FBQUEsY0FDWixNQUFNLE1BQU07QUFBQSxjQUNaLGFBQWEsTUFBTTtBQUFBLFlBQ3ZCO0FBQUEsVUFDSixDQUFDO0FBQUEsUUFDVDtBQUFBLE1BQ0osQ0FBQztBQUVELFlBQU0sYUFBYSxLQUFLLFNBQ25CLE9BQU8sV0FBUyxDQUFDLFdBQVcsU0FBUyxNQUFNLElBQUksQ0FBQyxFQUNoRCxPQUFPLFdBQVMsTUFBTSxJQUFJLEVBQzFCLElBQUksV0FBUztBQUNWLGVBQU87QUFBQSxVQUNILE1BQU0sTUFBTTtBQUFBLFVBQ1osTUFBTSxNQUFNO0FBQUEsVUFDWixhQUFhLE1BQU07QUFBQSxRQUN2QjtBQUFBLE1BQ0osQ0FBQztBQUVMLGtCQUFZLEtBQUs7QUFBQSxRQUNiLE1BQU0sS0FBSyxLQUFLO0FBQUEsUUFDaEIsV0FBVztBQUFBLFFBQ1gsT0FBTyxDQUFDLEdBQUcsUUFBUSxHQUFHLFVBQVU7QUFBQSxNQUNwQyxDQUFDO0FBQUEsSUFDTCxPQUFPO0FBRUgsa0JBQVksS0FBSztBQUFBLFFBQ2IsTUFBTSxLQUFLO0FBQUEsUUFDWCxXQUFXO0FBQUEsUUFDWCxPQUFPLEtBQUssU0FDUCxPQUFPLFdBQVMsTUFBTSxJQUFJLEVBQzFCLElBQUksV0FBUztBQUNWLGlCQUFPO0FBQUEsWUFDSCxNQUFNLE1BQU07QUFBQSxZQUNaLE1BQU0sTUFBTTtBQUFBLFlBQ1osYUFBYSxNQUFNO0FBQUEsVUFDdkI7QUFBQSxRQUNKLENBQUM7QUFBQSxNQUNULENBQUM7QUFBQSxJQUNMO0FBQUEsRUFDSixDQUFDO0FBRUQsY0FBWSxNQUFNLElBQUk7QUFFdEIsU0FBTztBQUNYO0FBS0EsU0FBUyxpQkFBaUIsT0FBNEI7QUFFbEQsUUFBTSxLQUFLLENBQUMsR0FBRyxNQUFNO0FBQ2pCLFVBQU0sU0FBUyxFQUFFLFNBQVMsT0FBTztBQUNqQyxVQUFNLFNBQVMsRUFBRSxTQUFTLE9BQU87QUFDakMsV0FBTyxTQUFTO0FBQUEsRUFDcEIsQ0FBQztBQUdELFFBQU0sUUFBUSxVQUFRO0FBQ2xCLFFBQUksS0FBSyxTQUFTLEtBQUssTUFBTSxTQUFTLEdBQUc7QUFDckMsdUJBQWlCLEtBQUssS0FBSztBQUFBLElBQy9CO0FBQUEsRUFDSixDQUFDO0FBQ0w7QUFLQSxlQUFlLGlCQUFpQixVQUFrQixZQUFrQztBQUNoRixNQUFJLFdBQVcsT0FBTztBQUNsQixXQUFPLFdBQVcsTUFBTSxLQUFLLEVBQUUsUUFBUSxTQUFTLEVBQUU7QUFBQSxFQUN0RDtBQUVBLFFBQU0sV0FBV0EsTUFBSyxTQUFTLFVBQVUsS0FBSztBQUU5QyxTQUFPLFNBQVMsUUFBUSxZQUFZLEVBQUUsRUFBRSxRQUFRLE1BQU0sR0FBRztBQUM3RDtBQUVBLElBQU8sa0JBQVE7OztBRHpQZixTQUFTLG1CQUFtQjtBQUhvTixJQUFNLDJDQUEyQztBQU1qUyxJQUFPLGlCQUFRLFlBQVk7QUFBQSxFQUN6QixNQUFNO0FBQUEsRUFDTixPQUFPO0FBQUEsRUFDUCxhQUFhO0FBQUEsRUFDYixpQkFBaUI7QUFBQTtBQUFBLEVBRWpCLE1BQU07QUFBQSxJQUNKLFNBQVM7QUFBQSxNQUNQLE9BQU87QUFBQSxRQUNMO0FBQUEsVUFDRSxNQUFNO0FBQUEsVUFDTixhQUFhO0FBQUEsWUFDWCxJQUFJLElBQUksd0NBQXdDLHdDQUFlO0FBQUEsVUFDakU7QUFBQSxRQUNGO0FBQUEsTUFDRjtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBQUEsRUFDQSxTQUFTO0FBQUEsSUFDUCxNQUFNO0FBQUEsTUFDSixPQUFPO0FBQUEsTUFDUCxNQUFNO0FBQUEsTUFDTixhQUFhO0FBQUE7QUFBQSxRQUVYLGNBQWM7QUFBQTtBQUFBLFFBRWQsV0FBVztBQUFBLFVBQ1QsTUFBTTtBQUFBLFVBQ04sTUFBTTtBQUFBLFFBQ1I7QUFBQTtBQUFBLFFBRUEsaUJBQWlCO0FBQUE7QUFBQSxRQUVqQixrQkFBa0I7QUFBQTtBQUFBLFFBRWxCLGtCQUFrQjtBQUFBLFFBQ2xCLHFCQUFxQjtBQUFBLFFBQ3JCLHNCQUFzQjtBQUFBLFFBQ3RCLHFCQUFxQjtBQUFBLE1BQ3ZCO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFBQSxFQUNBLE1BQU07QUFBQSxJQUNKLENBQUMsVUFBVSxFQUFFLE9BQU8sSUFBSSxLQUFLLDJEQUEyRCxDQUFDO0FBQUEsSUFDekYsQ0FBQyxVQUFVLENBQUMsR0FBRztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsS0FLZDtBQUFBLEVBQ0g7QUFBQSxFQUNBLGFBQWE7QUFBQTtBQUFBLElBRVgsS0FBSztBQUFBLE1BQ0gsRUFBRSxNQUFNLGdCQUFNLE1BQU0sSUFBSTtBQUFBLE1BQ3hCLEVBQUUsTUFBTSxRQUFRLE1BQU0sUUFBUTtBQUFBLE1BQzlCLEVBQUUsTUFBTSxtQkFBUyxNQUFNLHlCQUFlO0FBQUEsTUFDdEMsRUFBRSxNQUFNLDRCQUFRLE1BQU0sMEJBQWdCO0FBQUEsTUFDdEMsRUFBRSxNQUFNLDRCQUFRLE1BQU0sMkJBQWlCO0FBQUEsSUFDekM7QUFBQSxJQUVBLFNBQVMsTUFBTSxnQkFBZ0I7QUFBQSxJQUUvQixhQUFhO0FBQUEsTUFDWCxFQUFFLE1BQU0sVUFBVSxNQUFNLG9EQUFvRDtBQUFBLElBQzlFO0FBQUEsSUFFQSxVQUFVO0FBQUEsTUFDUixTQUFTO0FBQUEsTUFDVCxNQUFNO0FBQUEsSUFDUjtBQUFBLElBRUEsUUFBUTtBQUFBLE1BQ04sVUFBVTtBQUFBLE1BQ1YsU0FBUztBQUFBLFFBQ1AsT0FBTztBQUFBLFFBQ1AsUUFBUTtBQUFBLFFBQ1IsV0FBVztBQUFBLFFBQ1gsa0JBQWtCO0FBQUE7QUFBQSxVQUVoQixjQUFjLENBQUMsb0JBQW9CO0FBQUEsUUFDckM7QUFBQSxRQUNBLFNBQVM7QUFBQSxVQUNQLE1BQU07QUFBQSxZQUNKLGFBQWE7QUFBQSxZQUNiLGNBQWM7QUFBQSxjQUNaLFFBQVE7QUFBQSxnQkFDTixZQUFZO0FBQUEsZ0JBQ1osaUJBQWlCO0FBQUEsY0FDbkI7QUFBQSxjQUNBLE9BQU87QUFBQSxnQkFDTCxXQUFXO0FBQUEsa0JBQ1Qsa0JBQWtCO0FBQUEsa0JBQ2xCLHNCQUFzQjtBQUFBLGtCQUN0QixrQkFBa0I7QUFBQSxrQkFDbEIsdUJBQXVCO0FBQUEsZ0JBQ3pCO0FBQUEsZ0JBQ0EsYUFBYTtBQUFBLGtCQUNYLHFCQUFxQjtBQUFBLGtCQUNyQixzQkFBc0I7QUFBQSxrQkFDdEIsNkJBQTZCO0FBQUEsa0JBQzdCLCtCQUErQjtBQUFBLGtCQUMvQix1QkFBdUI7QUFBQSxrQkFDdkIsaUNBQWlDO0FBQUEsZ0JBQ25DO0FBQUEsZ0JBQ0EsYUFBYTtBQUFBLGtCQUNYLFdBQVc7QUFBQSxrQkFDWCxVQUFVO0FBQUEsZ0JBQ1o7QUFBQSxnQkFDQSxRQUFRO0FBQUEsa0JBQ04sWUFBWTtBQUFBLGtCQUNaLGNBQWM7QUFBQSxrQkFDZCxXQUFXO0FBQUEsa0JBQ1gsY0FBYztBQUFBLGdCQUNoQjtBQUFBLGdCQUNBLGlCQUFpQjtBQUFBLGtCQUNmLGVBQWU7QUFBQSxrQkFDZixvQkFBb0I7QUFBQSxrQkFDcEIsMEJBQTBCO0FBQUEsa0JBQzFCLDhCQUE4QjtBQUFBLGdCQUNoQztBQUFBLGNBQ0Y7QUFBQSxZQUNGO0FBQUEsVUFDRjtBQUFBLFFBQ0Y7QUFBQSxNQUNGO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFDRixDQUFDOyIsCiAgIm5hbWVzIjogWyJmcyIsICJwYXRoIiwgIm1hdHRlciIsICJwYXRoIiwgInBhdGgiLCAiZnMiLCAibWF0dGVyIiwgIm9yZGVyIl0KfQo= diff --git a/package-lock.json b/package-lock.json index a92fb0c3..330922d1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17,6 +17,7 @@ "marked": "^15.0.7", "mermaid": "^11.5.0", "openai": "^4.87.4", + "tencentcloud-sdk-nodejs": "^4.1.0", "vitepress": "^1.6.3", "vitepress-plugin-mermaid": "^2.0.17", "vue": "^3.5.13" @@ -2041,6 +2042,19 @@ "node": ">=0.4.0" } }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, "node_modules/agentkeepalive": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.6.0.tgz", @@ -2096,6 +2110,16 @@ "dev": true, "license": "MIT" }, + "node_modules/bignumber.js": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.2.tgz", + "integrity": "sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, "node_modules/birpc": { "version": "0.2.19", "resolved": "https://registry.npmjs.org/birpc/-/birpc-0.2.19.tgz", @@ -3229,6 +3253,19 @@ "node": ">= 0.4" } }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/glob-parent": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", @@ -3389,6 +3426,20 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/humanize-ms": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", @@ -3465,6 +3516,19 @@ "node": ">=0.12.0" } }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-what": { "version": "4.1.16", "resolved": "https://registry.npmjs.org/is-what/-/is-what-4.1.16.tgz", @@ -3492,6 +3556,16 @@ "js-yaml": "bin/js-yaml.js" } }, + "node_modules/json-bigint": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", + "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "bignumber.js": "^9.0.0" + } + }, "node_modules/katex": { "version": "0.16.21", "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.21.tgz", @@ -4445,6 +4519,56 @@ "dev": true, "license": "MIT" }, + "node_modules/tencentcloud-sdk-nodejs": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/tencentcloud-sdk-nodejs/-/tencentcloud-sdk-nodejs-4.1.0.tgz", + "integrity": "sha512-WifbzmRola9FVl1YIZJuZP7NjpAVToAfPv4IiQYOWj2tlHYwNBO8BfKOcn0WJh+Csn7Be8YehyZl4L5EoEgnkg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "form-data": "^3.0.0", + "get-stream": "^6.0.0", + "https-proxy-agent": "^5.0.0", + "is-stream": "^2.0.0", + "json-bigint": "^1.0.0", + "node-fetch": "^2.2.0", + "tslib": "1.13.0", + "uuid": "^9.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tencentcloud-sdk-nodejs/node_modules/form-data": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.3.tgz", + "integrity": "sha512-q5YBMeWy6E2Un0nMGWMgI65MAKtaylxfNJGJxpGh45YDciZB4epbWpaAfImil6CPAPTYB4sh0URQNDRIZG5F2w==", + "dev": true, + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "mime-types": "^2.1.35" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/tencentcloud-sdk-nodejs/node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "dev": true, + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, "node_modules/tinyexec": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", @@ -4493,6 +4617,13 @@ "node": ">=6.10" } }, + "node_modules/tslib": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", + "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==", + "dev": true, + "license": "0BSD" + }, "node_modules/ufo": { "version": "1.5.4", "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.5.4.tgz", diff --git a/package.json b/package.json index 3ac7f9c7..6223fa68 100644 --- a/package.json +++ b/package.json @@ -20,6 +20,7 @@ "marked": "^15.0.7", "mermaid": "^11.5.0", "openai": "^4.87.4", + "tencentcloud-sdk-nodejs": "^4.1.0", "vitepress": "^1.6.3", "vitepress-plugin-mermaid": "^2.0.17", "vue": "^3.5.13" diff --git a/scripts/cdn-fresh.mjs b/scripts/cdn-fresh.mjs new file mode 100644 index 00000000..e2596900 --- /dev/null +++ b/scripts/cdn-fresh.mjs @@ -0,0 +1,123 @@ +import dotenv from 'dotenv'; +import tencentcloud from 'tencentcloud-sdk-nodejs'; +import path from 'path'; +import { fileURLToPath } from 'url'; +import fs from 'fs'; + +// 加载环境变量 +dotenv.config(); + +// 获取当前文件的目录 +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); + +// 从环境变量中获取腾讯云 API 密钥 +const SECRET_ID = process.env.TENCENT_CLOUD_SECRET_ID; +const SECRET_KEY = process.env.TENCENT_CLOUD_SECRET_KEY; +const ZONE_ID = process.env.TENCENT_CLOUD_ZONE_ID; + +const ONLINE_WIKI_URL = "https://mcwiki.easecation.net"; // 最后不能带/ + +// 检查密钥是否存在 +if (!SECRET_ID || !SECRET_KEY || !ZONE_ID) { + console.error('错误: 请确保环境变量中设置了 TENCENT_CLOUD_SECRET_ID, TENCENT_CLOUD_SECRET_KEY 和 TENCENT_CLOUD_ZONE_ID'); + process.exit(1); +} + +// 获取腾讯云 API 客户端 +const TeoClient = tencentcloud.teo.v20220901.Client; + +// 实例化客户端 +const clientConfig = { + credential: { + secretId: SECRET_ID, + secretKey: SECRET_KEY, + }, + region: "", // EdgeOne 服务不需要指定地域 + profile: { + httpProfile: { + endpoint: "teo.tencentcloudapi.com", + }, + }, +}; + +const client = new TeoClient(clientConfig); + +console.log('开始刷新 CDN 缓存...'); + +try { + const response = await client.CreatePurgeTask({ + ZoneId: ZONE_ID, + Type: "purge_prefix", + Method: "invalidate", + Targets: [ + ONLINE_WIKI_URL + ] + }); + console.log('刷新 CDN 缓存完成:', response); +} catch (error) { + console.error('刷新目录缓存失败:', error); + throw error; +} + +console.log('开始预热部分页面...'); + +// 提取docs/.vitepress/dist/assets中匹配xxx.md.xxx.js形式的文件 +const assetsDir = path.resolve(__dirname, '../docs/.vitepress/dist/assets'); +const files = fs.readdirSync(assetsDir).filter(file => file.match(/\.md\.[a-zA-Z0-9]+\.js$/)); + +const prefetchPages = [ + "mcdocs/0-欢迎", + "mcdocs/1-ModAPI/事件/事件索引表", + "mcdocs/1-ModAPI/事件/UI", + "mcdocs/1-ModAPI/事件/世界", + "mcdocs/1-ModAPI/事件/实体", + "mcdocs/1-ModAPI/事件/控制", + "mcdocs/1-ModAPI/事件/方块", + "mcdocs/1-ModAPI/事件/模型", + "mcdocs/1-ModAPI/事件/物品", + "mcdocs/1-ModAPI/事件/玩家", + "mcdocs/1-ModAPI/事件/联机大厅", + "mcdocs/1-ModAPI/事件/音效", + "mcdocs/1-ModAPI/接口/Api索引表", + "mcdocs/1-ModAPI/枚举值/索引", + "mcguide/0-欢迎", + "mcguide/20-玩法开发/13-模组SDK编程/2-Python脚本开发/0-脚本开发入门", + "mcguide/18-界面与交互/2-从零开始创建UI", + "mcguide/16-美术/6-模型和动作/00-模型制作方案", + "mcguide/20-玩法开发/15-自定义游戏内容/1-自定义物品/1-自定义基础物品", + "mcguide/20-玩法开发/15-自定义游戏内容/2-自定义方块/0-自定义方块概述", + "mcguide/20-玩法开发/15-自定义游戏内容/3-自定义生物/01-自定义基础生物", + "mcguide/20-玩法开发/15-自定义游戏内容/4-自定义维度/1-自定义维度", + "mconline/0-欢迎", + "wiki/guide/introduction", + "wiki/modsdk/modsdk-intro", + "wiki/blocks/blocks-intro", + "wiki/items/items-intro", + "wiki/entities/entity-intro-bp", + "wiki/json-ui/json-ui-intro" +]; + +const prefetchPagesTag = prefetchPages.map(page => page.replaceAll("/", "_") + ".md"); + +const targetsJs = files + .filter(file => prefetchPagesTag.filter(tag => file.indexOf(tag) >= 0).length > 0) + .map(file => `${ONLINE_WIKI_URL}/assets/${file}`); + +const targetsHtml = prefetchPages.map(file => `${ONLINE_WIKI_URL}/${file}.html`); + +try { + const response = await client.CreatePrefetchTask({ + ZoneId: ZONE_ID, + Targets: [ + ONLINE_WIKI_URL, + ONLINE_WIKI_URL + "/wiki", + ...targetsHtml, + ...targetsJs + ] + }); + console.log('预热 CDN 完成:', response); +} catch (error) { + console.error('CDN 预热失败:', error); + throw error; +} \ No newline at end of file