@customize-agent/server 4.1.18 → 4.1.20

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (98) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/build-manifest.json +174 -18
  3. package/.next/prerender-manifest.json +3 -3
  4. package/.next/server/_error.js +1 -1
  5. package/.next/server/chunks/1928.js +1 -1
  6. package/.next/server/chunks/582.js +223 -0
  7. package/.next/server/chunks/5840.js +1 -1
  8. package/.next/server/chunks/8661.js +2 -2
  9. package/.next/server/middleware-build-manifest.js +1 -40
  10. package/.next/server/middleware-react-loadable-manifest.js +1 -1
  11. package/.next/server/next-font-manifest.js +1 -1
  12. package/.next/server/pages/404.html +1 -1
  13. package/.next/server/pages/500.html +1 -1
  14. package/.next/server/pages/api/assets/generated/preview.js +1 -1
  15. package/.next/server/pages/api/assets/generated/preview.js.nft.json +1 -1
  16. package/.next/server/pages/api/assets/generated.js +1 -1
  17. package/.next/server/pages/api/assets/generated.js.nft.json +1 -1
  18. package/.next/server/pages/api/config/providers.js +1 -1
  19. package/.next/server/pages/api/documents/chapter/regenerate.js +1 -1
  20. package/.next/server/pages/api/documents/chapter/regenerate.js.nft.json +1 -1
  21. package/.next/server/pages/api/documents/export.js +7 -7
  22. package/.next/server/pages/api/documents/export.js.nft.json +1 -1
  23. package/.next/server/pages/api/documents/generate.js +2 -2
  24. package/.next/server/pages/api/documents/generate.js.nft.json +1 -1
  25. package/.next/server/pages/api/documents/generated/[id].js +1 -1
  26. package/.next/server/pages/api/documents/generated/[id].js.nft.json +1 -1
  27. package/.next/server/pages/api/documents/generated.js +1 -1
  28. package/.next/server/pages/api/documents/generated.js.nft.json +1 -1
  29. package/.next/server/pages/api/documents/roles.js +1 -1
  30. package/.next/server/pages/api/documents/templates.js +1 -1
  31. package/.next/server/pages/api/documents/templates.js.nft.json +1 -1
  32. package/.next/server/pages/asset-library.html +1 -1
  33. package/.next/server/pages/document-roles.html +1 -1
  34. package/.next/server/pages/document-roles.js.nft.json +1 -1
  35. package/.next/server/pages/documents.html +1 -1
  36. package/.next/server/pages/guide.html +1 -1
  37. package/.next/server/pages/guide.js.nft.json +1 -1
  38. package/.next/server/pages/index.html +1 -1
  39. package/.next/server/pages/knowledge/file-detail.html +1 -1
  40. package/.next/server/pages/knowledge/files.html +1 -1
  41. package/.next/server/pages/knowledge/manage.html +1 -1
  42. package/.next/server/pages/knowledge.html +1 -1
  43. package/.next/server/pages/models.html +1 -1
  44. package/.next/server/pages/overview.html +1 -1
  45. package/.next/server/pages/prompt.html +1 -1
  46. package/.next/server/pages/settings.html +1 -1
  47. package/.next/server/pages/system/logs.html +1 -1
  48. package/.next/server/pages-manifest.json +60 -3
  49. package/.next/server/vendor-chunks/next@15.5.19_react-dom@19.2.7_react@19.2.7__react@19.2.7_sass@1.101.0.js +10 -10
  50. package/.next/static/Q_xFgspIZa7UtyNcbbeXp/_buildManifest.js +1 -0
  51. package/.next/static/chunks/44-d3545eedd5c75ef1.js +4 -0
  52. package/.next/static/chunks/563-b12f299d34bb9e44.js +1 -0
  53. package/.next/static/chunks/717-743b697a417dd5ee.js +4 -0
  54. package/.next/static/chunks/795-cd94e8d4e9768eb9.js +1 -0
  55. package/.next/static/chunks/827-a6dc09e42833e6a3.js +1 -0
  56. package/.next/static/chunks/883-506cbca959974997.js +16 -0
  57. package/.next/static/chunks/957-7c7f05f1c2ccfb96.js +8 -0
  58. package/.next/static/chunks/{238-16333381c574f65b.js → 994-241f87efc61005b8.js} +4 -1
  59. package/.next/static/chunks/fallback/amp.js +1015 -0
  60. package/.next/static/chunks/fallback/main.js +1616 -0
  61. package/.next/static/chunks/fallback/pages/_app.js +28 -0
  62. package/.next/static/chunks/fallback/pages/_error.js +28 -0
  63. package/.next/static/chunks/fallback/react-refresh.js +62 -0
  64. package/.next/static/chunks/fallback/webpack.js +1192 -0
  65. package/.next/static/chunks/pages/{asset-library-bedc7113dfc7ad6a.js → asset-library-a1047694e888e655.js} +1 -1
  66. package/.next/static/chunks/pages/document-roles-5620a98d6312f81c.js +1 -0
  67. package/.next/static/chunks/pages/documents-7550a1ef2e5f266c.js +1 -0
  68. package/.next/static/chunks/pages/guide-b847733a9a832c2c.js +1 -0
  69. package/.next/static/chunks/pages/knowledge/{file-detail-f70a35f5b24a5b61.js → file-detail-02cd5d87cd1d1c5d.js} +1 -1
  70. package/.next/static/chunks/pages/knowledge/{files-3b5d049efb076e4b.js → files-8503246ce2bc07c6.js} +1 -1
  71. package/.next/static/chunks/pages/knowledge/{manage-67b5c7fe257f37c5.js → manage-a00bb7fc6a76f820.js} +1 -1
  72. package/.next/static/chunks/pages/{models-89f9769a32da8e5f.js → models-aa250428e72433df.js} +1 -1
  73. package/.next/static/chunks/pages/{prompt-08ecf369f65abdfd.js → prompt-224af05519ef8304.js} +1 -1
  74. package/.next/static/chunks/pages/system/{logs-a76f9e3131e0cd79.js → logs-6f45ef8d862759a2.js} +1 -1
  75. package/.next/static/chunks/polyfills.js +1 -0
  76. package/.next/static/chunks/webpack.js +2 -2
  77. package/.next/static/css/3f9e41b5c0ba95f7.css +1 -0
  78. package/package.json +4 -4
  79. package/.next/server/chunks/1924.js +0 -215
  80. package/.next/static/VJfTgkSHEgD9CkDEznJbt/_buildManifest.js +0 -1
  81. package/.next/static/chunks/209-5117020514c2bd0c.js +0 -4
  82. package/.next/static/chunks/466-1cd359f130473697.js +0 -1
  83. package/.next/static/chunks/576-6699fed6c88502fe.js +0 -1
  84. package/.next/static/chunks/580-618d7d7e7b74daf6.js +0 -19
  85. package/.next/static/chunks/644-3299885a9dc1ef78.js +0 -11
  86. package/.next/static/chunks/649-06b72042a4de8074.js +0 -4
  87. package/.next/static/chunks/795-18a2b5f64892634d.js +0 -1
  88. package/.next/static/chunks/pages/document-roles-3d8c5440cc3f15fd.js +0 -1
  89. package/.next/static/chunks/pages/documents-b59eba36e96a5621.js +0 -1
  90. package/.next/static/chunks/pages/guide-9d7d88a25d972c06.js +0 -1
  91. package/.next/static/css/9daa4d0938f1a323.css +0 -1
  92. package/.next/static/development/_buildManifest.js +0 -1
  93. package/.next/static/development/_ssgManifest.js +0 -1
  94. package/.next/static/webpack/0dc2c45812c77911.webpack.hot-update.json +0 -1
  95. package/.next/static/webpack/7de8e01bd19935ee.webpack.hot-update.json +0 -1
  96. package/.next/static/webpack/webpack.0dc2c45812c77911.hot-update.js +0 -12
  97. package/.next/static/webpack/webpack.7de8e01bd19935ee.hot-update.js +0 -12
  98. /package/.next/static/{VJfTgkSHEgD9CkDEznJbt → Q_xFgspIZa7UtyNcbbeXp}/_ssgManifest.js +0 -0
@@ -151,7 +151,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
151
151
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
152
152
 
153
153
  "use strict";
154
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ abortGeneratedDocument: () => (/* binding */ abortGeneratedDocument),\n/* harmony export */ clearErrorLogs: () => (/* binding */ clearErrorLogs),\n/* harmony export */ clearKbOperations: () => (/* binding */ clearKbOperations),\n/* harmony export */ deleteAllKbFiles: () => (/* binding */ deleteAllKbFiles),\n/* harmony export */ deleteDocumentRole: () => (/* binding */ deleteDocumentRole),\n/* harmony export */ deleteDocumentTemplate: () => (/* binding */ deleteDocumentTemplate),\n/* harmony export */ deleteGeneratedAsset: () => (/* binding */ deleteGeneratedAsset),\n/* harmony export */ deleteGeneratedDocument: () => (/* binding */ deleteGeneratedDocument),\n/* harmony export */ deleteKbFile: () => (/* binding */ deleteKbFile),\n/* harmony export */ deleteKbFiles: () => (/* binding */ deleteKbFiles),\n/* harmony export */ deleteKbFolders: () => (/* binding */ deleteKbFolders),\n/* harmony export */ deleteKbOperation: () => (/* binding */ deleteKbOperation),\n/* harmony export */ deleteKbSelection: () => (/* binding */ deleteKbSelection),\n/* harmony export */ deleteProjectRoleConfig: () => (/* binding */ deleteProjectRoleConfig),\n/* harmony export */ deleteProvider: () => (/* binding */ deleteProvider),\n/* harmony export */ duplicateDocumentTemplate: () => (/* binding */ duplicateDocumentTemplate),\n/* harmony export */ embeddingHealthCheck: () => (/* binding */ embeddingHealthCheck),\n/* harmony export */ evaluateKbRetrieval: () => (/* binding */ evaluateKbRetrieval),\n/* harmony export */ exportDocument: () => (/* binding */ exportDocument),\n/* harmony export */ generateDocumentDraft: () => (/* binding */ generateDocumentDraft),\n/* harmony export */ getDocumentDrafts: () => (/* binding */ getDocumentDrafts),\n/* harmony export */ getDocumentRoles: () => (/* binding */ getDocumentRoles),\n/* harmony export */ getDocumentTemplates: () => (/* binding */ getDocumentTemplates),\n/* harmony export */ getEmbeddingConfig: () => (/* binding */ getEmbeddingConfig),\n/* harmony export */ getErrorLogs: () => (/* binding */ getErrorLogs),\n/* harmony export */ getGeneratedAssets: () => (/* binding */ getGeneratedAssets),\n/* harmony export */ getGeneratedDocument: () => (/* binding */ getGeneratedDocument),\n/* harmony export */ getGeneratedDocuments: () => (/* binding */ getGeneratedDocuments),\n/* harmony export */ getHealth: () => (/* binding */ getHealth),\n/* harmony export */ getJob: () => (/* binding */ getJob),\n/* harmony export */ getJobs: () => (/* binding */ getJobs),\n/* harmony export */ getKbCategoryStats: () => (/* binding */ getKbCategoryStats),\n/* harmony export */ getKbDuplicates: () => (/* binding */ getKbDuplicates),\n/* harmony export */ getKbFeatures: () => (/* binding */ getKbFeatures),\n/* harmony export */ getKbFileDetail: () => (/* binding */ getKbFileDetail),\n/* harmony export */ getKbFiles: () => (/* binding */ getKbFiles),\n/* harmony export */ getKbFilesTree: () => (/* binding */ getKbFilesTree),\n/* harmony export */ getKbIgnoreRules: () => (/* binding */ getKbIgnoreRules),\n/* harmony export */ getKbOperations: () => (/* binding */ getKbOperations),\n/* harmony export */ getKbStats: () => (/* binding */ getKbStats),\n/* harmony export */ getKbTags: () => (/* binding */ getKbTags),\n/* harmony export */ getKbUploadProgress: () => (/* binding */ getKbUploadProgress),\n/* harmony export */ getModels: () => (/* binding */ getModels),\n/* harmony export */ getPromptProjects: () => (/* binding */ getPromptProjects),\n/* harmony export */ getProviderDetail: () => (/* binding */ getProviderDetail),\n/* harmony export */ getProviders: () => (/* binding */ getProviders),\n/* harmony export */ getReindexStatus: () => (/* binding */ getReindexStatus),\n/* harmony export */ getSystemStats: () => (/* binding */ getSystemStats),\n/* harmony export */ getWebAccessConfig: () => (/* binding */ getWebAccessConfig),\n/* harmony export */ healthCheck: () => (/* binding */ healthCheck),\n/* harmony export */ openGeneratedAsset: () => (/* binding */ openGeneratedAsset),\n/* harmony export */ openKbFileTarget: () => (/* binding */ openKbFileTarget),\n/* harmony export */ refineGeneratedDocument: () => (/* binding */ refineGeneratedDocument),\n/* harmony export */ regenerateDocumentChapter: () => (/* binding */ regenerateDocumentChapter),\n/* harmony export */ reindexKb: () => (/* binding */ reindexKb),\n/* harmony export */ reindexKbFile: () => (/* binding */ reindexKbFile),\n/* harmony export */ resumeGeneratedDocument: () => (/* binding */ resumeGeneratedDocument),\n/* harmony export */ saveDocumentDraft: () => (/* binding */ saveDocumentDraft),\n/* harmony export */ saveDocumentRole: () => (/* binding */ saveDocumentRole),\n/* harmony export */ saveDocumentTemplate: () => (/* binding */ saveDocumentTemplate),\n/* harmony export */ saveEmbeddingConfig: () => (/* binding */ saveEmbeddingConfig),\n/* harmony export */ saveKbIgnoreRules: () => (/* binding */ saveKbIgnoreRules),\n/* harmony export */ saveModels: () => (/* binding */ saveModels),\n/* harmony export */ saveProjectRoleConfig: () => (/* binding */ saveProjectRoleConfig),\n/* harmony export */ saveProvider: () => (/* binding */ saveProvider),\n/* harmony export */ saveWebAccessConfig: () => (/* binding */ saveWebAccessConfig),\n/* harmony export */ searchKb: () => (/* binding */ searchKb),\n/* harmony export */ searchKbFiles: () => (/* binding */ searchKbFiles),\n/* harmony export */ updateGeneratedDocument: () => (/* binding */ updateGeneratedDocument),\n/* harmony export */ uploadKbFile: () => (/* binding */ uploadKbFile),\n/* harmony export */ uploadKbFiles: () => (/* binding */ uploadKbFiles),\n/* harmony export */ validateDocumentTemplate: () => (/* binding */ validateDocumentTemplate)\n/* harmony export */ });\n/** 封装的 JSON 请求函数,自动将非 2xx 响应解析为错误信息并抛出 */ async function fetchJson(url, options) {\n const res = await fetch(url, options);\n if (!res.ok) {\n const body = await res.text();\n let message = body || `HTTP ${res.status}`;\n try {\n const parsed = JSON.parse(body);\n message = parsed.error || parsed.message || message;\n } catch {\n const htmlError = body.match(/<script id=\"__NEXT_DATA__\" type=\"application\\/json\">([\\s\\S]*?)<\\/script>/u)?.[1];\n if (htmlError) {\n try {\n const nextData = JSON.parse(htmlError.replace(/&quot;/gu, '\"'));\n message = nextData.err?.message || `HTTP ${res.status}`;\n } catch {\n message = `HTTP ${res.status}`;\n }\n }\n }\n throw new Error(message);\n }\n return res.json();\n}\nasync function getKbStats(projectRoot) {\n const p = projectRoot ? `?projectRoot=${encodeURIComponent(projectRoot)}` : '';\n return fetchJson(`/api/kb/stats${p}`);\n}\nasync function getKbFiles(opts) {\n const params = new URLSearchParams();\n if (opts?.projectRoot) params.set('projectRoot', opts.projectRoot);\n if (opts?.category) params.set('category', opts.category);\n if (opts?.page) params.set('page', String(opts.page ?? 1));\n if (opts?.limit) params.set('limit', String(opts.limit ?? 50));\n return fetchJson(`/api/kb/files?${params}`);\n}\nasync function getKbFilesTree(parentPath = '', projectRoot) {\n const params = new URLSearchParams();\n if (projectRoot) params.set('projectRoot', projectRoot);\n if (parentPath) params.set('parentPath', parentPath);\n return fetchJson(`/api/kb/files/tree?${params}`);\n}\nasync function searchKbFiles(opts) {\n const params = new URLSearchParams();\n if (opts?.query) params.set('q', opts.query);\n if (opts?.projectRoot) params.set('projectRoot', opts.projectRoot);\n if (opts?.category) params.set('category', opts.category);\n if (opts?.limit) params.set('limit', String(opts.limit));\n if (opts?.includeContent === false) params.set('includeContent', '0');\n return fetchJson(`/api/kb/files/search?${params}`);\n}\nasync function evaluateKbRetrieval(opts) {\n return fetchJson('/api/kb/evaluate', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(opts)\n });\n}\nasync function getKbFileDetail(relativePath, projectRoot) {\n const params = new URLSearchParams({\n relativePath\n });\n if (projectRoot) params.set('projectRoot', projectRoot);\n return fetchJson(`/api/kb/files/detail?${params}`);\n}\nasync function reindexKbFile(relativePath, projectRoot) {\n return fetchJson('/api/kb/files/reindex', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n relativePath,\n projectRoot\n })\n });\n}\nasync function openKbFileTarget(relativePath, target, projectRoot) {\n return fetchJson('/api/kb/files/open', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n relativePath,\n target,\n projectRoot\n })\n });\n}\nfunction fileRelativePath(file) {\n return file.webkitRelativePath || file.name;\n}\nfunction appendUploadForm(files, opts) {\n const form = new FormData();\n if (opts.projectRoot) form.append('projectRoot', opts.projectRoot);\n if (opts.uploadId) form.append('uploadId', opts.uploadId);\n form.append('batchIndex', String(opts.batchIndex));\n form.append('totalBatches', String(opts.totalBatches));\n form.append('fileOffset', String(opts.fileOffset));\n form.append('startIndex', opts.startIndex ? '1' : '0');\n form.append('uploadComplete', opts.uploadComplete ?? opts.batchIndex === opts.totalBatches - 1 ? '1' : '0');\n for (const file of files){\n form.append('files', file, file.name);\n form.append('relativePaths', fileRelativePath(file));\n }\n return form;\n}\nasync function uploadKbFile(file, projectRoot, uploadId) {\n const params = new URLSearchParams();\n if (uploadId) params.set('uploadId', uploadId);\n params.set('batchIndex', '0');\n params.set('totalBatches', '1');\n return fetchJson(`/api/kb/upload?${params}`, {\n method: 'POST',\n body: appendUploadForm([\n file\n ], {\n projectRoot,\n uploadId,\n batchIndex: 0,\n totalBatches: 1,\n fileOffset: 0,\n startIndex: true\n })\n });\n}\nasync function uploadKbFiles(files, projectRoot, uploadId, onBatchProgress) {\n const maxFilesPerBatch = Number(process.env.NEXT_PUBLIC_CUSTOMIZE_KB_UPLOAD_BATCH_FILES || 500);\n const maxBytesPerBatch = Number(process.env.NEXT_PUBLIC_CUSTOMIZE_KB_UPLOAD_BATCH_BYTES || 128 * 1024 * 1024);\n const maxConcurrentBatches = Math.max(1, Math.min(4, Number(process.env.NEXT_PUBLIC_CUSTOMIZE_KB_UPLOAD_CONCURRENCY || 2)));\n const batches = [];\n let current = [];\n let currentBytes = 0;\n let currentOffset = 0;\n let nextOffset = 0;\n for (const file of files){\n if (current.length > 0 && (current.length >= maxFilesPerBatch || currentBytes + file.size > maxBytesPerBatch)) {\n batches.push({\n files: current,\n offset: currentOffset\n });\n current = [];\n currentBytes = 0;\n currentOffset = nextOffset;\n }\n current.push(file);\n currentBytes += file.size;\n nextOffset += 1;\n }\n if (current.length > 0) batches.push({\n files: current,\n offset: currentOffset\n });\n const results = [];\n let completedFiles = 0;\n let cursor = 0;\n async function uploadBatch(batchIndex) {\n const batch = batches[batchIndex];\n const params = new URLSearchParams({\n batchIndex: String(batchIndex),\n totalBatches: String(batches.length)\n });\n if (uploadId) params.set('uploadId', uploadId);\n const result = await fetchJson(`/api/kb/upload?${params}`, {\n method: 'POST',\n body: appendUploadForm(batch.files, {\n projectRoot,\n uploadId,\n batchIndex,\n totalBatches: batches.length,\n fileOffset: batch.offset,\n startIndex: batchIndex === 0,\n uploadComplete: batches.length === 1\n })\n });\n results[batchIndex] = result;\n completedFiles += batch.files.length;\n onBatchProgress?.({\n uploadedFiles: completedFiles,\n totalFiles: files.length,\n batchIndex,\n totalBatches: batches.length\n });\n }\n const workers = Array.from({\n length: Math.min(maxConcurrentBatches, batches.length)\n }, async ()=>{\n while(cursor < batches.length){\n const batchIndex = cursor++;\n await uploadBatch(batchIndex);\n }\n });\n await Promise.all(workers);\n if (batches.length > 1) {\n const result = await fetchJson(`/api/kb/upload/complete`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n projectRoot,\n uploadId\n })\n });\n results.push(result);\n }\n return results.filter(Boolean).at(-1) ?? {\n success: true\n };\n}\nasync function getKbUploadProgress(uploadId) {\n return fetchJson(`/api/kb/upload/progress?id=${encodeURIComponent(uploadId)}`);\n}\nasync function getKbOperations(projectRoot) {\n const params = new URLSearchParams({\n limit: '50'\n });\n if (projectRoot) params.set('projectRoot', projectRoot);\n return fetchJson(`/api/kb/operations?${params}`);\n}\nasync function getJobs(opts) {\n const params = new URLSearchParams({\n limit: String(opts?.limit ?? 50)\n });\n if (opts?.projectRoot) params.set('projectRoot', opts.projectRoot);\n if (opts?.active) params.set('active', '1');\n return fetchJson(`/api/jobs?${params}`);\n}\nasync function getJob(id, projectRoot) {\n const params = new URLSearchParams();\n if (projectRoot) params.set('projectRoot', projectRoot);\n return fetchJson(`/api/jobs/${encodeURIComponent(id)}?${params}`);\n}\nasync function clearKbOperations(projectRoot) {\n const params = new URLSearchParams();\n if (projectRoot) params.set('projectRoot', projectRoot);\n return fetchJson(`/api/kb/operations?${params}`, {\n method: 'DELETE'\n });\n}\nasync function deleteKbOperation(id, projectRoot) {\n const params = new URLSearchParams({\n id\n });\n if (projectRoot) params.set('projectRoot', projectRoot);\n return fetchJson(`/api/kb/operations?${params}`, {\n method: 'DELETE'\n });\n}\nasync function deleteKbFile(relativePath, projectRoot) {\n return fetchJson('/api/kb/files', {\n method: 'DELETE',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n relativePath,\n projectRoot\n })\n });\n}\nasync function deleteKbFiles(relativePaths, projectRoot) {\n return fetchJson('/api/kb/files', {\n method: 'DELETE',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n relativePaths,\n projectRoot\n })\n });\n}\nasync function deleteKbFolders(folderPaths, projectRoot) {\n return fetchJson('/api/kb/files', {\n method: 'DELETE',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n folderPaths,\n projectRoot\n })\n });\n}\nasync function deleteKbSelection(relativePaths, folderPaths, projectRoot) {\n return fetchJson('/api/kb/files', {\n method: 'DELETE',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n relativePaths,\n folderPaths,\n projectRoot\n })\n });\n}\nasync function deleteAllKbFiles(projectRoot) {\n return fetchJson('/api/kb/files', {\n method: 'DELETE',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n all: true,\n projectRoot\n })\n });\n}\nasync function reindexKb(projectRoot) {\n return fetchJson('/api/kb/reindex', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n projectRoot\n })\n });\n}\nasync function getReindexStatus(projectRoot) {\n const params = new URLSearchParams();\n if (projectRoot) params.set('projectRoot', projectRoot);\n return fetchJson(`/api/kb/reindex?${params}`);\n}\nasync function getKbTags(projectRoot) {\n const p = projectRoot ? `?projectRoot=${encodeURIComponent(projectRoot)}` : '';\n return fetchJson(`/api/kb/tags${p}`);\n}\nasync function getKbIgnoreRules(projectRoot) {\n const p = projectRoot ? `?projectRoot=${encodeURIComponent(projectRoot)}` : '';\n return fetchJson(`/api/kb/ignore${p}`);\n}\nasync function saveKbIgnoreRules(rules, projectRoot) {\n return fetchJson('/api/kb/ignore', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n rules,\n projectRoot\n })\n });\n}\nasync function getKbDuplicates(projectRoot) {\n const p = projectRoot ? `?projectRoot=${encodeURIComponent(projectRoot)}` : '';\n return fetchJson(`/api/kb/duplicates${p}`);\n}\nasync function getKbFeatures() {\n return fetchJson('/api/kb/features');\n}\nasync function searchKb(query, opts) {\n const params = new URLSearchParams({\n q: query\n });\n if (opts?.projectRoot) params.set('projectRoot', opts.projectRoot);\n if (opts?.category) params.set('category', opts.category);\n if (opts?.limit) params.set('limit', String(opts.limit ?? 20));\n if (opts?.weights?.keyword != null) params.set('keywordWeight', String(opts.weights.keyword));\n if (opts?.weights?.vector != null) params.set('vectorWeight', String(opts.weights.vector));\n if (opts?.weights?.rewrite != null) params.set('rewriteWeight', String(opts.weights.rewrite));\n if (opts?.weights?.hybridBonus != null) params.set('hybridBonus', String(opts.weights.hybridBonus));\n return fetchJson(`/api/kb/search?${params}`);\n}\nasync function getPromptProjects() {\n return fetchJson('/api/prompt');\n}\nasync function getDocumentRoles(type) {\n return fetchJson(`/api/documents/roles${type ? `?type=${type}` : ''}`);\n}\nasync function saveDocumentRole(role) {\n return fetchJson('/api/documents/roles', {\n method: 'PUT',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(role)\n });\n}\nasync function deleteDocumentRole(type, id) {\n return fetchJson(`/api/documents/roles?type=${type}&id=${encodeURIComponent(id)}`, {\n method: 'DELETE'\n });\n}\nasync function saveProjectRoleConfig(config) {\n return fetchJson('/api/documents/roles?mode=config', {\n method: 'PUT',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(config)\n });\n}\nasync function deleteProjectRoleConfig(id) {\n return fetchJson(`/api/documents/roles?mode=config&id=${encodeURIComponent(id)}`, {\n method: 'DELETE'\n });\n}\nasync function getDocumentTemplates() {\n return fetchJson('/api/documents/templates');\n}\nasync function validateDocumentTemplate(templateId, projectRoot) {\n const p = projectRoot ? `&projectRoot=${encodeURIComponent(projectRoot)}` : '';\n return fetchJson(`/api/documents/templates?validate=${encodeURIComponent(templateId)}${p}`);\n}\nasync function saveDocumentTemplate(template) {\n return fetchJson('/api/documents/templates', {\n method: 'PUT',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(template)\n });\n}\nasync function deleteDocumentTemplate(templateId) {\n return fetchJson(`/api/documents/templates?templateId=${encodeURIComponent(templateId)}`, {\n method: 'DELETE'\n });\n}\nasync function duplicateDocumentTemplate(templateId) {\n return fetchJson('/api/documents/templates', {\n method: 'PATCH',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n templateId\n })\n });\n}\nasync function generateDocumentDraft(input) {\n return fetchJson('/api/documents/generate', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(input)\n });\n}\nasync function getGeneratedDocuments(projectRoot) {\n const p = projectRoot ? `?projectRoot=${encodeURIComponent(projectRoot)}` : '';\n return fetchJson(`/api/documents/generated${p}`);\n}\nasync function getGeneratedDocument(id, lite = false, projectRoot, signal) {\n const params = new URLSearchParams();\n if (lite) params.set('lite', '1');\n if (projectRoot) params.set('projectRoot', projectRoot);\n const query = params.toString() ? `?${params.toString()}` : '';\n return fetchJson(`/api/documents/generated/${encodeURIComponent(id)}${query}`, {\n signal\n });\n}\nasync function updateGeneratedDocument(id, patch, projectRoot) {\n const p = projectRoot ? `?projectRoot=${encodeURIComponent(projectRoot)}` : '';\n return fetchJson(`/api/documents/generated/${encodeURIComponent(id)}${p}`, {\n method: 'PUT',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(patch)\n });\n}\nasync function deleteGeneratedDocument(id, projectRoot) {\n const p = projectRoot ? `?projectRoot=${encodeURIComponent(projectRoot)}` : '';\n return fetchJson(`/api/documents/generated/${encodeURIComponent(id)}${p}`, {\n method: 'DELETE'\n });\n}\nasync function abortGeneratedDocument(documentId, projectRoot) {\n return fetchJson('/api/documents/generated', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n action: 'abort',\n documentId,\n projectRoot\n })\n });\n}\nasync function resumeGeneratedDocument(documentId, projectRoot) {\n return fetchJson('/api/documents/generated', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n action: 'resume',\n documentId,\n projectRoot\n })\n });\n}\nasync function getGeneratedAssets(projectRoot) {\n const p = projectRoot ? `?projectRoot=${encodeURIComponent(projectRoot)}` : '';\n return fetchJson(`/api/assets/generated${p}`);\n}\nasync function deleteGeneratedAsset(id, projectRoot) {\n const p = projectRoot ? `&projectRoot=${encodeURIComponent(projectRoot)}` : '';\n return fetchJson(`/api/assets/generated?id=${encodeURIComponent(id)}${p}`, {\n method: 'DELETE'\n });\n}\nasync function openGeneratedAsset(id, target, projectRoot) {\n return fetchJson('/api/assets/generated', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n id,\n action: 'open',\n target,\n projectRoot\n })\n });\n}\nasync function regenerateDocumentChapter(input) {\n return fetchJson('/api/documents/chapter/regenerate', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(input)\n });\n}\nasync function refineGeneratedDocument(input) {\n return fetchJson('/api/documents/refine', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(input)\n });\n}\nasync function getDocumentDrafts() {\n return fetchJson('/api/documents/drafts');\n}\nasync function saveDocumentDraft(draft, id) {\n return fetchJson('/api/documents/drafts', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n draft,\n id\n })\n });\n}\nasync function exportDocument(input) {\n const response = await fetch('/api/documents/export', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Accept: input.format === 'pdf' ? 'application/pdf' : '*/*'\n },\n body: JSON.stringify(input)\n });\n const contentType = response.headers.get('content-type') || '';\n const parseExportError = async ()=>{\n const text = await response.text();\n let message = text || '导出失败';\n try {\n const parsed = JSON.parse(text);\n const issueText = parsed.issues?.map((issue)=>issue.message).filter(Boolean).slice(0, 3).join(';');\n message = issueText ? `${parsed.error || '导出失败'}:${issueText}` : parsed.message || parsed.error || message;\n } catch {\n // 保留原始响应文本\n }\n throw new Error(message.length > 300 ? `${message.slice(0, 300)}...` : message);\n };\n if (!response.ok) await parseExportError();\n if (input.format === 'pdf' && !contentType.includes('application/pdf')) await parseExportError();\n if (input.format === 'docx' && !contentType.includes('officedocument.wordprocessingml.document')) await parseExportError();\n return response.blob();\n}\nasync function getProviders() {\n return fetchJson('/api/config/providers');\n}\nasync function saveProvider(name, cfg) {\n return fetchJson('/api/config/providers', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n name,\n ...cfg\n })\n });\n}\nasync function deleteProvider(name) {\n return fetchJson(`/api/config/providers/${encodeURIComponent(name)}`, {\n method: 'DELETE'\n });\n}\nasync function getModels() {\n return fetchJson('/api/config/models');\n}\nasync function saveModels(models) {\n return fetchJson('/api/config/models', {\n method: 'PUT',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(models)\n });\n}\nasync function getEmbeddingConfig() {\n return fetchJson('/api/config/embedding');\n}\nasync function saveEmbeddingConfig(config) {\n return fetchJson('/api/config/embedding', {\n method: 'PUT',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(config)\n });\n}\nasync function embeddingHealthCheck() {\n return fetchJson('/api/config/embedding/healthCheck', {\n method: 'POST'\n });\n}\nasync function getWebAccessConfig() {\n return fetchJson('/api/config/web-access');\n}\nasync function saveWebAccessConfig(config) {\n return fetchJson('/api/config/web-access', {\n method: 'PUT',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(config)\n });\n}\nasync function healthCheck(providerName) {\n return fetchJson('/api/config/healthCheck', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n provider: providerName\n })\n });\n}\nasync function getHealth() {\n return fetchJson('/api/health');\n}\nasync function getSystemStats() {\n return fetchJson('/api/system/stats');\n}\nasync function getErrorLogs(limit = 200) {\n return fetchJson(`/api/system/logs?limit=${limit}`);\n}\nasync function clearErrorLogs() {\n return fetchJson('/api/system/logs', {\n method: 'DELETE'\n });\n}\nasync function getKbCategoryStats(projectRoot) {\n const p = projectRoot ? `?projectRoot=${encodeURIComponent(projectRoot)}` : '';\n return fetchJson(`/api/kb/categories${p}`);\n}\n// ═══════ 供应商详情 ═══════\nasync function getProviderDetail(name) {\n return fetchJson(`/api/config/providers/${encodeURIComponent(name)}`);\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUFFK0osVUFBVUQ7UUFBYTtJQUFHO0FBQ2pQO0FBQ08sZUFBZUU7SUFBYyxPQUFPMU0sVUFBOEM7QUFBZ0I7QUFhbEcsZUFBZTJNO0lBQW1CLE9BQU8zTSxVQUF1QjtBQUFzQjtBQWN0RixlQUFlNE0sYUFBYTNLLFFBQVEsR0FBRztJQUFJLE9BQU9qQyxVQUFxQyxDQUFDLHVCQUF1QixFQUFFaUMsT0FBTztBQUFHO0FBQzNILGVBQWU0SztJQUFtQixPQUFPN00sVUFBd0Isb0JBQW9CO1FBQUV3QyxRQUFRO0lBQVM7QUFBSTtBQVU1RyxlQUFlc0ssbUJBQW1CeEwsV0FBb0I7SUFDM0QsTUFBTUMsSUFBSUQsY0FBYyxDQUFDLGFBQWEsRUFBRUUsbUJBQW1CRixjQUFjLEdBQUc7SUFDNUUsT0FBT3RCLFVBQTZCLENBQUMsa0JBQWtCLEVBQUV1QixHQUFHO0FBQzlEO0FBRUEsd0JBQXdCO0FBQ2pCLGVBQWV3TCxrQkFBa0I1SixJQUFZO0lBQ2xELE9BQU9uRCxVQUF3QixDQUFDLHNCQUFzQixFQUFFd0IsbUJBQW1CMkIsT0FBTztBQUNwRiIsInNvdXJjZXMiOlsiL1VzZXJzL3Bhbi9EZXNrdG9wL2NvZGVpbmcvY3VzdG9taXplLWFnZW50L2FwcHMvc2VydmVyL3NyYy9saWIvYXBpLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKiDlsIHoo4XnmoQgSlNPTiDor7fmsYLlh73mlbDvvIzoh6rliqjlsIbpnZ4gMnh4IOWTjeW6lOino+aekOS4uumUmeivr+S/oeaBr+W5tuaKm+WHuiAqL1xuYXN5bmMgZnVuY3Rpb24gZmV0Y2hKc29uPFQ+KHVybDogc3RyaW5nLCBvcHRpb25zPzogUmVxdWVzdEluaXQpOiBQcm9taXNlPFQ+IHtcbiAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2godXJsLCBvcHRpb25zKTtcbiAgaWYgKCFyZXMub2spIHtcbiAgICBjb25zdCBib2R5ID0gYXdhaXQgcmVzLnRleHQoKTtcbiAgICBsZXQgbWVzc2FnZSA9IGJvZHkgfHwgYEhUVFAgJHtyZXMuc3RhdHVzfWA7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2UoYm9keSkgYXMgeyBlcnJvcj86IHN0cmluZzsgbWVzc2FnZT86IHN0cmluZyB9O1xuICAgICAgbWVzc2FnZSA9IHBhcnNlZC5lcnJvciB8fCBwYXJzZWQubWVzc2FnZSB8fCBtZXNzYWdlO1xuICAgIH0gY2F0Y2gge1xuICAgICAgY29uc3QgaHRtbEVycm9yID0gYm9keS5tYXRjaCgvPHNjcmlwdCBpZD1cIl9fTkVYVF9EQVRBX19cIiB0eXBlPVwiYXBwbGljYXRpb25cXC9qc29uXCI+KFtcXHNcXFNdKj8pPFxcL3NjcmlwdD4vdSk/LlsxXTtcbiAgICAgIGlmIChodG1sRXJyb3IpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBuZXh0RGF0YSA9IEpTT04ucGFyc2UoaHRtbEVycm9yLnJlcGxhY2UoLyZxdW90Oy9ndSwgJ1wiJykpIGFzIHsgZXJyPzogeyBtZXNzYWdlPzogc3RyaW5nOyBzdGF0dXNDb2RlPzogbnVtYmVyIH0gfTtcbiAgICAgICAgICBtZXNzYWdlID0gbmV4dERhdGEuZXJyPy5tZXNzYWdlIHx8IGBIVFRQICR7cmVzLnN0YXR1c31gO1xuICAgICAgICB9IGNhdGNoIHsgbWVzc2FnZSA9IGBIVFRQICR7cmVzLnN0YXR1c31gOyB9XG4gICAgICB9XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgfVxuICByZXR1cm4gcmVzLmpzb24oKTtcbn1cblxuLy8g4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQIOefpeivhuW6kyDilZDilZDilZDilZDilZDilZDilZBcblxuZXhwb3J0IGludGVyZmFjZSBLYlZlY3RvclN0YXR1cyB7IHN0YXR1czogc3RyaW5nOyBlcnJvcj86IHN0cmluZzsgaW5kZXhlZENodW5rczogbnVtYmVyOyBsYXN0SW5kZXhlZEF0OiBudW1iZXI7IGJhY2tlbmQ6IHN0cmluZzsgfVxuZXhwb3J0IGludGVyZmFjZSBLYlN0YXRzIHsgc2NvcGU6IHN0cmluZzsgcHJvamVjdElkPzogc3RyaW5nOyBmaWxlQ291bnQ6IG51bWJlcjsgY2h1bmtDb3VudDogbnVtYmVyOyB0b3RhbFNpemVCeXRlczogbnVtYmVyOyBsYXN0SW5kZXhlZEF0OiBudW1iZXI7IHZlY3RvclN0YXR1cz86IEtiVmVjdG9yU3RhdHVzOyB9XG5leHBvcnQgaW50ZXJmYWNlIEtiRmlsZUl0ZW0geyByZWxhdGl2ZVBhdGg6IHN0cmluZzsgY2F0ZWdvcnk6IHN0cmluZzsgZm9ybWF0OiBzdHJpbmc7IGZpbGVTaXplOiBudW1iZXI7IG10aW1lOiBudW1iZXI7IGNodW5rQ291bnQ6IG51bWJlcjsgaW5kZXhlZEF0OiBudW1iZXI7IHN0YXR1czogc3RyaW5nOyBlcnJvck1lc3NhZ2U/OiBzdHJpbmc7IG1ldGFkYXRhSnNvbj86IHN0cmluZzsgbWF0Y2hlZEJ5PzogJ3BhdGgnIHwgJ21ldGFkYXRhJyB8ICdjb250ZW50JyB8ICdkaXNrJzsgc2NvcmU/OiBudW1iZXI7IH1cbmV4cG9ydCBpbnRlcmZhY2UgS2JGZWF0dXJlcyB7IHZlY3RvclN0b3JlOiBzdHJpbmc7IGVtYmVkZGluZ1Byb3ZpZGVyOiBzdHJpbmc7IGJ1aWx0aW5FeHRyYWN0b3JzOiBzdHJpbmdbXTsgZGVkdXBFbmdpbmU6IHN0cmluZzsgY2h1bmtlcjogc3RyaW5nOyB9XG5leHBvcnQgaW50ZXJmYWNlIEtiVXBsb2FkUHJvZ3Jlc3MgeyBpZDogc3RyaW5nOyBzdGFnZTogc3RyaW5nOyBwZXJjZW50OiBudW1iZXI7IG1lc3NhZ2U6IHN0cmluZzsgZmlsZU5hbWU/OiBzdHJpbmc7IGNodW5rQ291bnQ/OiBudW1iZXI7IHZlY3RvclN0YXR1cz86IEtiVmVjdG9yU3RhdHVzOyBlcnJvcj86IHN0cmluZzsgdXBkYXRlZEF0OiBudW1iZXI7IH1cbmV4cG9ydCBpbnRlcmZhY2UgS2JPcGVyYXRpb25SZWNvcmQgeyBpZDogc3RyaW5nOyB0eXBlOiAndXBsb2FkJyB8ICdkZWxldGUnIHwgJ3JlaW5kZXgnIHwgJ2RvY3VtZW50Jzsgc3RhZ2U6IHN0cmluZzsgc3RhdHVzOiAncHJvY2Vzc2luZycgfCAnc3VjY2VzcycgfCAnd2FybmluZycgfCAnZXJyb3InOyB0aXRsZTogc3RyaW5nOyBtZXNzYWdlOiBzdHJpbmc7IHBlcmNlbnQ6IG51bWJlcjsgZmlsZU5hbWU/OiBzdHJpbmc7IGZpbGVQYXRoPzogc3RyaW5nOyBjaHVua0NvdW50PzogbnVtYmVyOyB0ZXh0TGVuZ3RoPzogbnVtYmVyOyBleHRyYWN0aW9uTW9kZT86IHN0cmluZzsgZXJyb3I/OiBzdHJpbmc7IGRldGFpbHM/OiBzdHJpbmdbXTsgY3JlYXRlZEF0OiBudW1iZXI7IHVwZGF0ZWRBdDogbnVtYmVyOyB9XG5leHBvcnQgaW50ZXJmYWNlIEtiU3RvcmVkQ2h1bmsgeyBpZDogc3RyaW5nOyByZWxhdGl2ZVBhdGg6IHN0cmluZzsgY2h1bmtJbmRleDogbnVtYmVyOyBjb250ZW50OiBzdHJpbmc7IGNhdGVnb3J5OiBzdHJpbmc7IGZvcm1hdDogc3RyaW5nOyB0b2tlbkNvdW50OiBudW1iZXI7IHNlY3Rpb25UaXRsZT86IHN0cmluZzsgbWV0YWRhdGFKc29uPzogc3RyaW5nOyBjcmVhdGVkQXQ6IG51bWJlcjsgfVxuZXhwb3J0IGludGVyZmFjZSBLYlBhcmVudENodW5rIHsgaWQ6IHN0cmluZzsgcmVsYXRpdmVQYXRoOiBzdHJpbmc7IHBhcmVudElkOiBzdHJpbmc7IGNvbnRlbnQ6IHN0cmluZzsgY2F0ZWdvcnk6IHN0cmluZzsgZm9ybWF0OiBzdHJpbmc7IHNlY3Rpb25UaXRsZT86IHN0cmluZzsgY2h1bmtDb3VudDogbnVtYmVyOyBtZXRhZGF0YUpzb24/OiBzdHJpbmc7IGNyZWF0ZWRBdDogbnVtYmVyOyB9XG5leHBvcnQgaW50ZXJmYWNlIEtiRmlsZURldGFpbCB7IGZpbGU6IEtiRmlsZUl0ZW07IGFic29sdXRlUGF0aD86IHN0cmluZzsgZGlyZWN0b3J5Pzogc3RyaW5nOyBjaHVua3M6IEtiU3RvcmVkQ2h1bmtbXTsgcGFyZW50czogS2JQYXJlbnRDaHVua1tdOyByZWxhdGlvbnNoaXBzOiB1bmtub3duW107IHRhZ3M6IEFycmF5PHsgZmlsZVBhdGg6IHN0cmluZzsgdGFnOiBzdHJpbmc7IGNyZWF0ZWRBdDogbnVtYmVyIH0+OyB9XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRLYlN0YXRzKHByb2plY3RSb290Pzogc3RyaW5nKSB7XG4gIGNvbnN0IHAgPSBwcm9qZWN0Um9vdCA/IGA/cHJvamVjdFJvb3Q9JHtlbmNvZGVVUklDb21wb25lbnQocHJvamVjdFJvb3QpfWAgOiAnJztcbiAgcmV0dXJuIGZldGNoSnNvbjxLYlN0YXRzPihgL2FwaS9rYi9zdGF0cyR7cH1gKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEtiRmlsZXMob3B0cz86IHsgcHJvamVjdFJvb3Q/OiBzdHJpbmc7IGNhdGVnb3J5Pzogc3RyaW5nOyBwYWdlPzogbnVtYmVyOyBsaW1pdD86IG51bWJlciB9KSB7XG4gIGNvbnN0IHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoKTtcbiAgaWYgKG9wdHM/LnByb2plY3RSb290KSBwYXJhbXMuc2V0KCdwcm9qZWN0Um9vdCcsIG9wdHMucHJvamVjdFJvb3QpO1xuICBpZiAob3B0cz8uY2F0ZWdvcnkpIHBhcmFtcy5zZXQoJ2NhdGVnb3J5Jywgb3B0cy5jYXRlZ29yeSk7XG4gIGlmIChvcHRzPy5wYWdlKSBwYXJhbXMuc2V0KCdwYWdlJywgU3RyaW5nKG9wdHMucGFnZSA/PyAxKSk7XG4gIGlmIChvcHRzPy5saW1pdCkgcGFyYW1zLnNldCgnbGltaXQnLCBTdHJpbmcob3B0cy5saW1pdCA/PyA1MCkpO1xuICByZXR1cm4gZmV0Y2hKc29uPHsgZmlsZXM6IEtiRmlsZUl0ZW1bXTsgdG90YWw6IG51bWJlcjsgdmVjdG9yU3RhdHVzPzogS2JWZWN0b3JTdGF0dXM7IGluaXRpYWxpemluZz86IGJvb2xlYW4gfT4oYC9hcGkva2IvZmlsZXM/JHtwYXJhbXN9YCk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRLYkZpbGVzVHJlZShwYXJlbnRQYXRoOiBzdHJpbmcgPSAnJywgcHJvamVjdFJvb3Q/OiBzdHJpbmcpIHtcbiAgY29uc3QgcGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcygpO1xuICBpZiAocHJvamVjdFJvb3QpIHBhcmFtcy5zZXQoJ3Byb2plY3RSb290JywgcHJvamVjdFJvb3QpO1xuICBpZiAocGFyZW50UGF0aCkgcGFyYW1zLnNldCgncGFyZW50UGF0aCcsIHBhcmVudFBhdGgpO1xuICByZXR1cm4gZmV0Y2hKc29uPHsgbm9kZXM6IEFycmF5PHsga2V5OiBzdHJpbmc7IHRpdGxlOiBzdHJpbmc7IGlzRm9sZGVyOiBib29sZWFuOyBpc0xlYWY6IGJvb2xlYW47IGZpbGVDb3VudD86IG51bWJlciB9PiB9PihgL2FwaS9rYi9maWxlcy90cmVlPyR7cGFyYW1zfWApO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2VhcmNoS2JGaWxlcyhvcHRzPzogeyBxdWVyeT86IHN0cmluZzsgcHJvamVjdFJvb3Q/OiBzdHJpbmc7IGNhdGVnb3J5Pzogc3RyaW5nOyBsaW1pdD86IG51bWJlcjsgaW5jbHVkZUNvbnRlbnQ/OiBib29sZWFuIH0pIHtcbiAgY29uc3QgcGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcygpO1xuICBpZiAob3B0cz8ucXVlcnkpIHBhcmFtcy5zZXQoJ3EnLCBvcHRzLnF1ZXJ5KTtcbiAgaWYgKG9wdHM/LnByb2plY3RSb290KSBwYXJhbXMuc2V0KCdwcm9qZWN0Um9vdCcsIG9wdHMucHJvamVjdFJvb3QpO1xuICBpZiAob3B0cz8uY2F0ZWdvcnkpIHBhcmFtcy5zZXQoJ2NhdGVnb3J5Jywgb3B0cy5jYXRlZ29yeSk7XG4gIGlmIChvcHRzPy5saW1pdCkgcGFyYW1zLnNldCgnbGltaXQnLCBTdHJpbmcob3B0cy5saW1pdCkpO1xuICBpZiAob3B0cz8uaW5jbHVkZUNvbnRlbnQgPT09IGZhbHNlKSBwYXJhbXMuc2V0KCdpbmNsdWRlQ29udGVudCcsICcwJyk7XG4gIHJldHVybiBmZXRjaEpzb248eyBmaWxlczogS2JGaWxlSXRlbVtdOyB0b3RhbDogbnVtYmVyIH0+KGAvYXBpL2tiL2ZpbGVzL3NlYXJjaD8ke3BhcmFtc31gKTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBLYlJldHJpZXZhbEV2YWxDYXNlIHsgaWQ/OiBzdHJpbmc7IHF1ZXJ5OiBzdHJpbmc7IHJlbGV2YW50RmlsZXM/OiBzdHJpbmdbXTsgcmVsZXZhbnRTbmlwcGV0cz86IHN0cmluZ1tdOyBleHBlY3RlZFRlcm1zPzogc3RyaW5nW107IGZpbGVQYXRocz86IHN0cmluZ1tdOyBmaWxlUGF0aFByZWZpeGVzPzogc3RyaW5nW107IHRvcEs/OiBudW1iZXI7IH1cbmV4cG9ydCBpbnRlcmZhY2UgS2JSZXRyaWV2YWxFdmFsUmVwb3J0IHsgdG90YWxDYXNlczogbnVtYmVyOyB2YWxpZENhc2VzOiBudW1iZXI7IGludmFsaWRDYXNlczogbnVtYmVyOyB0b3BLOiBudW1iZXI7IHJlY2FsbEF0SzogbnVtYmVyOyBwcmVjaXNpb25BdEs6IG51bWJlcjsgbXJyOiBudW1iZXI7IG5kY2dBdEs6IG51bWJlcjsgcGFzczk1OiBib29sZWFuOyBjYXNlczogdW5rbm93bltdOyBpbnZhbGlkOiBBcnJheTx7IGlkOiBzdHJpbmc7IHF1ZXJ5OiBzdHJpbmc7IHJlYXNvbjogc3RyaW5nIH0+OyB9XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBldmFsdWF0ZUtiUmV0cmlldmFsKG9wdHM6IHsgcHJvamVjdFJvb3Q/OiBzdHJpbmc7IGNhc2VzPzogS2JSZXRyaWV2YWxFdmFsQ2FzZVtdOyB0b3BLPzogbnVtYmVyOyBnZW5lcmF0aW9uTW9kZT86IGJvb2xlYW47IGZpbGVQYXRocz86IHN0cmluZ1tdOyBmaWxlUGF0aFByZWZpeGVzPzogc3RyaW5nW107IGF1dG9HZW5lcmF0ZT86IGJvb2xlYW47IGxpbWl0PzogbnVtYmVyOyBwZXJGaWxlTGltaXQ/OiBudW1iZXI7IGZpbGVMYXllcj86ICdhbGwnIHwgJ2RvY3VtZW50JyB8ICdjYWQnOyBpbmNsdWRlRXh0ZW5zaW9ucz86IHN0cmluZ1tdOyBleGNsdWRlRXh0ZW5zaW9ucz86IHN0cmluZ1tdOyBjb21wYWN0PzogYm9vbGVhbjsgZGlzYWJsZVJlcmFua2VyPzogYm9vbGVhbiB9KSB7XG4gIHJldHVybiBmZXRjaEpzb248S2JSZXRyaWV2YWxFdmFsUmVwb3J0PignL2FwaS9rYi9ldmFsdWF0ZScsIHtcbiAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICBib2R5OiBKU09OLnN0cmluZ2lmeShvcHRzKSxcbiAgfSk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRLYkZpbGVEZXRhaWwocmVsYXRpdmVQYXRoOiBzdHJpbmcsIHByb2plY3RSb290Pzogc3RyaW5nKSB7XG4gIGNvbnN0IHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoeyByZWxhdGl2ZVBhdGggfSk7XG4gIGlmIChwcm9qZWN0Um9vdCkgcGFyYW1zLnNldCgncHJvamVjdFJvb3QnLCBwcm9qZWN0Um9vdCk7XG4gIHJldHVybiBmZXRjaEpzb248S2JGaWxlRGV0YWlsPihgL2FwaS9rYi9maWxlcy9kZXRhaWw/JHtwYXJhbXN9YCk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWluZGV4S2JGaWxlKHJlbGF0aXZlUGF0aDogc3RyaW5nLCBwcm9qZWN0Um9vdD86IHN0cmluZykge1xuICByZXR1cm4gZmV0Y2hKc29uPHsgc3VjY2VzczogYm9vbGVhbjsgYWNjZXB0ZWQ/OiBib29sZWFuOyBhbHJlYWR5UnVubmluZz86IGJvb2xlYW47IG9wZXJhdGlvbklkPzogc3RyaW5nOyBqb2I/OiBLYk9wZXJhdGlvblJlY29yZDsgZGV0YWlsPzogS2JGaWxlRGV0YWlsOyBmaWxlQ291bnQ/OiBudW1iZXIgfT4oJy9hcGkva2IvZmlsZXMvcmVpbmRleCcsIHtcbiAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IHJlbGF0aXZlUGF0aCwgcHJvamVjdFJvb3QgfSksXG4gIH0pO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gb3BlbktiRmlsZVRhcmdldChyZWxhdGl2ZVBhdGg6IHN0cmluZywgdGFyZ2V0OiAnZmlsZScgfCAnZGlyZWN0b3J5JywgcHJvamVjdFJvb3Q/OiBzdHJpbmcpIHtcbiAgcmV0dXJuIGZldGNoSnNvbjx7IHN1Y2Nlc3M6IGJvb2xlYW4gfT4oJy9hcGkva2IvZmlsZXMvb3BlbicsIHtcbiAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IHJlbGF0aXZlUGF0aCwgdGFyZ2V0LCBwcm9qZWN0Um9vdCB9KSxcbiAgfSk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgS2JVcGxvYWRCYXRjaFJlc3VsdCB7IHN1Y2Nlc3M6IGJvb2xlYW47IGFjY2VwdGVkPzogYm9vbGVhbjsgb3BlcmF0aW9uSWQ/OiBzdHJpbmc7IHJlbGF0aXZlUGF0aD86IHN0cmluZzsgam9icz86IEFycmF5PHsgaWQ6IHN0cmluZzsgcmVsYXRpdmVQYXRoOiBzdHJpbmc7IHN0YXR1czogc3RyaW5nIH0+OyBiYXRjaEluZGV4PzogbnVtYmVyOyB0b3RhbEJhdGNoZXM/OiBudW1iZXI7IGluZGV4aW5nU3RhcnRlZD86IGJvb2xlYW47IH1cblxuZnVuY3Rpb24gZmlsZVJlbGF0aXZlUGF0aChmaWxlOiBGaWxlKSB7XG4gIHJldHVybiAoZmlsZSBhcyBGaWxlICYgeyB3ZWJraXRSZWxhdGl2ZVBhdGg/OiBzdHJpbmcgfSkud2Via2l0UmVsYXRpdmVQYXRoIHx8IGZpbGUubmFtZTtcbn1cblxuZnVuY3Rpb24gYXBwZW5kVXBsb2FkRm9ybShmaWxlczogRmlsZVtdLCBvcHRzOiB7IHByb2plY3RSb290Pzogc3RyaW5nOyB1cGxvYWRJZD86IHN0cmluZzsgYmF0Y2hJbmRleDogbnVtYmVyOyB0b3RhbEJhdGNoZXM6IG51bWJlcjsgZmlsZU9mZnNldDogbnVtYmVyOyBzdGFydEluZGV4OiBib29sZWFuOyB1cGxvYWRDb21wbGV0ZT86IGJvb2xlYW4gfSkge1xuICBjb25zdCBmb3JtID0gbmV3IEZvcm1EYXRhKCk7XG4gIGlmIChvcHRzLnByb2plY3RSb290KSBmb3JtLmFwcGVuZCgncHJvamVjdFJvb3QnLCBvcHRzLnByb2plY3RSb290KTtcbiAgaWYgKG9wdHMudXBsb2FkSWQpIGZvcm0uYXBwZW5kKCd1cGxvYWRJZCcsIG9wdHMudXBsb2FkSWQpO1xuICBmb3JtLmFwcGVuZCgnYmF0Y2hJbmRleCcsIFN0cmluZyhvcHRzLmJhdGNoSW5kZXgpKTtcbiAgZm9ybS5hcHBlbmQoJ3RvdGFsQmF0Y2hlcycsIFN0cmluZyhvcHRzLnRvdGFsQmF0Y2hlcykpO1xuICBmb3JtLmFwcGVuZCgnZmlsZU9mZnNldCcsIFN0cmluZyhvcHRzLmZpbGVPZmZzZXQpKTtcbiAgZm9ybS5hcHBlbmQoJ3N0YXJ0SW5kZXgnLCBvcHRzLnN0YXJ0SW5kZXggPyAnMScgOiAnMCcpO1xuICBmb3JtLmFwcGVuZCgndXBsb2FkQ29tcGxldGUnLCAob3B0cy51cGxvYWRDb21wbGV0ZSA/PyBvcHRzLmJhdGNoSW5kZXggPT09IG9wdHMudG90YWxCYXRjaGVzIC0gMSkgPyAnMScgOiAnMCcpO1xuICBmb3IgKGNvbnN0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICBmb3JtLmFwcGVuZCgnZmlsZXMnLCBmaWxlLCBmaWxlLm5hbWUpO1xuICAgIGZvcm0uYXBwZW5kKCdyZWxhdGl2ZVBhdGhzJywgZmlsZVJlbGF0aXZlUGF0aChmaWxlKSk7XG4gIH1cbiAgcmV0dXJuIGZvcm07XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB1cGxvYWRLYkZpbGUoZmlsZTogRmlsZSwgcHJvamVjdFJvb3Q/OiBzdHJpbmcsIHVwbG9hZElkPzogc3RyaW5nKSB7XG4gIGNvbnN0IHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoKTtcbiAgaWYgKHVwbG9hZElkKSBwYXJhbXMuc2V0KCd1cGxvYWRJZCcsIHVwbG9hZElkKTtcbiAgcGFyYW1zLnNldCgnYmF0Y2hJbmRleCcsICcwJyk7XG4gIHBhcmFtcy5zZXQoJ3RvdGFsQmF0Y2hlcycsICcxJyk7XG4gIHJldHVybiBmZXRjaEpzb248S2JVcGxvYWRCYXRjaFJlc3VsdD4oYC9hcGkva2IvdXBsb2FkPyR7cGFyYW1zfWAsIHtcbiAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICBib2R5OiBhcHBlbmRVcGxvYWRGb3JtKFtmaWxlXSwgeyBwcm9qZWN0Um9vdCwgdXBsb2FkSWQsIGJhdGNoSW5kZXg6IDAsIHRvdGFsQmF0Y2hlczogMSwgZmlsZU9mZnNldDogMCwgc3RhcnRJbmRleDogdHJ1ZSB9KSxcbiAgfSk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB1cGxvYWRLYkZpbGVzKGZpbGVzOiBGaWxlW10sIHByb2plY3RSb290Pzogc3RyaW5nLCB1cGxvYWRJZD86IHN0cmluZywgb25CYXRjaFByb2dyZXNzPzogKHByb2dyZXNzOiB7IHVwbG9hZGVkRmlsZXM6IG51bWJlcjsgdG90YWxGaWxlczogbnVtYmVyOyBiYXRjaEluZGV4OiBudW1iZXI7IHRvdGFsQmF0Y2hlczogbnVtYmVyIH0pID0+IHZvaWQpIHtcbiAgY29uc3QgbWF4RmlsZXNQZXJCYXRjaCA9IE51bWJlcihwcm9jZXNzLmVudi5ORVhUX1BVQkxJQ19DVVNUT01JWkVfS0JfVVBMT0FEX0JBVENIX0ZJTEVTIHx8IDUwMCk7XG4gIGNvbnN0IG1heEJ5dGVzUGVyQmF0Y2ggPSBOdW1iZXIocHJvY2Vzcy5lbnYuTkVYVF9QVUJMSUNfQ1VTVE9NSVpFX0tCX1VQTE9BRF9CQVRDSF9CWVRFUyB8fCAxMjggKiAxMDI0ICogMTAyNCk7XG4gIGNvbnN0IG1heENvbmN1cnJlbnRCYXRjaGVzID0gTWF0aC5tYXgoMSwgTWF0aC5taW4oNCwgTnVtYmVyKHByb2Nlc3MuZW52Lk5FWFRfUFVCTElDX0NVU1RPTUlaRV9LQl9VUExPQURfQ09OQ1VSUkVOQ1kgfHwgMikpKTtcbiAgY29uc3QgYmF0Y2hlczogQXJyYXk8eyBmaWxlczogRmlsZVtdOyBvZmZzZXQ6IG51bWJlciB9PiA9IFtdO1xuICBsZXQgY3VycmVudDogRmlsZVtdID0gW107XG4gIGxldCBjdXJyZW50Qnl0ZXMgPSAwO1xuICBsZXQgY3VycmVudE9mZnNldCA9IDA7XG4gIGxldCBuZXh0T2Zmc2V0ID0gMDtcbiAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgaWYgKGN1cnJlbnQubGVuZ3RoID4gMCAmJiAoY3VycmVudC5sZW5ndGggPj0gbWF4RmlsZXNQZXJCYXRjaCB8fCBjdXJyZW50Qnl0ZXMgKyBmaWxlLnNpemUgPiBtYXhCeXRlc1BlckJhdGNoKSkge1xuICAgICAgYmF0Y2hlcy5wdXNoKHsgZmlsZXM6IGN1cnJlbnQsIG9mZnNldDogY3VycmVudE9mZnNldCB9KTtcbiAgICAgIGN1cnJlbnQgPSBbXTtcbiAgICAgIGN1cnJlbnRCeXRlcyA9IDA7XG4gICAgICBjdXJyZW50T2Zmc2V0ID0gbmV4dE9mZnNldDtcbiAgICB9XG4gICAgY3VycmVudC5wdXNoKGZpbGUpO1xuICAgIGN1cnJlbnRCeXRlcyArPSBmaWxlLnNpemU7XG4gICAgbmV4dE9mZnNldCArPSAxO1xuICB9XG4gIGlmIChjdXJyZW50Lmxlbmd0aCA+IDApIGJhdGNoZXMucHVzaCh7IGZpbGVzOiBjdXJyZW50LCBvZmZzZXQ6IGN1cnJlbnRPZmZzZXQgfSk7XG5cbiAgY29uc3QgcmVzdWx0czogS2JVcGxvYWRCYXRjaFJlc3VsdFtdID0gW107XG4gIGxldCBjb21wbGV0ZWRGaWxlcyA9IDA7XG4gIGxldCBjdXJzb3IgPSAwO1xuICBhc3luYyBmdW5jdGlvbiB1cGxvYWRCYXRjaChiYXRjaEluZGV4OiBudW1iZXIpIHtcbiAgICBjb25zdCBiYXRjaCA9IGJhdGNoZXNbYmF0Y2hJbmRleF0hO1xuICAgIGNvbnN0IHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoeyBiYXRjaEluZGV4OiBTdHJpbmcoYmF0Y2hJbmRleCksIHRvdGFsQmF0Y2hlczogU3RyaW5nKGJhdGNoZXMubGVuZ3RoKSB9KTtcbiAgICBpZiAodXBsb2FkSWQpIHBhcmFtcy5zZXQoJ3VwbG9hZElkJywgdXBsb2FkSWQpO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGZldGNoSnNvbjxLYlVwbG9hZEJhdGNoUmVzdWx0PihgL2FwaS9rYi91cGxvYWQ/JHtwYXJhbXN9YCwge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBib2R5OiBhcHBlbmRVcGxvYWRGb3JtKGJhdGNoLmZpbGVzLCB7XG4gICAgICAgIHByb2plY3RSb290LFxuICAgICAgICB1cGxvYWRJZCxcbiAgICAgICAgYmF0Y2hJbmRleCxcbiAgICAgICAgdG90YWxCYXRjaGVzOiBiYXRjaGVzLmxlbmd0aCxcbiAgICAgICAgZmlsZU9mZnNldDogYmF0Y2gub2Zmc2V0LFxuICAgICAgICBzdGFydEluZGV4OiBiYXRjaEluZGV4ID09PSAwLFxuICAgICAgICB1cGxvYWRDb21wbGV0ZTogYmF0Y2hlcy5sZW5ndGggPT09IDEsXG4gICAgICB9KSxcbiAgICB9KTtcbiAgICByZXN1bHRzW2JhdGNoSW5kZXhdID0gcmVzdWx0O1xuICAgIGNvbXBsZXRlZEZpbGVzICs9IGJhdGNoLmZpbGVzLmxlbmd0aDtcbiAgICBvbkJhdGNoUHJvZ3Jlc3M/Lih7IHVwbG9hZGVkRmlsZXM6IGNvbXBsZXRlZEZpbGVzLCB0b3RhbEZpbGVzOiBmaWxlcy5sZW5ndGgsIGJhdGNoSW5kZXgsIHRvdGFsQmF0Y2hlczogYmF0Y2hlcy5sZW5ndGggfSk7XG4gIH1cbiAgY29uc3Qgd29ya2VycyA9IEFycmF5LmZyb20oeyBsZW5ndGg6IE1hdGgubWluKG1heENvbmN1cnJlbnRCYXRjaGVzLCBiYXRjaGVzLmxlbmd0aCkgfSwgYXN5bmMgKCkgPT4ge1xuICAgIHdoaWxlIChjdXJzb3IgPCBiYXRjaGVzLmxlbmd0aCkge1xuICAgICAgY29uc3QgYmF0Y2hJbmRleCA9IGN1cnNvcisrO1xuICAgICAgYXdhaXQgdXBsb2FkQmF0Y2goYmF0Y2hJbmRleCk7XG4gICAgfVxuICB9KTtcbiAgYXdhaXQgUHJvbWlzZS5hbGwod29ya2Vycyk7XG4gIGlmIChiYXRjaGVzLmxlbmd0aCA+IDEpIHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBmZXRjaEpzb248S2JVcGxvYWRCYXRjaFJlc3VsdD4oYC9hcGkva2IvdXBsb2FkL2NvbXBsZXRlYCwge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgcHJvamVjdFJvb3QsIHVwbG9hZElkIH0pLFxuICAgIH0pO1xuICAgIHJlc3VsdHMucHVzaChyZXN1bHQpO1xuICB9XG4gIHJldHVybiByZXN1bHRzLmZpbHRlcihCb29sZWFuKS5hdCgtMSkgPz8geyBzdWNjZXNzOiB0cnVlIH07XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRLYlVwbG9hZFByb2dyZXNzKHVwbG9hZElkOiBzdHJpbmcpIHtcbiAgcmV0dXJuIGZldGNoSnNvbjxLYlVwbG9hZFByb2dyZXNzPihgL2FwaS9rYi91cGxvYWQvcHJvZ3Jlc3M/aWQ9JHtlbmNvZGVVUklDb21wb25lbnQodXBsb2FkSWQpfWApO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0S2JPcGVyYXRpb25zKHByb2plY3RSb290Pzogc3RyaW5nKSB7XG4gIGNvbnN0IHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoeyBsaW1pdDogJzUwJyB9KTtcbiAgaWYgKHByb2plY3RSb290KSBwYXJhbXMuc2V0KCdwcm9qZWN0Um9vdCcsIHByb2plY3RSb290KTtcbiAgcmV0dXJuIGZldGNoSnNvbjx7IG9wZXJhdGlvbnM6IEtiT3BlcmF0aW9uUmVjb3JkW10gfT4oYC9hcGkva2Ivb3BlcmF0aW9ucz8ke3BhcmFtc31gKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEpvYnMob3B0cz86IHsgcHJvamVjdFJvb3Q/OiBzdHJpbmc7IGFjdGl2ZT86IGJvb2xlYW47IGxpbWl0PzogbnVtYmVyIH0pIHtcbiAgY29uc3QgcGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh7IGxpbWl0OiBTdHJpbmcob3B0cz8ubGltaXQgPz8gNTApIH0pO1xuICBpZiAob3B0cz8ucHJvamVjdFJvb3QpIHBhcmFtcy5zZXQoJ3Byb2plY3RSb290Jywgb3B0cy5wcm9qZWN0Um9vdCk7XG4gIGlmIChvcHRzPy5hY3RpdmUpIHBhcmFtcy5zZXQoJ2FjdGl2ZScsICcxJyk7XG4gIHJldHVybiBmZXRjaEpzb248eyBqb2JzOiBLYk9wZXJhdGlvblJlY29yZFtdIH0+KGAvYXBpL2pvYnM/JHtwYXJhbXN9YCk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRKb2IoaWQ6IHN0cmluZywgcHJvamVjdFJvb3Q/OiBzdHJpbmcpIHtcbiAgY29uc3QgcGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcygpO1xuICBpZiAocHJvamVjdFJvb3QpIHBhcmFtcy5zZXQoJ3Byb2plY3RSb290JywgcHJvamVjdFJvb3QpO1xuICByZXR1cm4gZmV0Y2hKc29uPHsgam9iOiBLYk9wZXJhdGlvblJlY29yZCB9PihgL2FwaS9qb2JzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KGlkKX0/JHtwYXJhbXN9YCk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjbGVhcktiT3BlcmF0aW9ucyhwcm9qZWN0Um9vdD86IHN0cmluZykge1xuICBjb25zdCBwYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKCk7XG4gIGlmIChwcm9qZWN0Um9vdCkgcGFyYW1zLnNldCgncHJvamVjdFJvb3QnLCBwcm9qZWN0Um9vdCk7XG4gIHJldHVybiBmZXRjaEpzb248eyBzdWNjZXNzOiBib29sZWFuOyBkZWxldGVkOiBudW1iZXIgfT4oYC9hcGkva2Ivb3BlcmF0aW9ucz8ke3BhcmFtc31gLCB7IG1ldGhvZDogJ0RFTEVURScgfSk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZWxldGVLYk9wZXJhdGlvbihpZDogc3RyaW5nLCBwcm9qZWN0Um9vdD86IHN0cmluZykge1xuICBjb25zdCBwYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHsgaWQgfSk7XG4gIGlmIChwcm9qZWN0Um9vdCkgcGFyYW1zLnNldCgncHJvamVjdFJvb3QnLCBwcm9qZWN0Um9vdCk7XG4gIHJldHVybiBmZXRjaEpzb248eyBzdWNjZXNzOiBib29sZWFuOyBkZWxldGVkOiBudW1iZXIgfT4oYC9hcGkva2Ivb3BlcmF0aW9ucz8ke3BhcmFtc31gLCB7IG1ldGhvZDogJ0RFTEVURScgfSk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZWxldGVLYkZpbGUocmVsYXRpdmVQYXRoOiBzdHJpbmcsIHByb2plY3RSb290Pzogc3RyaW5nKSB7XG4gIHJldHVybiBmZXRjaEpzb248eyBzdWNjZXNzOiBib29sZWFuOyBkZWxldGVkPzogbnVtYmVyIH0+KCcvYXBpL2tiL2ZpbGVzJywge1xuICAgIG1ldGhvZDogJ0RFTEVURScsIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgcmVsYXRpdmVQYXRoLCBwcm9qZWN0Um9vdCB9KSxcbiAgfSk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZWxldGVLYkZpbGVzKHJlbGF0aXZlUGF0aHM6IHN0cmluZ1tdLCBwcm9qZWN0Um9vdD86IHN0cmluZykge1xuICByZXR1cm4gZmV0Y2hKc29uPHsgc3VjY2VzczogYm9vbGVhbjsgZGVsZXRlZD86IG51bWJlciB9PignL2FwaS9rYi9maWxlcycsIHtcbiAgICBtZXRob2Q6ICdERUxFVEUnLCBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IHJlbGF0aXZlUGF0aHMsIHByb2plY3RSb290IH0pLFxuICB9KTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRlbGV0ZUtiRm9sZGVycyhmb2xkZXJQYXRoczogc3RyaW5nW10sIHByb2plY3RSb290Pzogc3RyaW5nKSB7XG4gIHJldHVybiBmZXRjaEpzb248eyBzdWNjZXNzOiBib29sZWFuOyBkZWxldGVkPzogbnVtYmVyIH0+KCcvYXBpL2tiL2ZpbGVzJywge1xuICAgIG1ldGhvZDogJ0RFTEVURScsIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgZm9sZGVyUGF0aHMsIHByb2plY3RSb290IH0pLFxuICB9KTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRlbGV0ZUtiU2VsZWN0aW9uKHJlbGF0aXZlUGF0aHM6IHN0cmluZ1tdLCBmb2xkZXJQYXRoczogc3RyaW5nW10sIHByb2plY3RSb290Pzogc3RyaW5nKSB7XG4gIHJldHVybiBmZXRjaEpzb248eyBzdWNjZXNzOiBib29sZWFuOyBkZWxldGVkPzogbnVtYmVyIH0+KCcvYXBpL2tiL2ZpbGVzJywge1xuICAgIG1ldGhvZDogJ0RFTEVURScsIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgcmVsYXRpdmVQYXRocywgZm9sZGVyUGF0aHMsIHByb2plY3RSb290IH0pLFxuICB9KTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRlbGV0ZUFsbEtiRmlsZXMocHJvamVjdFJvb3Q/OiBzdHJpbmcpIHtcbiAgcmV0dXJuIGZldGNoSnNvbjx7IHN1Y2Nlc3M6IGJvb2xlYW47IGRlbGV0ZWQ/OiBudW1iZXIgfT4oJy9hcGkva2IvZmlsZXMnLCB7XG4gICAgbWV0aG9kOiAnREVMRVRFJywgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBhbGw6IHRydWUsIHByb2plY3RSb290IH0pLFxuICB9KTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlaW5kZXhLYihwcm9qZWN0Um9vdD86IHN0cmluZykge1xuICByZXR1cm4gZmV0Y2hKc29uPHsgc3VjY2VzczogYm9vbGVhbjsgYWNjZXB0ZWQ/OiBib29sZWFuOyBhbHJlYWR5UnVubmluZz86IGJvb2xlYW47IG9wZXJhdGlvbklkPzogc3RyaW5nOyBqb2I/OiBLYk9wZXJhdGlvblJlY29yZDsgc3RhdHM/OiBLYlN0YXRzIH0+KCcvYXBpL2tiL3JlaW5kZXgnLCB7XG4gICAgbWV0aG9kOiAnUE9TVCcsIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgcHJvamVjdFJvb3QgfSksXG4gIH0pO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0UmVpbmRleFN0YXR1cyhwcm9qZWN0Um9vdD86IHN0cmluZykge1xuICBjb25zdCBwYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKCk7XG4gIGlmIChwcm9qZWN0Um9vdCkgcGFyYW1zLnNldCgncHJvamVjdFJvb3QnLCBwcm9qZWN0Um9vdCk7XG4gIHJldHVybiBmZXRjaEpzb248eyBydW5uaW5nOiBib29sZWFuOyBhY3RpdmU/OiB7IG9wZXJhdGlvbklkOiBzdHJpbmc7IHN0YXJ0ZWRBdDogbnVtYmVyIH07IGpvYjogS2JPcGVyYXRpb25SZWNvcmQgfCBudWxsIH0+KGAvYXBpL2tiL3JlaW5kZXg/JHtwYXJhbXN9YCk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRLYlRhZ3MocHJvamVjdFJvb3Q/OiBzdHJpbmcpIHtcbiAgY29uc3QgcCA9IHByb2plY3RSb290ID8gYD9wcm9qZWN0Um9vdD0ke2VuY29kZVVSSUNvbXBvbmVudChwcm9qZWN0Um9vdCl9YCA6ICcnO1xuICByZXR1cm4gZmV0Y2hKc29uPHN0cmluZ1tdPihgL2FwaS9rYi90YWdzJHtwfWApO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0S2JJZ25vcmVSdWxlcyhwcm9qZWN0Um9vdD86IHN0cmluZykge1xuICBjb25zdCBwID0gcHJvamVjdFJvb3QgPyBgP3Byb2plY3RSb290PSR7ZW5jb2RlVVJJQ29tcG9uZW50KHByb2plY3RSb290KX1gIDogJyc7XG4gIHJldHVybiBmZXRjaEpzb248c3RyaW5nW10+KGAvYXBpL2tiL2lnbm9yZSR7cH1gKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNhdmVLYklnbm9yZVJ1bGVzKHJ1bGVzOiBzdHJpbmdbXSwgcHJvamVjdFJvb3Q/OiBzdHJpbmcpIHtcbiAgcmV0dXJuIGZldGNoSnNvbjx7IHN1Y2Nlc3M6IGJvb2xlYW4gfT4oJy9hcGkva2IvaWdub3JlJywge1xuICAgIG1ldGhvZDogJ1BPU1QnLCBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IHJ1bGVzLCBwcm9qZWN0Um9vdCB9KSxcbiAgfSk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRLYkR1cGxpY2F0ZXMocHJvamVjdFJvb3Q/OiBzdHJpbmcpIHtcbiAgY29uc3QgcCA9IHByb2plY3RSb290ID8gYD9wcm9qZWN0Um9vdD0ke2VuY29kZVVSSUNvbXBvbmVudChwcm9qZWN0Um9vdCl9YCA6ICcnO1xuICByZXR1cm4gZmV0Y2hKc29uKGAvYXBpL2tiL2R1cGxpY2F0ZXMke3B9YCk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRLYkZlYXR1cmVzKCkge1xuICByZXR1cm4gZmV0Y2hKc29uPEtiRmVhdHVyZXM+KCcvYXBpL2tiL2ZlYXR1cmVzJyk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgS2JTZWFyY2hSZXN1bHQge1xuICBpZDogc3RyaW5nO1xuICBjb250ZW50OiBzdHJpbmc7XG4gIGZpbGVQYXRoOiBzdHJpbmc7XG4gIHNjb3BlOiAncHJvamVjdCcgfCAnZ2xvYmFsJztcbiAgY29sbGVjdGlvbjogc3RyaW5nO1xuICBzY29yZTogbnVtYmVyO1xuICBjaHVua0luZGV4PzogbnVtYmVyO1xuICBwYXJlbnRJZD86IHN0cmluZztcbiAgc291cmNlPzogJ2tleXdvcmQnIHwgJ3ZlY3RvcicgfCAnaHlicmlkJztcbiAgc2VjdGlvblRpdGxlPzogc3RyaW5nO1xuICByb3dSYW5nZT86IHN0cmluZztcbiAgY2h1bmtLaW5kPzogc3RyaW5nO1xuICBzY29yZURldGFpbHM/OiB7IGtleXdvcmRTY29yZT86IG51bWJlcjsgYm0yNVNjb3JlPzogbnVtYmVyOyB2ZWN0b3JTY29yZT86IG51bWJlcjsgaHlicmlkU2NvcmU/OiBudW1iZXI7IGV4YWN0UGhyYXNlQm9vc3Q/OiBudW1iZXI7IHJlcmFua0Jvb3N0PzogbnVtYmVyIH07XG4gIGZhY2V0cz86IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bWJlciB8IHN0cmluZ1tdPjtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNlYXJjaEtiKHF1ZXJ5OiBzdHJpbmcsIG9wdHM/OiB7IHByb2plY3RSb290Pzogc3RyaW5nOyBjYXRlZ29yeT86IHN0cmluZzsgbGltaXQ/OiBudW1iZXI7IHdlaWdodHM/OiB7IGtleXdvcmQ/OiBudW1iZXI7IHZlY3Rvcj86IG51bWJlcjsgcmV3cml0ZT86IG51bWJlcjsgaHlicmlkQm9udXM/OiBudW1iZXIgfSB9KSB7XG4gIGNvbnN0IHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoeyBxOiBxdWVyeSB9KTtcbiAgaWYgKG9wdHM/LnByb2plY3RSb290KSBwYXJhbXMuc2V0KCdwcm9qZWN0Um9vdCcsIG9wdHMucHJvamVjdFJvb3QpO1xuICBpZiAob3B0cz8uY2F0ZWdvcnkpIHBhcmFtcy5zZXQoJ2NhdGVnb3J5Jywgb3B0cy5jYXRlZ29yeSk7XG4gIGlmIChvcHRzPy5saW1pdCkgcGFyYW1zLnNldCgnbGltaXQnLCBTdHJpbmcob3B0cy5saW1pdCA/PyAyMCkpO1xuICBpZiAob3B0cz8ud2VpZ2h0cz8ua2V5d29yZCAhPSBudWxsKSBwYXJhbXMuc2V0KCdrZXl3b3JkV2VpZ2h0JywgU3RyaW5nKG9wdHMud2VpZ2h0cy5rZXl3b3JkKSk7XG4gIGlmIChvcHRzPy53ZWlnaHRzPy52ZWN0b3IgIT0gbnVsbCkgcGFyYW1zLnNldCgndmVjdG9yV2VpZ2h0JywgU3RyaW5nKG9wdHMud2VpZ2h0cy52ZWN0b3IpKTtcbiAgaWYgKG9wdHM/LndlaWdodHM/LnJld3JpdGUgIT0gbnVsbCkgcGFyYW1zLnNldCgncmV3cml0ZVdlaWdodCcsIFN0cmluZyhvcHRzLndlaWdodHMucmV3cml0ZSkpO1xuICBpZiAob3B0cz8ud2VpZ2h0cz8uaHlicmlkQm9udXMgIT0gbnVsbCkgcGFyYW1zLnNldCgnaHlicmlkQm9udXMnLCBTdHJpbmcob3B0cy53ZWlnaHRzLmh5YnJpZEJvbnVzKSk7XG4gIHJldHVybiBmZXRjaEpzb248eyByZXN1bHRzOiBLYlNlYXJjaFJlc3VsdFtdOyB0b3RhbDogbnVtYmVyOyBxdWVyeVRpbWVNcz86IG51bWJlcjsgZGVidWc/OiB7IG9yaWdpbmFsUXVlcnk/OiBzdHJpbmc7IHJld3JpdHRlblF1ZXJpZXM/OiBzdHJpbmdbXTsgd2VpZ2h0cz86IFJlY29yZDxzdHJpbmcsIG51bWJlcj47IHJlY2FsbENvdW50cz86IFJlY29yZDxzdHJpbmcsIG51bWJlcj47IHJlcmFua2VyPzogc3RyaW5nIH0gfT4oYC9hcGkva2Ivc2VhcmNoPyR7cGFyYW1zfWApO1xufVxuXG4vLyDilZDilZDilZDilZDilZDilZDilZAg5paH5qGj5bel5L2c5Y+wIOKVkOKVkOKVkOKVkOKVkOKVkOKVkFxuXG5leHBvcnQgaW50ZXJmYWNlIERvY3VtZW50VGVtcGxhdGVDaGFwdGVyIHsgaWQ6IHN0cmluZzsgdGl0bGU6IHN0cmluZzsgcHVycG9zZTogc3RyaW5nOyBxdWVyaWVzOiBzdHJpbmdbXTsgcmVxdWlyZWRGYWN0czogc3RyaW5nW107IHNlY3Rpb25zPzogc3RyaW5nW107IHRhYmxlU2VjdGlvbnM/OiBzdHJpbmdbXTsgdGFibGVSZXF1aXJlbWVudHM/OiBzdHJpbmdbXTsgcGlubmVkRXZpZGVuY2VGaWxlUGF0aHM/OiBzdHJpbmdbXTsgfVxuZXhwb3J0IGludGVyZmFjZSBQcm9tcHRCaW5kaW5nIHsgcHJvbXB0SWQ6IHN0cmluZzsgcm9sZUlkOiBzdHJpbmc7IH1cbmV4cG9ydCBpbnRlcmZhY2UgRmlsZUJpbmRpbmcgeyBmaWxlUGF0aDogc3RyaW5nOyByb2xlSWQ6IHN0cmluZzsgfVxuZXhwb3J0IHR5cGUgUHJvbXB0RXhlY3V0aW9uVHlwZSA9ICdmYWN0X2V4dHJhY3Rpb24nIHwgJ2NoYXB0ZXJfZ2VuZXJhdGlvbicgfCAnbGxtX3JldmlldycgfCAndmFsaWRhdGlvbicgfCAnZm9ybWF0dGluZycgfCAncmVmZXJlbmNlJztcbmV4cG9ydCB0eXBlIEZpbGVQcm9jZXNzaW5nVHlwZSA9ICdydWxlJyB8ICd0YWJsZScgfCAnZHJhd2luZycgfCAnc3BlY2lmaWNhdGlvbicgfCAncmVmZXJlbmNlJztcbmV4cG9ydCBpbnRlcmZhY2UgRG9jdW1lbnRSb2xlIHsgaWQ6IHN0cmluZzsgbmFtZTogc3RyaW5nOyBkZXNjcmlwdGlvbjogc3RyaW5nOyB0eXBlOiAnZmlsZScgfCAncHJvbXB0JzsgcmVzb3VyY2VJZD86IHN0cmluZzsgcmVzb3VyY2VJZHM/OiBzdHJpbmdbXTsgYnVpbHRJbj86IGJvb2xlYW47IGV4ZWN1dGlvblR5cGU/OiBQcm9tcHRFeGVjdXRpb25UeXBlOyBwcm9jZXNzaW5nVHlwZT86IEZpbGVQcm9jZXNzaW5nVHlwZTsgfVxuZXhwb3J0IGludGVyZmFjZSBQcm9qZWN0Um9sZUl0ZW0geyByb2xlSWQ6IHN0cmluZzsgb3JkZXI6IG51bWJlcjsgfVxuZXhwb3J0IGludGVyZmFjZSBQcm9qZWN0Um9sZUNvbmZpZyB7IGlkOiBzdHJpbmc7IG5hbWU6IHN0cmluZzsgZGVzY3JpcHRpb246IHN0cmluZzsgZmlsZVJvbGVzOiBQcm9qZWN0Um9sZUl0ZW1bXTsgcHJvbXB0Um9sZXM6IFByb2plY3RSb2xlSXRlbVtdOyBidWlsdEluPzogYm9vbGVhbjsgfVxuZXhwb3J0IGludGVyZmFjZSBEb2N1bWVudEV4cG9ydFNldHRpbmdzIHsgcGFnZT86IHsgcGFwZXI/OiBzdHJpbmc7IG1hcmdpblRvcD86IHN0cmluZzsgbWFyZ2luUmlnaHQ/OiBzdHJpbmc7IG1hcmdpbkJvdHRvbT86IHN0cmluZzsgbWFyZ2luTGVmdD86IHN0cmluZyB9OyB0eXBvZ3JhcGh5PzogeyBmb250RmFtaWx5Pzogc3RyaW5nOyBsaW5lSGVpZ2h0Pzogc3RyaW5nOyB0aXRsZVNpemU/OiBzdHJpbmc7IGJvZHlTaXplPzogc3RyaW5nIH07IHRhcmdldFBhZ2VzPzogeyBtaW4/OiBudW1iZXI7IHRhcmdldD86IG51bWJlcjsgbWF4PzogbnVtYmVyIH07IH1cbmV4cG9ydCBpbnRlcmZhY2UgRG9jdW1lbnRHZW5lcmF0aW9uU2V0dGluZ3MgeyB0YXJnZXRQYWdlcz86IHsgbWluPzogbnVtYmVyOyB0YXJnZXQ/OiBudW1iZXI7IG1heD86IG51bWJlciB9OyB9XG5leHBvcnQgaW50ZXJmYWNlIERvY3VtZW50VGVtcGxhdGUgeyBpZDogc3RyaW5nOyBuYW1lOiBzdHJpbmc7IGRlc2NyaXB0aW9uOiBzdHJpbmc7IGNhdGVnb3J5OiBzdHJpbmc7IG91dHB1dFRpdGxlOiBzdHJpbmc7IGNoYXB0ZXJzOiBEb2N1bWVudFRlbXBsYXRlQ2hhcHRlcltdOyBleHBvcnRTZXR0aW5ncz86IERvY3VtZW50RXhwb3J0U2V0dGluZ3M7IGdlbmVyYXRpb25TZXR0aW5ncz86IERvY3VtZW50R2VuZXJhdGlvblNldHRpbmdzOyBwcm9qZWN0Um9sZUNvbmZpZ0lkPzogc3RyaW5nOyBwcm9tcHRJZHM/OiBzdHJpbmdbXTsgYm91bmRGaWxlUGF0aHM/OiBzdHJpbmdbXTsgcHJvbXB0QmluZGluZ3M/OiBQcm9tcHRCaW5kaW5nW107IGZpbGVCaW5kaW5ncz86IEZpbGVCaW5kaW5nW107IGJ1aWx0SW4/OiBib29sZWFuOyB9XG5leHBvcnQgaW50ZXJmYWNlIENoYXB0ZXJSZWFkaW5lc3NEaWFnbm9zdGljIHsgY2hhcHRlcklkOiBzdHJpbmc7IHRpdGxlOiBzdHJpbmc7IHJlcXVpcmVkRmFjdHM6IHN0cmluZ1tdOyBjb3ZlcmVkRmFjdHM6IHN0cmluZ1tdOyBtaXNzaW5nRmFjdHM6IHN0cmluZ1tdOyByZXF1aXJlZFJvbGVzOiBzdHJpbmdbXTsgc2F0aXNmaWVkUm9sZXM6IHN0cmluZ1tdOyBldmlkZW5jZUNvdW50OiBudW1iZXI7IHJlYWRpbmVzc1JhdGU6IG51bWJlcjsgfVxuZXhwb3J0IGludGVyZmFjZSBEb2N1bWVudEdlbmVyYXRpb25SZWFkaW5lc3MgeyByZWFkeTogYm9vbGVhbjsgbWF0ZXJpYWxDb3ZlcmFnZVJhdGU6IG51bWJlcjsgcm9sZVNhdGlzZmFjdGlvblJhdGU6IG51bWJlcjsgc3BlY0NvbXBsZXRlbmVzc1JhdGU6IG51bWJlcjsgbWlzc2luZ1JvbGVzOiBzdHJpbmdbXTsgd2Vha1JvbGVzOiBzdHJpbmdbXTsgZGlhZ25vc3RpY3M6IHN0cmluZ1tdOyBjaGFwdGVyRGlhZ25vc3RpY3M6IENoYXB0ZXJSZWFkaW5lc3NEaWFnbm9zdGljW107IGJsb2NraW5nSXNzdWVzOiBzdHJpbmdbXTsgd2FybmluZ3M6IHN0cmluZ1tdOyB9XG5leHBvcnQgaW50ZXJmYWNlIERvY3VtZW50VGVtcGxhdGVWYWxpZGF0aW9uIHsgdGVtcGxhdGVJZDogc3RyaW5nOyBwcm9qZWN0Um9sZUNvbmZpZ0lkPzogc3RyaW5nOyBmaWxlRGlhZ25vc3RpY3M6IEFycmF5PEZpbGVCaW5kaW5nICYgeyByb2xlTmFtZT86IHN0cmluZzsgZXhpc3RzOiBib29sZWFuOyBpbmRleGVkOiBib29sZWFuOyBjaHVua0NvdW50OiBudW1iZXI7IHZlY3RvclJlYWR5OiBib29sZWFuIH0+OyBwcm9tcHREaWFnbm9zdGljczogQXJyYXk8UHJvbXB0QmluZGluZyAmIHsgcm9sZU5hbWU/OiBzdHJpbmc7IHByb21wdFRpdGxlPzogc3RyaW5nOyBwcm9tcHRTb3VyY2U/OiAnY3VzdG9tJyB8ICdmaWxlJzsgY29udGVudEhhc2g/OiBzdHJpbmc7IGNvbnRlbnRQcmV2aWV3Pzogc3RyaW5nOyBleGlzdHM6IGJvb2xlYW47IGNvbnRlbnRMZW5ndGg6IG51bWJlciB9PjsgcmVhZGluZXNzPzogRG9jdW1lbnRHZW5lcmF0aW9uUmVhZGluZXNzOyBpc3N1ZXM6IEFycmF5PHsgbGV2ZWw6ICdlcnJvcicgfCAnd2FybmluZyc7IG1lc3NhZ2U6IHN0cmluZyB9PiB9XG5leHBvcnQgaW50ZXJmYWNlIFByb21wdFByb2plY3QgeyBpZDogc3RyaW5nOyBwcm9qZWN0SWQ6IHN0cmluZzsgcHJvamVjdFJvb3Q/OiBzdHJpbmc7IHByb2plY3ROYW1lOiBzdHJpbmc7IGN1c3RvbWl6ZVBhdGg6IHN0cmluZzsgY29udGVudDogc3RyaW5nOyBtdGltZTogc3RyaW5nOyBoYXNGaWxlOiBib29sZWFuOyBpc0N1cnJlbnQ6IGJvb2xlYW47IHNlbGVjdGVkOiBib29sZWFuOyBzb3VyY2U6ICdjdXJyZW50JyB8ICdwcm9qZWN0JyB8ICdjdXN0b20nOyB9XG5leHBvcnQgaW50ZXJmYWNlIERvY3VtZW50RXZpZGVuY2UgeyBjaGFwdGVySWQ6IHN0cmluZzsgZmlsZVBhdGg6IHN0cmluZzsgc2NvcmU6IG51bWJlcjsgY29udGVudDogc3RyaW5nOyByb2xlSWQ/OiBzdHJpbmc7IHByb2Nlc3NpbmdUeXBlPzogc3RyaW5nOyBzZWN0aW9uVGl0bGU/OiBzdHJpbmc7IHNvdXJjZT86IHN0cmluZzsgfVxuZXhwb3J0IGludGVyZmFjZSBEb2N1bWVudERyYWZ0Q2hhcHRlciB7IGlkOiBzdHJpbmc7IHRpdGxlOiBzdHJpbmc7IGNvbnRlbnQ6IHN0cmluZzsgZXZpZGVuY2U6IERvY3VtZW50RXZpZGVuY2VbXTsgbWlzc2luZ0ZhY3RzOiBzdHJpbmdbXTsgc2VjdGlvbnM/OiBzdHJpbmdbXTsgfVxuZXhwb3J0IGludGVyZmFjZSBGYWN0U291cmNlUmVmIHsgZmlsZVBhdGg6IHN0cmluZzsgcm9sZUlkOiBzdHJpbmc7IHByb2Nlc3NpbmdUeXBlPzogc3RyaW5nOyBzZWN0aW9uVGl0bGU/OiBzdHJpbmc7IGNodW5rSW5kZXg/OiBudW1iZXI7IGNlbGxSYW5nZT86IHN0cmluZzsgfVxuZXhwb3J0IGludGVyZmFjZSBEb2N1bWVudEZhY3QgeyBrZXk6IHN0cmluZzsgdmFsdWU6IHN0cmluZzsgc291cmNlRmlsZTogc3RyaW5nOyByb2xlSWQ6IHN0cmluZzsgcHJvY2Vzc2luZ1R5cGU/OiBzdHJpbmc7IGNvbmZpZGVuY2U6IG51bWJlcjsgZmllbGRJZD86IHN0cmluZzsgZmllbGROYW1lPzogc3RyaW5nOyBzb3VyY2VSZWY/OiBGYWN0U291cmNlUmVmOyB9XG5leHBvcnQgaW50ZXJmYWNlIFN0cnVjdHVyZWRUYWJsZUZhY3QgeyB0YWJsZVR5cGU6IHN0cmluZzsgc2hlZXQ/OiBzdHJpbmc7IGhlYWRlcnM6IHN0cmluZ1tdOyByb3dzOiBzdHJpbmdbXVtdOyBzb3VyY2VGaWxlOiBzdHJpbmc7IHNvdXJjZVJhbmdlPzogc3RyaW5nOyB9XG5leHBvcnQgaW50ZXJmYWNlIERvY3VtZW50RmFjdHNNb2RlbCB7IHByb2plY3Q6IERvY3VtZW50RmFjdFtdOyBzY2hlZHVsZTogRG9jdW1lbnRGYWN0W107IHF1YWxpdHk6IERvY3VtZW50RmFjdFtdOyBzYWZldHk6IERvY3VtZW50RmFjdFtdOyByZXNvdXJjZXM6IERvY3VtZW50RmFjdFtdOyB0YWJsZXM6IFN0cnVjdHVyZWRUYWJsZUZhY3RbXTsgZHJhd2luZ3M6IERvY3VtZW50RmFjdFtdOyBydWxlczogRG9jdW1lbnRGYWN0W107IHNwZWNpZmljYXRpb25zOiBEb2N1bWVudEZhY3RbXTsgc2NoZW1hRmFjdHM6IFJlY29yZDxzdHJpbmcsIERvY3VtZW50RmFjdFtdPjsgbWlzc2luZzogc3RyaW5nW107IGNvbmZsaWN0czogc3RyaW5nW107IH1cbmV4cG9ydCBpbnRlcmZhY2UgVmFsaWRhdGlvbklzc3VlIHsgbGV2ZWw6ICdlcnJvcicgfCAnd2FybmluZycgfCAnaW5mbyc7IG1lc3NhZ2U6IHN0cmluZzsgc291cmNlPzogc3RyaW5nOyBzdWdnZXN0aW9uPzogc3RyaW5nOyB9XG5leHBvcnQgaW50ZXJmYWNlIEV4cG9ydEdhdGVSZXN1bHQgeyBwYXNzZWQ6IGJvb2xlYW47IGJsb2NraW5nSXNzdWVzOiBWYWxpZGF0aW9uSXNzdWVbXTsgY2hlY2tsaXN0OiBBcnJheTx7IGtleTogc3RyaW5nOyBsYWJlbDogc3RyaW5nOyBwYXNzZWQ6IGJvb2xlYW47IG1lc3NhZ2U/OiBzdHJpbmcgfT47IH1cbmV4cG9ydCBpbnRlcmZhY2UgRG9jdW1lbnRFeGVjdXRpb25TdGFnZSB7IHR5cGU6ICdyb2xlX2JpbmRpbmcnIHwgJ2tub3dsZWRnZV9yZXRyaWV2YWwnIHwgJ2ZpbGVfdW5kZXJzdGFuZGluZycgfCAnZmFjdF9leHRyYWN0aW9uJyB8ICdjaGFwdGVyX2dlbmVyYXRpb24nIHwgJ2Fzc2V0X2dlbmVyYXRpb24nIHwgJ2xsbV9yZXZpZXcnIHwgJ3ZhbGlkYXRpb24nIHwgJ2Zvcm1hdHRpbmcnIHwgJ2V4cG9ydF9yZWFkeScgfCAncmVmZXJlbmNlJzsgcm9sZUlkOiBzdHJpbmc7IHByb21wdElkPzogc3RyaW5nOyBzdGF0dXM6ICdydW5uaW5nJyB8ICdzdWNjZXNzJyB8ICdmYWxsYmFjaycgfCAnc2tpcHBlZCcgfCAnZmFpbGVkJzsgbWVzc2FnZT86IHN0cmluZzsgZGV0YWlscz86IHN0cmluZ1tdOyBwcm9ncmVzcz86IHsgY3VycmVudDogbnVtYmVyOyB0b3RhbDogbnVtYmVyOyBsYWJlbD86IHN0cmluZyB9OyB0aXRsZT86IHN0cmluZzsgc3VidGl0bGU/OiBzdHJpbmc7IHJvbGVOYW1lPzogc3RyaW5nOyBwcm9tcHROYW1lPzogc3RyaW5nOyBncm91cD86IHN0cmluZzsgb3JkZXI/OiBudW1iZXI7IGV4ZWN1dGlvblZlcnNpb24/OiAyOyB9XG5leHBvcnQgaW50ZXJmYWNlIERvY3VtZW50QXNzZXQgeyBpZDogc3RyaW5nOyB0eXBlOiAnaW1hZ2UnIHwgJ2F1ZGlvJyB8ICd2aWRlbycgfCAnZmlsZSc7IHJvbGU6ICdjb3ZlcicgfCAncmVmZXJlbmNlJyB8ICdnZW5lcmF0ZWQnIHwgJ2F0dGFjaG1lbnQnIHwgJ21hcCcgfCAnb3BlcmF0b3InOyBwYXRoPzogc3RyaW5nOyB1cmw/OiBzdHJpbmc7IHByb21wdD86IHN0cmluZzsgbW9kZWxQcm92aWRlcj86IHN0cmluZzsgc3RhdHVzOiAnZ2VuZXJhdGVkJyB8ICdwcm9tcHRfcmVhZHknIHwgJ2ZhbGxiYWNrJzsgbWVzc2FnZT86IHN0cmluZzsgfVxuZXhwb3J0IGludGVyZmFjZSBHZW5lcmF0ZWRBc3NldFJlY29yZCBleHRlbmRzIERvY3VtZW50QXNzZXQgeyBuYW1lOiBzdHJpbmc7IHNvdXJjZTogJ2tub3dsZWRnZV9iYXNlJyB8ICdnZW5lcmF0ZWQnIHwgJ3VwbG9hZGVkJyB8ICdleHRlcm5hbF91cmwnOyBpbmRleGVkOiBib29sZWFuOyB1c2VkQnlEb2N1bWVudElkczogc3RyaW5nW107IGNyZWF0ZWRBdDogbnVtYmVyOyB1cGRhdGVkQXQ6IG51bWJlcjsgfVxuZXhwb3J0IGludGVyZmFjZSBHZW5lcmF0ZWREb2N1bWVudFJlY29yZCB7IGlkOiBzdHJpbmc7IHRhc2tJZD86IHN0cmluZzsgdGVtcGxhdGVJZDogc3RyaW5nOyB0ZW1wbGF0ZU5hbWU/OiBzdHJpbmc7IHRpdGxlOiBzdHJpbmc7IHJlcXVpcmVtZW50OiBzdHJpbmc7IHByb2plY3RSb290Pzogc3RyaW5nOyBwcm9qZWN0SWQ/OiBzdHJpbmc7IGtub3dsZWRnZUJhc2VQYXRoPzogc3RyaW5nOyBtYXJrZG93bjogc3RyaW5nOyBlZGl0ZWRNYXJrZG93bj86IHN0cmluZzsgc3RhdHVzOiAnZ2VuZXJhdGluZycgfCAnY29tcGxldGVkJyB8ICd3YXJuaW5nJyB8ICdmYWlsZWQnIHwgJ2Fib3J0ZWQnOyBkcmFmdD86IEdlbmVyYXRlZERvY3VtZW50RHJhZnQ7IGV4ZWN1dGlvblN0YWdlcz86IEdlbmVyYXRlZERvY3VtZW50RHJhZnRbJ2V4ZWN1dGlvblN0YWdlcyddOyBwYXJ0aWFsQ2hhcHRlcnM/OiBHZW5lcmF0ZWREb2N1bWVudERyYWZ0WydwYXJ0aWFsQ2hhcHRlcnMnXTsgY2hlY2twb2ludENoYXB0ZXJzPzogRG9jdW1lbnREcmFmdENoYXB0ZXJbXTsgcmV2aWV3TWV0YWRhdGE/OiBHZW5lcmF0ZWREb2N1bWVudERyYWZ0WydyZXZpZXdNZXRhZGF0YSddOyBhc3NldHM6IERvY3VtZW50QXNzZXRbXTsgY3JlYXRlZEF0OiBudW1iZXI7IHVwZGF0ZWRBdDogbnVtYmVyOyBjb21wbGV0ZWRBdD86IG51bWJlcjsgZXJyb3I/OiBzdHJpbmc7IHdhcm5pbmdJc3N1ZXM/OiBzdHJpbmdbXTsgbWF4RXZpZGVuY2VQZXJDaGFwdGVyPzogbnVtYmVyOyB9XG5leHBvcnQgaW50ZXJmYWNlIERvY3VtZW50UmV2aWV3TWV0YWRhdGEgeyBjaGFwdGVyU3VtbWFyaWVzOiBBcnJheTx7IGNoYXB0ZXJJZDogc3RyaW5nOyB0aXRsZTogc3RyaW5nOyBzdGF0dXM6ICdwYXNzJyB8ICd3YXJuJyB8ICdmYWlsJzsgaXNzdWVzOiBzdHJpbmdbXTsgc3VnZ2VzdGlvbnM6IHN0cmluZ1tdOyBjaGFyczogbnVtYmVyIH0+OyBnbG9iYWxJc3N1ZXM6IHN0cmluZ1tdOyBkaWFnbm9zdGljczogeyBzdHJhdGVneTogeyBtb2RlOiAnZmFzdCcgfCAnYmFsYW5jZWQnIHwgJ2xvbmdmb3JtJyB8ICdzdHJpY3QnOyBsYXJnZURvY3VtZW50TW9kZT86IGJvb2xlYW47IGVuYWJsZUNoYXB0ZXJSZXZpZXc6IGJvb2xlYW47IGVuYWJsZUdsb2JhbFJldmlldzogYm9vbGVhbjsgZW5hYmxlRG9jdW1lbnRCdWRnZXRFeHBhbnNpb24/OiBib29sZWFuOyBlbmFibGVGaW5hbFF1YWxpdHlSZXZpZXc/OiBib29sZWFuOyBtYXhDaGFwdGVyUmV2aWV3Q29uY3VycmVuY3k6IG51bWJlcjsgdGFyZ2V0TGxtQ29uY3VycmVuY3k6IG51bWJlciB9OyBtZXRyaWNzOiBBcnJheTx7IG5hbWU6IHN0cmluZzsgc3RhcnRlZEF0OiBudW1iZXI7IGVuZGVkQXQ6IG51bWJlcjsgZHVyYXRpb25NczogbnVtYmVyOyBtZXRhPzogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbj4gfT47IGxsbTogeyBjYWxsczogbnVtYmVyOyBmYWlsdXJlczogbnVtYmVyOyB0aHJvdHRsZWRXYWl0czogbnVtYmVyOyB0aHJvdHRsZWRXYWl0TXM/OiBudW1iZXI7IG1heEFjdGl2ZTogbnVtYmVyOyBjdXJyZW50TGltaXQ6IG51bWJlcjsgbGltaXRBZGp1c3RtZW50czogbnVtYmVyIH07IGV2aWRlbmNlPzogeyByYXc6IG51bWJlcjsgdXNlZDogbnVtYmVyOyBmaWx0ZXJlZE5vaXNlOiBudW1iZXI7IGF2Z05vaXNlU2NvcmU6IG51bWJlcjsgYXZnRmFjdERlbnNpdHk6IG51bWJlcjsgc2VhcmNoUXVlcmllcz86IG51bWJlcjsgc2VhcmNoTXM/OiBudW1iZXI7IGNvbnRleHRDaGFycz86IG51bWJlciB9OyBxdWFsaXR5PzogeyBibG9ja2luZ0NvdW50OiBudW1iZXI7IGltcG9ydGFudENvdW50OiBudW1iZXI7IG1pbm9yQ291bnQ6IG51bWJlcjsgcmVwYWlyZWRDb3VudDogbnVtYmVyIH0gfSB9XG5leHBvcnQgaW50ZXJmYWNlIEdlbmVyYXRlZERvY3VtZW50RHJhZnQgeyB0ZW1wbGF0ZUlkOiBzdHJpbmc7IHRlbXBsYXRlTmFtZTogc3RyaW5nOyB0aXRsZTogc3RyaW5nOyByZXF1aXJlbWVudDogc3RyaW5nOyBwcm9qZWN0Um9vdD86IHN0cmluZzsgcHJvamVjdElkPzogc3RyaW5nOyBtYXJrZG93bjogc3RyaW5nOyBleHBvcnRTZXR0aW5ncz86IERvY3VtZW50RXhwb3J0U2V0dGluZ3M7IGdlbmVyYXRpb25TZXR0aW5ncz86IERvY3VtZW50R2VuZXJhdGlvblNldHRpbmdzOyBmYWN0czogUmVjb3JkPHN0cmluZywgc3RyaW5nPjsgc3RydWN0dXJlZEZhY3RzOiBEb2N1bWVudEZhY3RbXTsgZmFjdHNNb2RlbDogRG9jdW1lbnRGYWN0c01vZGVsOyBjaGFwdGVyczogRG9jdW1lbnREcmFmdENoYXB0ZXJbXTsgc291cmNlczogQXJyYXk8eyBmaWxlUGF0aDogc3RyaW5nOyBjb3VudDogbnVtYmVyIH0+OyBtaXNzaW5nSXRlbXM6IHN0cmluZ1tdOyB2YWxpZGF0aW9uOiB7IHBhc3NlZDogYm9vbGVhbjsgd2FybmluZ3M6IHN0cmluZ1tdOyBlcnJvcnM6IHN0cmluZ1tdIH07IHZhbGlkYXRpb25Jc3N1ZXM6IFZhbGlkYXRpb25Jc3N1ZVtdOyBleGVjdXRpb25TdGFnZXM6IERvY3VtZW50RXhlY3V0aW9uU3RhZ2VbXTsgZXhwb3J0R2F0ZTogRXhwb3J0R2F0ZVJlc3VsdDsgYXNzZXRzPzogRG9jdW1lbnRBc3NldFtdOyBwYXJ0aWFsQ2hhcHRlcnM/OiBBcnJheTx7IGlkOiBzdHJpbmc7IHRpdGxlOiBzdHJpbmc7IGNoYXJzOiBudW1iZXI7IHN0YXR1czogJ2NvbXBsZXRlZCcgfCAnZmFpbGVkJzsgdXBkYXRlZEF0OiBudW1iZXIgfT47IHJldmlld01ldGFkYXRhPzogRG9jdW1lbnRSZXZpZXdNZXRhZGF0YTsgZ2VuZXJhdGVkQXQ6IG51bWJlcjsgfVxuZXhwb3J0IGludGVyZmFjZSBTdG9yZWREb2N1bWVudERyYWZ0IGV4dGVuZHMgR2VuZXJhdGVkRG9jdW1lbnREcmFmdCB7IGlkOiBzdHJpbmc7IHVwZGF0ZWRBdDogbnVtYmVyOyB9XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRQcm9tcHRQcm9qZWN0cygpIHsgcmV0dXJuIGZldGNoSnNvbjxQcm9tcHRQcm9qZWN0W10+KCcvYXBpL3Byb21wdCcpOyB9XG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0RG9jdW1lbnRSb2xlcyh0eXBlPzogJ2ZpbGUnIHwgJ3Byb21wdCcpIHsgcmV0dXJuIGZldGNoSnNvbjx7IHJvbGVzOiBEb2N1bWVudFJvbGVbXTsgY29uZmlnczogUHJvamVjdFJvbGVDb25maWdbXSB9PihgL2FwaS9kb2N1bWVudHMvcm9sZXMke3R5cGUgPyBgP3R5cGU9JHt0eXBlfWAgOiAnJ31gKTsgfVxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNhdmVEb2N1bWVudFJvbGUocm9sZTogRG9jdW1lbnRSb2xlKSB7XG4gIHJldHVybiBmZXRjaEpzb248eyByb2xlOiBEb2N1bWVudFJvbGU7IHJvbGVzOiBEb2N1bWVudFJvbGVbXTsgY29uZmlnczogUHJvamVjdFJvbGVDb25maWdbXSB9PignL2FwaS9kb2N1bWVudHMvcm9sZXMnLCB7IG1ldGhvZDogJ1BVVCcsIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LCBib2R5OiBKU09OLnN0cmluZ2lmeShyb2xlKSB9KTtcbn1cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZWxldGVEb2N1bWVudFJvbGUodHlwZTogJ2ZpbGUnIHwgJ3Byb21wdCcsIGlkOiBzdHJpbmcpIHtcbiAgcmV0dXJuIGZldGNoSnNvbjx7IHN1Y2Nlc3M6IGJvb2xlYW47IHJvbGVzOiBEb2N1bWVudFJvbGVbXTsgY29uZmlnczogUHJvamVjdFJvbGVDb25maWdbXSB9PihgL2FwaS9kb2N1bWVudHMvcm9sZXM/dHlwZT0ke3R5cGV9JmlkPSR7ZW5jb2RlVVJJQ29tcG9uZW50KGlkKX1gLCB7IG1ldGhvZDogJ0RFTEVURScgfSk7XG59XG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2F2ZVByb2plY3RSb2xlQ29uZmlnKGNvbmZpZzogUHJvamVjdFJvbGVDb25maWcpIHtcbiAgcmV0dXJuIGZldGNoSnNvbjx7IGNvbmZpZzogUHJvamVjdFJvbGVDb25maWc7IHJvbGVzOiBEb2N1bWVudFJvbGVbXTsgY29uZmlnczogUHJvamVjdFJvbGVDb25maWdbXSB9PignL2FwaS9kb2N1bWVudHMvcm9sZXM/bW9kZT1jb25maWcnLCB7IG1ldGhvZDogJ1BVVCcsIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LCBib2R5OiBKU09OLnN0cmluZ2lmeShjb25maWcpIH0pO1xufVxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRlbGV0ZVByb2plY3RSb2xlQ29uZmlnKGlkOiBzdHJpbmcpIHtcbiAgcmV0dXJuIGZldGNoSnNvbjx7IHN1Y2Nlc3M6IGJvb2xlYW47IHJvbGVzOiBEb2N1bWVudFJvbGVbXTsgY29uZmlnczogUHJvamVjdFJvbGVDb25maWdbXSB9PihgL2FwaS9kb2N1bWVudHMvcm9sZXM/bW9kZT1jb25maWcmaWQ9JHtlbmNvZGVVUklDb21wb25lbnQoaWQpfWAsIHsgbWV0aG9kOiAnREVMRVRFJyB9KTtcbn1cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXREb2N1bWVudFRlbXBsYXRlcygpIHsgcmV0dXJuIGZldGNoSnNvbjx7IHRlbXBsYXRlczogRG9jdW1lbnRUZW1wbGF0ZVtdIH0+KCcvYXBpL2RvY3VtZW50cy90ZW1wbGF0ZXMnKTsgfVxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHZhbGlkYXRlRG9jdW1lbnRUZW1wbGF0ZSh0ZW1wbGF0ZUlkOiBzdHJpbmcsIHByb2plY3RSb290Pzogc3RyaW5nKSB7XG4gIGNvbnN0IHAgPSBwcm9qZWN0Um9vdCA/IGAmcHJvamVjdFJvb3Q9JHtlbmNvZGVVUklDb21wb25lbnQocHJvamVjdFJvb3QpfWAgOiAnJztcbiAgcmV0dXJuIGZldGNoSnNvbjx7IHZhbGlkYXRpb246IERvY3VtZW50VGVtcGxhdGVWYWxpZGF0aW9uIH0+KGAvYXBpL2RvY3VtZW50cy90ZW1wbGF0ZXM/dmFsaWRhdGU9JHtlbmNvZGVVUklDb21wb25lbnQodGVtcGxhdGVJZCl9JHtwfWApO1xufVxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNhdmVEb2N1bWVudFRlbXBsYXRlKHRlbXBsYXRlOiBEb2N1bWVudFRlbXBsYXRlKSB7XG4gIHJldHVybiBmZXRjaEpzb248eyB0ZW1wbGF0ZTogRG9jdW1lbnRUZW1wbGF0ZTsgdGVtcGxhdGVzOiBEb2N1bWVudFRlbXBsYXRlW10gfT4oJy9hcGkvZG9jdW1lbnRzL3RlbXBsYXRlcycsIHsgbWV0aG9kOiAnUFVUJywgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sIGJvZHk6IEpTT04uc3RyaW5naWZ5KHRlbXBsYXRlKSB9KTtcbn1cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZWxldGVEb2N1bWVudFRlbXBsYXRlKHRlbXBsYXRlSWQ6IHN0cmluZykge1xuICByZXR1cm4gZmV0Y2hKc29uPHsgc3VjY2VzczogYm9vbGVhbjsgdGVtcGxhdGVzOiBEb2N1bWVudFRlbXBsYXRlW10gfT4oYC9hcGkvZG9jdW1lbnRzL3RlbXBsYXRlcz90ZW1wbGF0ZUlkPSR7ZW5jb2RlVVJJQ29tcG9uZW50KHRlbXBsYXRlSWQpfWAsIHsgbWV0aG9kOiAnREVMRVRFJyB9KTtcbn1cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkdXBsaWNhdGVEb2N1bWVudFRlbXBsYXRlKHRlbXBsYXRlSWQ6IHN0cmluZykge1xuICByZXR1cm4gZmV0Y2hKc29uPHsgdGVtcGxhdGU6IERvY3VtZW50VGVtcGxhdGU7IHRlbXBsYXRlczogRG9jdW1lbnRUZW1wbGF0ZVtdIH0+KCcvYXBpL2RvY3VtZW50cy90ZW1wbGF0ZXMnLCB7IG1ldGhvZDogJ1BBVENIJywgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgdGVtcGxhdGVJZCB9KSB9KTtcbn1cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZURvY3VtZW50RHJhZnQoaW5wdXQ6IHsgdGVtcGxhdGVJZDogc3RyaW5nOyByZXF1aXJlbWVudD86IHN0cmluZzsgbWF4RXZpZGVuY2VQZXJDaGFwdGVyPzogbnVtYmVyOyBwcm9qZWN0Um9vdD86IHN0cmluZyB9KSB7XG4gIHJldHVybiBmZXRjaEpzb248eyBkcmFmdD86IEdlbmVyYXRlZERvY3VtZW50RHJhZnQ7IHRhc2tJZD86IHN0cmluZzsgZG9jdW1lbnRJZD86IHN0cmluZzsgcmVjb3JkPzogR2VuZXJhdGVkRG9jdW1lbnRSZWNvcmQgfT4oJy9hcGkvZG9jdW1lbnRzL2dlbmVyYXRlJywgeyBtZXRob2Q6ICdQT1NUJywgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sIGJvZHk6IEpTT04uc3RyaW5naWZ5KGlucHV0KSB9KTtcbn1cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRHZW5lcmF0ZWREb2N1bWVudHMocHJvamVjdFJvb3Q/OiBzdHJpbmcpIHtcbiAgY29uc3QgcCA9IHByb2plY3RSb290ID8gYD9wcm9qZWN0Um9vdD0ke2VuY29kZVVSSUNvbXBvbmVudChwcm9qZWN0Um9vdCl9YCA6ICcnO1xuICByZXR1cm4gZmV0Y2hKc29uPHsgZG9jdW1lbnRzOiBHZW5lcmF0ZWREb2N1bWVudFJlY29yZFtdIH0+KGAvYXBpL2RvY3VtZW50cy9nZW5lcmF0ZWQke3B9YCk7XG59XG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0R2VuZXJhdGVkRG9jdW1lbnQoaWQ6IHN0cmluZywgbGl0ZSA9IGZhbHNlLCBwcm9qZWN0Um9vdD86IHN0cmluZywgc2lnbmFsPzogQWJvcnRTaWduYWwpIHtcbiAgY29uc3QgcGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcygpO1xuICBpZiAobGl0ZSkgcGFyYW1zLnNldCgnbGl0ZScsICcxJyk7XG4gIGlmIChwcm9qZWN0Um9vdCkgcGFyYW1zLnNldCgncHJvamVjdFJvb3QnLCBwcm9qZWN0Um9vdCk7XG4gIGNvbnN0IHF1ZXJ5ID0gcGFyYW1zLnRvU3RyaW5nKCkgPyBgPyR7cGFyYW1zLnRvU3RyaW5nKCl9YCA6ICcnO1xuICByZXR1cm4gZmV0Y2hKc29uPHsgZG9jdW1lbnQ6IEdlbmVyYXRlZERvY3VtZW50UmVjb3JkIH0+KGAvYXBpL2RvY3VtZW50cy9nZW5lcmF0ZWQvJHtlbmNvZGVVUklDb21wb25lbnQoaWQpfSR7cXVlcnl9YCwgeyBzaWduYWwgfSk7XG59XG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdXBkYXRlR2VuZXJhdGVkRG9jdW1lbnQoaWQ6IHN0cmluZywgcGF0Y2g6IFBhcnRpYWw8R2VuZXJhdGVkRG9jdW1lbnRSZWNvcmQ+LCBwcm9qZWN0Um9vdD86IHN0cmluZykge1xuICBjb25zdCBwID0gcHJvamVjdFJvb3QgPyBgP3Byb2plY3RSb290PSR7ZW5jb2RlVVJJQ29tcG9uZW50KHByb2plY3RSb290KX1gIDogJyc7XG4gIHJldHVybiBmZXRjaEpzb248eyBkb2N1bWVudDogR2VuZXJhdGVkRG9jdW1lbnRSZWNvcmQgfT4oYC9hcGkvZG9jdW1lbnRzL2dlbmVyYXRlZC8ke2VuY29kZVVSSUNvbXBvbmVudChpZCl9JHtwfWAsIHsgbWV0aG9kOiAnUFVUJywgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sIGJvZHk6IEpTT04uc3RyaW5naWZ5KHBhdGNoKSB9KTtcbn1cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZWxldGVHZW5lcmF0ZWREb2N1bWVudChpZDogc3RyaW5nLCBwcm9qZWN0Um9vdD86IHN0cmluZykge1xuICBjb25zdCBwID0gcHJvamVjdFJvb3QgPyBgP3Byb2plY3RSb290PSR7ZW5jb2RlVVJJQ29tcG9uZW50KHByb2plY3RSb290KX1gIDogJyc7XG4gIHJldHVybiBmZXRjaEpzb248eyBvazogYm9vbGVhbiB9PihgL2FwaS9kb2N1bWVudHMvZ2VuZXJhdGVkLyR7ZW5jb2RlVVJJQ29tcG9uZW50KGlkKX0ke3B9YCwgeyBtZXRob2Q6ICdERUxFVEUnIH0pO1xufVxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFib3J0R2VuZXJhdGVkRG9jdW1lbnQoZG9jdW1lbnRJZDogc3RyaW5nLCBwcm9qZWN0Um9vdD86IHN0cmluZykgeyByZXR1cm4gZmV0Y2hKc29uPHsgZG9jdW1lbnQ6IEdlbmVyYXRlZERvY3VtZW50UmVjb3JkIH0+KCcvYXBpL2RvY3VtZW50cy9nZW5lcmF0ZWQnLCB7IG1ldGhvZDogJ1BPU1QnLCBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSwgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBhY3Rpb246ICdhYm9ydCcsIGRvY3VtZW50SWQsIHByb2plY3RSb290IH0pIH0pOyB9XG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVzdW1lR2VuZXJhdGVkRG9jdW1lbnQoZG9jdW1lbnRJZDogc3RyaW5nLCBwcm9qZWN0Um9vdD86IHN0cmluZykgeyByZXR1cm4gZmV0Y2hKc29uPHsgdGFza0lkOiBzdHJpbmc7IGRvY3VtZW50SWQ6IHN0cmluZzsgcmVjb3JkOiBHZW5lcmF0ZWREb2N1bWVudFJlY29yZCB9PignL2FwaS9kb2N1bWVudHMvZ2VuZXJhdGVkJywgeyBtZXRob2Q6ICdQT1NUJywgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgYWN0aW9uOiAncmVzdW1lJywgZG9jdW1lbnRJZCwgcHJvamVjdFJvb3QgfSkgfSk7IH1cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRHZW5lcmF0ZWRBc3NldHMocHJvamVjdFJvb3Q/OiBzdHJpbmcpIHtcbiAgY29uc3QgcCA9IHByb2plY3RSb290ID8gYD9wcm9qZWN0Um9vdD0ke2VuY29kZVVSSUNvbXBvbmVudChwcm9qZWN0Um9vdCl9YCA6ICcnO1xuICByZXR1cm4gZmV0Y2hKc29uPHsgYXNzZXRzOiBHZW5lcmF0ZWRBc3NldFJlY29yZFtdIH0+KGAvYXBpL2Fzc2V0cy9nZW5lcmF0ZWQke3B9YCk7XG59XG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGVsZXRlR2VuZXJhdGVkQXNzZXQoaWQ6IHN0cmluZywgcHJvamVjdFJvb3Q/OiBzdHJpbmcpIHtcbiAgY29uc3QgcCA9IHByb2plY3RSb290ID8gYCZwcm9qZWN0Um9vdD0ke2VuY29kZVVSSUNvbXBvbmVudChwcm9qZWN0Um9vdCl9YCA6ICcnO1xuICByZXR1cm4gZmV0Y2hKc29uPHsgb2s6IGJvb2xlYW47IGFzc2V0czogR2VuZXJhdGVkQXNzZXRSZWNvcmRbXSB9PihgL2FwaS9hc3NldHMvZ2VuZXJhdGVkP2lkPSR7ZW5jb2RlVVJJQ29tcG9uZW50KGlkKX0ke3B9YCwgeyBtZXRob2Q6ICdERUxFVEUnIH0pO1xufVxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG9wZW5HZW5lcmF0ZWRBc3NldChpZDogc3RyaW5nLCB0YXJnZXQ6ICdmaWxlJyB8ICdkaXJlY3RvcnknLCBwcm9qZWN0Um9vdD86IHN0cmluZykgeyByZXR1cm4gZmV0Y2hKc29uPHsgb2s6IGJvb2xlYW4gfT4oJy9hcGkvYXNzZXRzL2dlbmVyYXRlZCcsIHsgbWV0aG9kOiAnUE9TVCcsIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LCBib2R5OiBKU09OLnN0cmluZ2lmeSh7IGlkLCBhY3Rpb246ICdvcGVuJywgdGFyZ2V0LCBwcm9qZWN0Um9vdCB9KSB9KTsgfVxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlZ2VuZXJhdGVEb2N1bWVudENoYXB0ZXIoaW5wdXQ6IHsgdGVtcGxhdGVJZDogc3RyaW5nOyBjaGFwdGVySWQ6IHN0cmluZzsgcmVxdWlyZW1lbnQ/OiBzdHJpbmc7IG1heEV2aWRlbmNlUGVyQ2hhcHRlcj86IG51bWJlcjsgcHJvamVjdFJvb3Q/OiBzdHJpbmc7IGRvY3VtZW50SWQ/OiBzdHJpbmc7IGN1cnJlbnRNYXJrZG93bj86IHN0cmluZzsgZXhpc3RpbmdGYWN0cz86IHN0cmluZ1tdIH0pIHtcbiAgcmV0dXJuIGZldGNoSnNvbjx7IGNoYXB0ZXI6IERvY3VtZW50RHJhZnRDaGFwdGVyIH0+KCcvYXBpL2RvY3VtZW50cy9jaGFwdGVyL3JlZ2VuZXJhdGUnLCB7IG1ldGhvZDogJ1BPU1QnLCBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSwgYm9keTogSlNPTi5zdHJpbmdpZnkoaW5wdXQpIH0pO1xufVxuZXhwb3J0IGludGVyZmFjZSBSZWZpbmVTZWxlY3Rpb24geyBzdGFydDogbnVtYmVyOyBlbmQ6IG51bWJlcjsgdGV4dD86IHN0cmluZzsgfVxuZXhwb3J0IGludGVyZmFjZSBSZWZpbmVQbGFuIHtcbiAgc2NvcGU6ICdzZWxlY3Rpb24nIHwgJ3NlY3Rpb24nIHwgJ2NoYXB0ZXInIHwgJ2RvY3VtZW50JztcbiAgYWN0aW9uOiAncG9saXNoJyB8ICdleHBhbmQnIHwgJ3N1bW1hcml6ZScgfCAncmVwbGFjZScgfCAnZGVsZXRlJyB8ICdhZGQnIHwgJ3Jlc3RydWN0dXJlJyB8ICd0YWJsZSc7XG4gIHRhcmdldFRpdGxlPzogc3RyaW5nO1xuICB0YXJnZXRSYW5nZT86IHsgc3RhcnQ6IG51bWJlcjsgZW5kOiBudW1iZXIgfTtcbiAgYmFzZU1hcmtkb3duSGFzaD86IHN0cmluZztcbiAgdGFyZ2V0VGV4dEhhc2g/OiBzdHJpbmc7XG4gIGNvbmZpZGVuY2U6IG51bWJlcjtcbiAgc3VtbWFyeTogc3RyaW5nO1xuICBuZWVkc0NvbmZpcm1hdGlvbjogYm9vbGVhbjtcbn1cbmV4cG9ydCBpbnRlcmZhY2UgUmVmaW5lUmVzdWx0IHsgbWFya2Rvd24/OiBzdHJpbmc7IHBsYW4/OiBSZWZpbmVQbGFuOyBzdW1tYXJ5Pzogc3RyaW5nOyBiZWZvcmVTbmlwcGV0Pzogc3RyaW5nOyBhZnRlclNuaXBwZXQ/OiBzdHJpbmc7IGNoYW5nZWRDaGFycz86IG51bWJlcjsgfVxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlZmluZUdlbmVyYXRlZERvY3VtZW50KGlucHV0OiB7IG1vZGU/OiAncGxhbicgfCAnYXBwbHknOyB0aXRsZTogc3RyaW5nOyBtYXJrZG93bjogc3RyaW5nOyBpbnN0cnVjdGlvbjogc3RyaW5nOyBmYWN0cz86IHN0cmluZ1tdOyBjaGFwdGVycz86IHN0cmluZ1tdOyBzZWxlY3Rpb24/OiBSZWZpbmVTZWxlY3Rpb247IGN1cnNvck9mZnNldD86IG51bWJlcjsgcGxhbj86IFJlZmluZVBsYW4gfSkge1xuICByZXR1cm4gZmV0Y2hKc29uPFJlZmluZVJlc3VsdD4oJy9hcGkvZG9jdW1lbnRzL3JlZmluZScsIHsgbWV0aG9kOiAnUE9TVCcsIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LCBib2R5OiBKU09OLnN0cmluZ2lmeShpbnB1dCkgfSk7XG59XG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0RG9jdW1lbnREcmFmdHMoKSB7IHJldHVybiBmZXRjaEpzb248eyBkcmFmdHM6IFN0b3JlZERvY3VtZW50RHJhZnRbXSB9PignL2FwaS9kb2N1bWVudHMvZHJhZnRzJyk7IH1cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzYXZlRG9jdW1lbnREcmFmdChkcmFmdDogR2VuZXJhdGVkRG9jdW1lbnREcmFmdCwgaWQ/OiBzdHJpbmcpIHtcbiAgcmV0dXJuIGZldGNoSnNvbjx7IGRyYWZ0OiBTdG9yZWREb2N1bWVudERyYWZ0IH0+KCcvYXBpL2RvY3VtZW50cy9kcmFmdHMnLCB7IG1ldGhvZDogJ1BPU1QnLCBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSwgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBkcmFmdCwgaWQgfSkgfSk7XG59XG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZXhwb3J0RG9jdW1lbnQoaW5wdXQ6IHsgZG9jdW1lbnRJZD86IHN0cmluZzsgdGl0bGU/OiBzdHJpbmc7IG1hcmtkb3duPzogc3RyaW5nOyBmb3JtYXQ6ICdtYXJrZG93bicgfCAnaHRtbCcgfCAncGRmJyB8ICdkb2N4JzsgZW5mb3JjZUdhdGU/OiBib29sZWFuOyB1c2VDbGllbnRNYXJrZG93bj86IGJvb2xlYW47IGV4cG9ydEdhdGU/OiBFeHBvcnRHYXRlUmVzdWx0OyB3b3JkVGVtcGxhdGVQYXRoPzogc3RyaW5nOyBwcm9qZWN0Um9vdD86IHN0cmluZyB9KSB7XG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goJy9hcGkvZG9jdW1lbnRzL2V4cG9ydCcsIHsgbWV0aG9kOiAnUE9TVCcsIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJywgQWNjZXB0OiBpbnB1dC5mb3JtYXQgPT09ICdwZGYnID8gJ2FwcGxpY2F0aW9uL3BkZicgOiAnKi8qJyB9LCBib2R5OiBKU09OLnN0cmluZ2lmeShpbnB1dCkgfSk7XG4gIGNvbnN0IGNvbnRlbnRUeXBlID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoJ2NvbnRlbnQtdHlwZScpIHx8ICcnO1xuICBjb25zdCBwYXJzZUV4cG9ydEVycm9yID0gYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHRleHQgPSBhd2FpdCByZXNwb25zZS50ZXh0KCk7XG4gICAgbGV0IG1lc3NhZ2UgPSB0ZXh0IHx8ICflr7zlh7rlpLHotKUnO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKHRleHQpIGFzIHsgZXJyb3I/OiBzdHJpbmc7IG1lc3NhZ2U/OiBzdHJpbmc7IGlzc3Vlcz86IEFycmF5PHsgbWVzc2FnZT86IHN0cmluZyB9PiB9O1xuICAgICAgY29uc3QgaXNzdWVUZXh0ID0gcGFyc2VkLmlzc3Vlcz8ubWFwKGlzc3VlID0+IGlzc3VlLm1lc3NhZ2UpLmZpbHRlcihCb29sZWFuKS5zbGljZSgwLCAzKS5qb2luKCfvvJsnKTtcbiAgICAgIG1lc3NhZ2UgPSBpc3N1ZVRleHQgPyBgJHtwYXJzZWQuZXJyb3IgfHwgJ+WvvOWHuuWksei0pSd977yaJHtpc3N1ZVRleHR9YCA6IHBhcnNlZC5tZXNzYWdlIHx8IHBhcnNlZC5lcnJvciB8fCBtZXNzYWdlO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8g5L+d55WZ5Y6f5aeL5ZON5bqU5paH5pysXG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlLmxlbmd0aCA+IDMwMCA/IGAke21lc3NhZ2Uuc2xpY2UoMCwgMzAwKX0uLi5gIDogbWVzc2FnZSk7XG4gIH07XG4gIGlmICghcmVzcG9uc2Uub2spIGF3YWl0IHBhcnNlRXhwb3J0RXJyb3IoKTtcbiAgaWYgKGlucHV0LmZvcm1hdCA9PT0gJ3BkZicgJiYgIWNvbnRlbnRUeXBlLmluY2x1ZGVzKCdhcHBsaWNhdGlvbi9wZGYnKSkgYXdhaXQgcGFyc2VFeHBvcnRFcnJvcigpO1xuICBpZiAoaW5wdXQuZm9ybWF0ID09PSAnZG9jeCcgJiYgIWNvbnRlbnRUeXBlLmluY2x1ZGVzKCdvZmZpY2Vkb2N1bWVudC53b3JkcHJvY2Vzc2luZ21sLmRvY3VtZW50JykpIGF3YWl0IHBhcnNlRXhwb3J0RXJyb3IoKTtcbiAgcmV0dXJuIHJlc3BvbnNlLmJsb2IoKTtcbn1cblxuLy8g4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQIOaooeWei+mFjee9riDilZDilZDilZDilZDilZDilZDilZBcblxuZXhwb3J0IGludGVyZmFjZSBNb2RlbENhcGFiaWxpdGllcyB7IGltYWdlR2VuZXJhdGlvbj86IGJvb2xlYW47IGltYWdlVW5kZXJzdGFuZGluZz86IGJvb2xlYW47IGZpbGVVbmRlcnN0YW5kaW5nPzogYm9vbGVhbjsgYXVkaW8/OiBib29sZWFuOyB2aWRlbz86IGJvb2xlYW47IH1cbmV4cG9ydCBpbnRlcmZhY2UgUHJvdmlkZXJJbmZvIHsgbmFtZTogc3RyaW5nOyBhcGlLZXk/OiBzdHJpbmc7IGJhc2VVcmw/OiBzdHJpbmc7IHByb3RvY29sPzogc3RyaW5nOyBkaXJlY3RFbmRwb2ludD86IGJvb2xlYW47IGRldGVjdGVkUHJvdG9jb2w6IHN0cmluZzsgaGFzQXBpS2V5OiBib29sZWFuOyBjYXBhYmlsaXRpZXM/OiBNb2RlbENhcGFiaWxpdGllczsgfVxuZXhwb3J0IGludGVyZmFjZSBNb2RlbHNDb25maWcgeyByZWFkZXI6IHsgYWN0aXZlOiBzdHJpbmc7IGxpc3Q6IHsgbmFtZTogc3RyaW5nOyBwcm92aWRlcjogc3RyaW5nIH1bXSB9OyByZWFzb25pbmc6IHsgYWN0aXZlOiBzdHJpbmc7IGxpc3Q6IHsgbmFtZTogc3RyaW5nOyBwcm92aWRlcjogc3RyaW5nIH1bXSB9OyBhY3Rpb246IHsgYWN0aXZlOiBzdHJpbmc7IGxpc3Q6IHsgbmFtZTogc3RyaW5nOyBwcm92aWRlcjogc3RyaW5nIH1bXSB9OyB9XG5leHBvcnQgaW50ZXJmYWNlIEVtYmVkZGluZ0NvbmZpZyB7IHByb3ZpZGVyOiAnb3BlbmFpLWNvbXBhdGlibGUnIHwgJ3RyYW5zZm9ybWVycy1sb2NhbCc7IGJhc2VVcmw/OiBzdHJpbmc7IGFwaUtleT86IHN0cmluZzsgbW9kZWw/OiBzdHJpbmc7IGRpbWVuc2lvbnM/OiBudW1iZXI7IGhhc0FwaUtleT86IGJvb2xlYW47IH1cbmV4cG9ydCBpbnRlcmZhY2UgV2ViQWNjZXNzQ29uZmlnIHsgZW5hYmxlZDogYm9vbGVhbjsgYWxsb3dQcm9qZWN0RmFjdHM6IGZhbHNlOyBtYXhRdWVyaWVzUGVyQ2hhcHRlcjogbnVtYmVyOyBtYXhSZXN1bHRzUGVyUXVlcnk6IG51bWJlcjsgdHJ1c3RlZERvbWFpbnM6IHN0cmluZ1tdOyB9XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRQcm92aWRlcnMoKSB7IHJldHVybiBmZXRjaEpzb248UHJvdmlkZXJJbmZvW10+KCcvYXBpL2NvbmZpZy9wcm92aWRlcnMnKTsgfVxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNhdmVQcm92aWRlcihuYW1lOiBzdHJpbmcsIGNmZzogeyBhcGlLZXk/OiBzdHJpbmc7IGJhc2VVcmw/OiBzdHJpbmc7IHByb3RvY29sPzogc3RyaW5nOyBkaXJlY3RFbmRwb2ludD86IGJvb2xlYW47IGNhcGFiaWxpdGllcz86IE1vZGVsQ2FwYWJpbGl0aWVzOyBvbGROYW1lPzogc3RyaW5nIH0pIHtcbiAgcmV0dXJuIGZldGNoSnNvbjx7IHN1Y2Nlc3M6IGJvb2xlYW4gfT4oJy9hcGkvY29uZmlnL3Byb3ZpZGVycycsIHsgbWV0aG9kOiAnUE9TVCcsIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LCBib2R5OiBKU09OLnN0cmluZ2lmeSh7IG5hbWUsIC4uLmNmZyB9KSB9KTtcbn1cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZWxldGVQcm92aWRlcihuYW1lOiBzdHJpbmcpIHsgcmV0dXJuIGZldGNoSnNvbjx7IHN1Y2Nlc3M6IGJvb2xlYW4gfT4oYC9hcGkvY29uZmlnL3Byb3ZpZGVycy8ke2VuY29kZVVSSUNvbXBvbmVudChuYW1lKX1gLCB7IG1ldGhvZDogJ0RFTEVURScgfSk7IH1cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRNb2RlbHMoKSB7IHJldHVybiBmZXRjaEpzb248TW9kZWxzQ29uZmlnPignL2FwaS9jb25maWcvbW9kZWxzJyk7IH1cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzYXZlTW9kZWxzKG1vZGVsczogTW9kZWxzQ29uZmlnKSB7XG4gIHJldHVybiBmZXRjaEpzb248eyBzdWNjZXNzOiBib29sZWFuIH0+KCcvYXBpL2NvbmZpZy9tb2RlbHMnLCB7IG1ldGhvZDogJ1BVVCcsIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LCBib2R5OiBKU09OLnN0cmluZ2lmeShtb2RlbHMpIH0pO1xufVxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEVtYmVkZGluZ0NvbmZpZygpIHsgcmV0dXJuIGZldGNoSnNvbjxFbWJlZGRpbmdDb25maWc+KCcvYXBpL2NvbmZpZy9lbWJlZGRpbmcnKTsgfVxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNhdmVFbWJlZGRpbmdDb25maWcoY29uZmlnOiBFbWJlZGRpbmdDb25maWcpIHtcbiAgcmV0dXJuIGZldGNoSnNvbjxFbWJlZGRpbmdDb25maWc+KCcvYXBpL2NvbmZpZy9lbWJlZGRpbmcnLCB7IG1ldGhvZDogJ1BVVCcsIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LCBib2R5OiBKU09OLnN0cmluZ2lmeShjb25maWcpIH0pO1xufVxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGVtYmVkZGluZ0hlYWx0aENoZWNrKCkge1xuICByZXR1cm4gZmV0Y2hKc29uPHsgc3VjY2VzczogYm9vbGVhbjsgbWVzc2FnZTogc3RyaW5nOyBsYXRlbmN5TXM/OiBudW1iZXIgfT4oJy9hcGkvY29uZmlnL2VtYmVkZGluZy9oZWFsdGhDaGVjaycsIHsgbWV0aG9kOiAnUE9TVCcgfSk7XG59XG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0V2ViQWNjZXNzQ29uZmlnKCkgeyByZXR1cm4gZmV0Y2hKc29uPFdlYkFjY2Vzc0NvbmZpZz4oJy9hcGkvY29uZmlnL3dlYi1hY2Nlc3MnKTsgfVxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNhdmVXZWJBY2Nlc3NDb25maWcoY29uZmlnOiBQYXJ0aWFsPFdlYkFjY2Vzc0NvbmZpZz4pIHtcbiAgcmV0dXJuIGZldGNoSnNvbjxXZWJBY2Nlc3NDb25maWc+KCcvYXBpL2NvbmZpZy93ZWItYWNjZXNzJywgeyBtZXRob2Q6ICdQVVQnLCBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSwgYm9keTogSlNPTi5zdHJpbmdpZnkoY29uZmlnKSB9KTtcbn1cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBoZWFsdGhDaGVjayhwcm92aWRlck5hbWU6IHN0cmluZykge1xuICByZXR1cm4gZmV0Y2hKc29uPHsgc3VjY2VzczogYm9vbGVhbjsgbWVzc2FnZTogc3RyaW5nOyByZXF1ZXN0SWQ/OiBzdHJpbmc7IG1vZGVsTmFtZT86IHN0cmluZyB9PignL2FwaS9jb25maWcvaGVhbHRoQ2hlY2snLCB7IG1ldGhvZDogJ1BPU1QnLCBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSwgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBwcm92aWRlcjogcHJvdmlkZXJOYW1lIH0pIH0pO1xufVxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEhlYWx0aCgpIHsgcmV0dXJuIGZldGNoSnNvbjx7IHN0YXR1czogc3RyaW5nOyB1cHRpbWU6IG51bWJlciB9PignL2FwaS9oZWFsdGgnKTsgfVxuXG4vLyDilZDilZDilZDilZDilZDilZDilZAg57O757uf57uf6K6hIOKVkOKVkOKVkOKVkOKVkOKVkOKVkFxuXG5leHBvcnQgaW50ZXJmYWNlIFN5c3RlbVN0YXRzIHtcbiAgY3B1OiB7IHVzYWdlUGVyY2VudDogbnVtYmVyOyBjb3JlczogbnVtYmVyIH07XG4gIG1lbW9yeTogeyB0b3RhbE1COiBudW1iZXI7IHVzZWRNQjogbnVtYmVyOyBwcm9jZXNzTUI6IG51bWJlcjsgdXNhZ2VQZXJjZW50OiBudW1iZXIgfTtcbiAgdG9rZW5zOiB7IHRvdGFsOiBudW1iZXI7IHByb21wdDogbnVtYmVyOyBjb21wbGV0aW9uOiBudW1iZXIgfTtcbiAgbW9kZWxzOiB7IHByb3ZpZGVyOiBzdHJpbmc7IG1vZGVsOiBzdHJpbmc7IGNvdW50OiBudW1iZXIgfVtdO1xuICB0YXNrczogeyB0b3RhbDogbnVtYmVyOyBzdWNjZXNzOiBudW1iZXI7IGZhaWxlZDogbnVtYmVyOyBydW5uaW5nOiBudW1iZXI7IHR5cGVzOiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+IH07XG4gIGxvZ3M6IHsgZmlsZXM6IG51bWJlcjsgZXZlbnRzOiBudW1iZXI7IGxhdGVzdEF0Pzogc3RyaW5nOyBzY2FubmVkRGlyczogc3RyaW5nW10gfTtcbiAgdXB0aW1lOiBudW1iZXI7XG59XG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0U3lzdGVtU3RhdHMoKSB7IHJldHVybiBmZXRjaEpzb248U3lzdGVtU3RhdHM+KCcvYXBpL3N5c3RlbS9zdGF0cycpOyB9XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXJyb3JMb2dFbnRyeSB7XG4gIGlkOiBzdHJpbmc7XG4gIGxldmVsOiAnZXJyb3InIHwgJ3dhcm4nIHwgJ2luZm8nO1xuICBzb3VyY2U6IHN0cmluZztcbiAgZnVuY3Rpb25OYW1lPzogc3RyaW5nO1xuICBtZXNzYWdlOiBzdHJpbmc7XG4gIHN0YWNrPzogc3RyaW5nO1xuICByZXF1ZXN0PzogeyBtZXRob2Q/OiBzdHJpbmc7IHVybD86IHN0cmluZzsgcXVlcnk/OiB1bmtub3duIH07XG4gIG1ldGE/OiB1bmtub3duO1xuICBjcmVhdGVkQXQ6IG51bWJlcjtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEVycm9yTG9ncyhsaW1pdCA9IDIwMCkgeyByZXR1cm4gZmV0Y2hKc29uPHsgbG9nczogRXJyb3JMb2dFbnRyeVtdIH0+KGAvYXBpL3N5c3RlbS9sb2dzP2xpbWl0PSR7bGltaXR9YCk7IH1cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjbGVhckVycm9yTG9ncygpIHsgcmV0dXJuIGZldGNoSnNvbjx7IG9rOiB0cnVlIH0+KCcvYXBpL3N5c3RlbS9sb2dzJywgeyBtZXRob2Q6ICdERUxFVEUnIH0pOyB9XG5cbi8vIOKVkOKVkOKVkOKVkOKVkOKVkOKVkCDmj5DnpLror40g4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQXG4vLyAo5Y2h54mH5byPIEFQSe+8jOebtOaOpeWcqCBwcm9tcHQg6aG16Z2i5Lit6YCa6L+HIGZldGNoIOS9v+eUqClcblxuLy8g4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQIOefpeivhuW6k+WIhuexu+e7n+iuoSDilZDilZDilZDilZDilZDilZDilZBcblxuZXhwb3J0IGludGVyZmFjZSBLYkNhdGVnb3J5U3RhdHMge1xuICBjYXRlZ29yeTogc3RyaW5nOyBmaWxlQ291bnQ6IG51bWJlcjsgdG90YWxTaXplOiBudW1iZXI7XG59XG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0S2JDYXRlZ29yeVN0YXRzKHByb2plY3RSb290Pzogc3RyaW5nKSB7XG4gIGNvbnN0IHAgPSBwcm9qZWN0Um9vdCA/IGA/cHJvamVjdFJvb3Q9JHtlbmNvZGVVUklDb21wb25lbnQocHJvamVjdFJvb3QpfWAgOiAnJztcbiAgcmV0dXJuIGZldGNoSnNvbjxLYkNhdGVnb3J5U3RhdHNbXT4oYC9hcGkva2IvY2F0ZWdvcmllcyR7cH1gKTtcbn1cblxuLy8g4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQIOS+m+W6lOWVhuivpuaDhSDilZDilZDilZDilZDilZDilZDilZBcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRQcm92aWRlckRldGFpbChuYW1lOiBzdHJpbmcpIHtcbiAgcmV0dXJuIGZldGNoSnNvbjxQcm92aWRlckluZm8+KGAvYXBpL2NvbmZpZy9wcm92aWRlcnMvJHtlbmNvZGVVUklDb21wb25lbnQobmFtZSl9YCk7XG59XG4iXSwibmFtZXMiOlsiZmV0Y2hKc29uIiwidXJsIiwib3B0aW9ucyIsInJlcyIsImZldGNoIiwib2siLCJib2R5IiwidGV4dCIsIm1lc3NhZ2UiLCJzdGF0dXMiLCJwYXJzZWQiLCJKU09OIiwicGFyc2UiLCJlcnJvciIsImh0bWxFcnJvciIsIm1hdGNoIiwibmV4dERhdGEiLCJyZXBsYWNlIiwiZXJyIiwiRXJyb3IiLCJqc29uIiwiZ2V0S2JTdGF0cyIsInByb2plY3RSb290IiwicCIsImVuY29kZVVSSUNvbXBvbmVudCIsImdldEtiRmlsZXMiLCJvcHRzIiwicGFyYW1zIiwiVVJMU2VhcmNoUGFyYW1zIiwic2V0IiwiY2F0ZWdvcnkiLCJwYWdlIiwiU3RyaW5nIiwibGltaXQiLCJnZXRLYkZpbGVzVHJlZSIsInBhcmVudFBhdGgiLCJzZWFyY2hLYkZpbGVzIiwicXVlcnkiLCJpbmNsdWRlQ29udGVudCIsImV2YWx1YXRlS2JSZXRyaWV2YWwiLCJtZXRob2QiLCJoZWFkZXJzIiwic3RyaW5naWZ5IiwiZ2V0S2JGaWxlRGV0YWlsIiwicmVsYXRpdmVQYXRoIiwicmVpbmRleEtiRmlsZSIsIm9wZW5LYkZpbGVUYXJnZXQiLCJ0YXJnZXQiLCJmaWxlUmVsYXRpdmVQYXRoIiwiZmlsZSIsIndlYmtpdFJlbGF0aXZlUGF0aCIsIm5hbWUiLCJhcHBlbmRVcGxvYWRGb3JtIiwiZmlsZXMiLCJmb3JtIiwiRm9ybURhdGEiLCJhcHBlbmQiLCJ1cGxvYWRJZCIsImJhdGNoSW5kZXgiLCJ0b3RhbEJhdGNoZXMiLCJmaWxlT2Zmc2V0Iiwic3RhcnRJbmRleCIsInVwbG9hZENvbXBsZXRlIiwidXBsb2FkS2JGaWxlIiwidXBsb2FkS2JGaWxlcyIsIm9uQmF0Y2hQcm9ncmVzcyIsIm1heEZpbGVzUGVyQmF0Y2giLCJOdW1iZXIiLCJwcm9jZXNzIiwiZW52IiwiTkVYVF9QVUJMSUNfQ1VTVE9NSVpFX0tCX1VQTE9BRF9CQVRDSF9GSUxFUyIsIm1heEJ5dGVzUGVyQmF0Y2giLCJORVhUX1BVQkxJQ19DVVNUT01JWkVfS0JfVVBMT0FEX0JBVENIX0JZVEVTIiwibWF4Q29uY3VycmVudEJhdGNoZXMiLCJNYXRoIiwibWF4IiwibWluIiwiTkVYVF9QVUJMSUNfQ1VTVE9NSVpFX0tCX1VQTE9BRF9DT05DVVJSRU5DWSIsImJhdGNoZXMiLCJjdXJyZW50IiwiY3VycmVudEJ5dGVzIiwiY3VycmVudE9mZnNldCIsIm5leHRPZmZzZXQiLCJsZW5ndGgiLCJzaXplIiwicHVzaCIsIm9mZnNldCIsInJlc3VsdHMiLCJjb21wbGV0ZWRGaWxlcyIsImN1cnNvciIsInVwbG9hZEJhdGNoIiwiYmF0Y2giLCJyZXN1bHQiLCJ1cGxvYWRlZEZpbGVzIiwidG90YWxGaWxlcyIsIndvcmtlcnMiLCJBcnJheSIsImZyb20iLCJQcm9taXNlIiwiYWxsIiwiZmlsdGVyIiwiQm9vbGVhbiIsImF0Iiwic3VjY2VzcyIsImdldEtiVXBsb2FkUHJvZ3Jlc3MiLCJnZXRLYk9wZXJhdGlvbnMiLCJnZXRKb2JzIiwiYWN0aXZlIiwiZ2V0Sm9iIiwiaWQiLCJjbGVhcktiT3BlcmF0aW9ucyIsImRlbGV0ZUtiT3BlcmF0aW9uIiwiZGVsZXRlS2JGaWxlIiwiZGVsZXRlS2JGaWxlcyIsInJlbGF0aXZlUGF0aHMiLCJkZWxldGVLYkZvbGRlcnMiLCJmb2xkZXJQYXRocyIsImRlbGV0ZUtiU2VsZWN0aW9uIiwiZGVsZXRlQWxsS2JGaWxlcyIsInJlaW5kZXhLYiIsImdldFJlaW5kZXhTdGF0dXMiLCJnZXRLYlRhZ3MiLCJnZXRLYklnbm9yZVJ1bGVzIiwic2F2ZUtiSWdub3JlUnVsZXMiLCJydWxlcyIsImdldEtiRHVwbGljYXRlcyIsImdldEtiRmVhdHVyZXMiLCJzZWFyY2hLYiIsInEiLCJ3ZWlnaHRzIiwia2V5d29yZCIsInZlY3RvciIsInJld3JpdGUiLCJoeWJyaWRCb251cyIsImdldFByb21wdFByb2plY3RzIiwiZ2V0RG9jdW1lbnRSb2xlcyIsInR5cGUiLCJzYXZlRG9jdW1lbnRSb2xlIiwicm9sZSIsImRlbGV0ZURvY3VtZW50Um9sZSIsInNhdmVQcm9qZWN0Um9sZUNvbmZpZyIsImNvbmZpZyIsImRlbGV0ZVByb2plY3RSb2xlQ29uZmlnIiwiZ2V0RG9jdW1lbnRUZW1wbGF0ZXMiLCJ2YWxpZGF0ZURvY3VtZW50VGVtcGxhdGUiLCJ0ZW1wbGF0ZUlkIiwic2F2ZURvY3VtZW50VGVtcGxhdGUiLCJ0ZW1wbGF0ZSIsImRlbGV0ZURvY3VtZW50VGVtcGxhdGUiLCJkdXBsaWNhdGVEb2N1bWVudFRlbXBsYXRlIiwiZ2VuZXJhdGVEb2N1bWVudERyYWZ0IiwiaW5wdXQiLCJnZXRHZW5lcmF0ZWREb2N1bWVudHMiLCJnZXRHZW5lcmF0ZWREb2N1bWVudCIsImxpdGUiLCJzaWduYWwiLCJ0b1N0cmluZyIsInVwZGF0ZUdlbmVyYXRlZERvY3VtZW50IiwicGF0Y2giLCJkZWxldGVHZW5lcmF0ZWREb2N1bWVudCIsImFib3J0R2VuZXJhdGVkRG9jdW1lbnQiLCJkb2N1bWVudElkIiwiYWN0aW9uIiwicmVzdW1lR2VuZXJhdGVkRG9jdW1lbnQiLCJnZXRHZW5lcmF0ZWRBc3NldHMiLCJkZWxldGVHZW5lcmF0ZWRBc3NldCIsIm9wZW5HZW5lcmF0ZWRBc3NldCIsInJlZ2VuZXJhdGVEb2N1bWVudENoYXB0ZXIiLCJyZWZpbmVHZW5lcmF0ZWREb2N1bWVudCIsImdldERvY3VtZW50RHJhZnRzIiwic2F2ZURvY3VtZW50RHJhZnQiLCJkcmFmdCIsImV4cG9ydERvY3VtZW50IiwicmVzcG9uc2UiLCJBY2NlcHQiLCJmb3JtYXQiLCJjb250ZW50VHlwZSIsImdldCIsInBhcnNlRXhwb3J0RXJyb3IiLCJpc3N1ZVRleHQiLCJpc3N1ZXMiLCJtYXAiLCJpc3N1ZSIsInNsaWNlIiwiam9pbiIsImluY2x1ZGVzIiwiYmxvYiIsImdldFByb3ZpZGVycyIsInNhdmVQcm92aWRlciIsImNmZyIsImRlbGV0ZVByb3ZpZGVyIiwiZ2V0TW9kZWxzIiwic2F2ZU1vZGVscyIsIm1vZGVscyIsImdldEVtYmVkZGluZ0NvbmZpZyIsInNhdmVFbWJlZGRpbmdDb25maWciLCJlbWJlZGRpbmdIZWFsdGhDaGVjayIsImdldFdlYkFjY2Vzc0NvbmZpZyIsInNhdmVXZWJBY2Nlc3NDb25maWciLCJoZWFsdGhDaGVjayIsInByb3ZpZGVyTmFtZSIsInByb3ZpZGVyIiwiZ2V0SGVhbHRoIiwiZ2V0U3lzdGVtU3RhdHMiLCJnZXRFcnJvckxvZ3MiLCJjbGVhckVycm9yTG9ncyIsImdldEtiQ2F0ZWdvcnlTdGF0cyIsImdldFByb3ZpZGVyRGV0YWlsIl0sImlnbm9yZUxpc3QiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/lib/api.ts\n");
154
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ abortGeneratedDocument: () => (/* binding */ abortGeneratedDocument),\n/* harmony export */ clearErrorLogs: () => (/* binding */ clearErrorLogs),\n/* harmony export */ clearKbOperations: () => (/* binding */ clearKbOperations),\n/* harmony export */ deleteAllKbFiles: () => (/* binding */ deleteAllKbFiles),\n/* harmony export */ deleteDocumentRole: () => (/* binding */ deleteDocumentRole),\n/* harmony export */ deleteDocumentTemplate: () => (/* binding */ deleteDocumentTemplate),\n/* harmony export */ deleteGeneratedAsset: () => (/* binding */ deleteGeneratedAsset),\n/* harmony export */ deleteGeneratedDocument: () => (/* binding */ deleteGeneratedDocument),\n/* harmony export */ deleteKbFile: () => (/* binding */ deleteKbFile),\n/* harmony export */ deleteKbFiles: () => (/* binding */ deleteKbFiles),\n/* harmony export */ deleteKbFolders: () => (/* binding */ deleteKbFolders),\n/* harmony export */ deleteKbOperation: () => (/* binding */ deleteKbOperation),\n/* harmony export */ deleteKbSelection: () => (/* binding */ deleteKbSelection),\n/* harmony export */ deleteProjectRoleConfig: () => (/* binding */ deleteProjectRoleConfig),\n/* harmony export */ deleteProvider: () => (/* binding */ deleteProvider),\n/* harmony export */ duplicateDocumentTemplate: () => (/* binding */ duplicateDocumentTemplate),\n/* harmony export */ embeddingHealthCheck: () => (/* binding */ embeddingHealthCheck),\n/* harmony export */ evaluateKbRetrieval: () => (/* binding */ evaluateKbRetrieval),\n/* harmony export */ exportDocument: () => (/* binding */ exportDocument),\n/* harmony export */ generateDocumentDraft: () => (/* binding */ generateDocumentDraft),\n/* harmony export */ getDocumentDrafts: () => (/* binding */ getDocumentDrafts),\n/* harmony export */ getDocumentRoles: () => (/* binding */ getDocumentRoles),\n/* harmony export */ getDocumentTemplates: () => (/* binding */ getDocumentTemplates),\n/* harmony export */ getEmbeddingConfig: () => (/* binding */ getEmbeddingConfig),\n/* harmony export */ getErrorLogs: () => (/* binding */ getErrorLogs),\n/* harmony export */ getGeneratedAssets: () => (/* binding */ getGeneratedAssets),\n/* harmony export */ getGeneratedDocument: () => (/* binding */ getGeneratedDocument),\n/* harmony export */ getGeneratedDocuments: () => (/* binding */ getGeneratedDocuments),\n/* harmony export */ getHealth: () => (/* binding */ getHealth),\n/* harmony export */ getJob: () => (/* binding */ getJob),\n/* harmony export */ getJobs: () => (/* binding */ getJobs),\n/* harmony export */ getKbCategoryStats: () => (/* binding */ getKbCategoryStats),\n/* harmony export */ getKbDuplicates: () => (/* binding */ getKbDuplicates),\n/* harmony export */ getKbFeatures: () => (/* binding */ getKbFeatures),\n/* harmony export */ getKbFileDetail: () => (/* binding */ getKbFileDetail),\n/* harmony export */ getKbFiles: () => (/* binding */ getKbFiles),\n/* harmony export */ getKbFilesTree: () => (/* binding */ getKbFilesTree),\n/* harmony export */ getKbIgnoreRules: () => (/* binding */ getKbIgnoreRules),\n/* harmony export */ getKbOperations: () => (/* binding */ getKbOperations),\n/* harmony export */ getKbStats: () => (/* binding */ getKbStats),\n/* harmony export */ getKbTags: () => (/* binding */ getKbTags),\n/* harmony export */ getKbUploadProgress: () => (/* binding */ getKbUploadProgress),\n/* harmony export */ getModels: () => (/* binding */ getModels),\n/* harmony export */ getPromptProjects: () => (/* binding */ getPromptProjects),\n/* harmony export */ getProviderDetail: () => (/* binding */ getProviderDetail),\n/* harmony export */ getProviders: () => (/* binding */ getProviders),\n/* harmony export */ getReindexStatus: () => (/* binding */ getReindexStatus),\n/* harmony export */ getSystemStats: () => (/* binding */ getSystemStats),\n/* harmony export */ getWebAccessConfig: () => (/* binding */ getWebAccessConfig),\n/* harmony export */ healthCheck: () => (/* binding */ healthCheck),\n/* harmony export */ openGeneratedAsset: () => (/* binding */ openGeneratedAsset),\n/* harmony export */ openKbFileTarget: () => (/* binding */ openKbFileTarget),\n/* harmony export */ refineGeneratedDocument: () => (/* binding */ refineGeneratedDocument),\n/* harmony export */ regenerateDocumentChapter: () => (/* binding */ regenerateDocumentChapter),\n/* harmony export */ reindexKb: () => (/* binding */ reindexKb),\n/* harmony export */ reindexKbFile: () => (/* binding */ reindexKbFile),\n/* harmony export */ resumeGeneratedDocument: () => (/* binding */ resumeGeneratedDocument),\n/* harmony export */ saveDocumentDraft: () => (/* binding */ saveDocumentDraft),\n/* harmony export */ saveDocumentRole: () => (/* binding */ saveDocumentRole),\n/* harmony export */ saveDocumentTemplate: () => (/* binding */ saveDocumentTemplate),\n/* harmony export */ saveEmbeddingConfig: () => (/* binding */ saveEmbeddingConfig),\n/* harmony export */ saveKbIgnoreRules: () => (/* binding */ saveKbIgnoreRules),\n/* harmony export */ saveModels: () => (/* binding */ saveModels),\n/* harmony export */ saveProjectRoleConfig: () => (/* binding */ saveProjectRoleConfig),\n/* harmony export */ saveProvider: () => (/* binding */ saveProvider),\n/* harmony export */ saveWebAccessConfig: () => (/* binding */ saveWebAccessConfig),\n/* harmony export */ searchKb: () => (/* binding */ searchKb),\n/* harmony export */ searchKbFiles: () => (/* binding */ searchKbFiles),\n/* harmony export */ updateGeneratedDocument: () => (/* binding */ updateGeneratedDocument),\n/* harmony export */ uploadKbFile: () => (/* binding */ uploadKbFile),\n/* harmony export */ uploadKbFiles: () => (/* binding */ uploadKbFiles),\n/* harmony export */ validateDocumentTemplate: () => (/* binding */ validateDocumentTemplate)\n/* harmony export */ });\n/** 封装的 JSON 请求函数,自动将非 2xx 响应解析为错误信息并抛出 */ async function fetchJson(url, options) {\n const res = await fetch(url, options);\n if (!res.ok) {\n const body = await res.text();\n let message = body || `HTTP ${res.status}`;\n try {\n const parsed = JSON.parse(body);\n message = parsed.error || parsed.message || message;\n } catch {\n const htmlError = body.match(/<script id=\"__NEXT_DATA__\" type=\"application\\/json\">([\\s\\S]*?)<\\/script>/u)?.[1];\n if (htmlError) {\n try {\n const nextData = JSON.parse(htmlError.replace(/&quot;/gu, '\"'));\n message = nextData.err?.message || `HTTP ${res.status}`;\n } catch {\n message = `HTTP ${res.status}`;\n }\n }\n }\n throw new Error(message);\n }\n return res.json();\n}\nasync function getKbStats(projectRoot) {\n const p = projectRoot ? `?projectRoot=${encodeURIComponent(projectRoot)}` : '';\n return fetchJson(`/api/kb/stats${p}`);\n}\nasync function getKbFiles(opts) {\n const params = new URLSearchParams();\n if (opts?.projectRoot) params.set('projectRoot', opts.projectRoot);\n if (opts?.category) params.set('category', opts.category);\n if (opts?.page) params.set('page', String(opts.page ?? 1));\n if (opts?.limit) params.set('limit', String(opts.limit ?? 50));\n return fetchJson(`/api/kb/files?${params}`);\n}\nasync function getKbFilesTree(parentPath = '', projectRoot) {\n const params = new URLSearchParams();\n if (projectRoot) params.set('projectRoot', projectRoot);\n if (parentPath) params.set('parentPath', parentPath);\n return fetchJson(`/api/kb/files/tree?${params}`);\n}\nasync function searchKbFiles(opts) {\n const params = new URLSearchParams();\n if (opts?.query) params.set('q', opts.query);\n if (opts?.projectRoot) params.set('projectRoot', opts.projectRoot);\n if (opts?.category) params.set('category', opts.category);\n if (opts?.limit) params.set('limit', String(opts.limit));\n if (opts?.includeContent === false) params.set('includeContent', '0');\n return fetchJson(`/api/kb/files/search?${params}`);\n}\nasync function evaluateKbRetrieval(opts) {\n return fetchJson('/api/kb/evaluate', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(opts)\n });\n}\nasync function getKbFileDetail(relativePath, projectRoot) {\n const params = new URLSearchParams({\n relativePath\n });\n if (projectRoot) params.set('projectRoot', projectRoot);\n return fetchJson(`/api/kb/files/detail?${params}`);\n}\nasync function reindexKbFile(relativePath, projectRoot) {\n return fetchJson('/api/kb/files/reindex', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n relativePath,\n projectRoot\n })\n });\n}\nasync function openKbFileTarget(relativePath, target, projectRoot) {\n return fetchJson('/api/kb/files/open', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n relativePath,\n target,\n projectRoot\n })\n });\n}\nfunction fileRelativePath(file) {\n return file.webkitRelativePath || file.name;\n}\nfunction appendUploadForm(files, opts) {\n const form = new FormData();\n if (opts.projectRoot) form.append('projectRoot', opts.projectRoot);\n if (opts.uploadId) form.append('uploadId', opts.uploadId);\n form.append('batchIndex', String(opts.batchIndex));\n form.append('totalBatches', String(opts.totalBatches));\n form.append('fileOffset', String(opts.fileOffset));\n form.append('startIndex', opts.startIndex ? '1' : '0');\n form.append('uploadComplete', opts.uploadComplete ?? opts.batchIndex === opts.totalBatches - 1 ? '1' : '0');\n for (const file of files){\n form.append('files', file, file.name);\n form.append('relativePaths', fileRelativePath(file));\n }\n return form;\n}\nasync function uploadKbFile(file, projectRoot, uploadId) {\n const params = new URLSearchParams();\n if (uploadId) params.set('uploadId', uploadId);\n params.set('batchIndex', '0');\n params.set('totalBatches', '1');\n return fetchJson(`/api/kb/upload?${params}`, {\n method: 'POST',\n body: appendUploadForm([\n file\n ], {\n projectRoot,\n uploadId,\n batchIndex: 0,\n totalBatches: 1,\n fileOffset: 0,\n startIndex: true\n })\n });\n}\nasync function uploadKbFiles(files, projectRoot, uploadId, onBatchProgress) {\n const maxFilesPerBatch = Number(process.env.NEXT_PUBLIC_CUSTOMIZE_KB_UPLOAD_BATCH_FILES || 500);\n const maxBytesPerBatch = Number(process.env.NEXT_PUBLIC_CUSTOMIZE_KB_UPLOAD_BATCH_BYTES || 128 * 1024 * 1024);\n const maxConcurrentBatches = Math.max(1, Math.min(4, Number(process.env.NEXT_PUBLIC_CUSTOMIZE_KB_UPLOAD_CONCURRENCY || 2)));\n const batches = [];\n let current = [];\n let currentBytes = 0;\n let currentOffset = 0;\n let nextOffset = 0;\n for (const file of files){\n if (current.length > 0 && (current.length >= maxFilesPerBatch || currentBytes + file.size > maxBytesPerBatch)) {\n batches.push({\n files: current,\n offset: currentOffset\n });\n current = [];\n currentBytes = 0;\n currentOffset = nextOffset;\n }\n current.push(file);\n currentBytes += file.size;\n nextOffset += 1;\n }\n if (current.length > 0) batches.push({\n files: current,\n offset: currentOffset\n });\n const results = [];\n let completedFiles = 0;\n let cursor = 0;\n async function uploadBatch(batchIndex) {\n const batch = batches[batchIndex];\n const params = new URLSearchParams({\n batchIndex: String(batchIndex),\n totalBatches: String(batches.length)\n });\n if (uploadId) params.set('uploadId', uploadId);\n const result = await fetchJson(`/api/kb/upload?${params}`, {\n method: 'POST',\n body: appendUploadForm(batch.files, {\n projectRoot,\n uploadId,\n batchIndex,\n totalBatches: batches.length,\n fileOffset: batch.offset,\n startIndex: batchIndex === 0,\n uploadComplete: batches.length === 1\n })\n });\n results[batchIndex] = result;\n completedFiles += batch.files.length;\n onBatchProgress?.({\n uploadedFiles: completedFiles,\n totalFiles: files.length,\n batchIndex,\n totalBatches: batches.length\n });\n }\n const workers = Array.from({\n length: Math.min(maxConcurrentBatches, batches.length)\n }, async ()=>{\n while(cursor < batches.length){\n const batchIndex = cursor++;\n await uploadBatch(batchIndex);\n }\n });\n await Promise.all(workers);\n if (batches.length > 1) {\n const result = await fetchJson(`/api/kb/upload/complete`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n projectRoot,\n uploadId\n })\n });\n results.push(result);\n }\n return results.filter(Boolean).at(-1) ?? {\n success: true\n };\n}\nasync function getKbUploadProgress(uploadId) {\n return fetchJson(`/api/kb/upload/progress?id=${encodeURIComponent(uploadId)}`);\n}\nasync function getKbOperations(projectRoot) {\n const params = new URLSearchParams({\n limit: '50'\n });\n if (projectRoot) params.set('projectRoot', projectRoot);\n return fetchJson(`/api/kb/operations?${params}`);\n}\nasync function getJobs(opts) {\n const params = new URLSearchParams({\n limit: String(opts?.limit ?? 50)\n });\n if (opts?.projectRoot) params.set('projectRoot', opts.projectRoot);\n if (opts?.active) params.set('active', '1');\n return fetchJson(`/api/jobs?${params}`);\n}\nasync function getJob(id, projectRoot) {\n const params = new URLSearchParams();\n if (projectRoot) params.set('projectRoot', projectRoot);\n return fetchJson(`/api/jobs/${encodeURIComponent(id)}?${params}`);\n}\nasync function clearKbOperations(projectRoot) {\n const params = new URLSearchParams();\n if (projectRoot) params.set('projectRoot', projectRoot);\n return fetchJson(`/api/kb/operations?${params}`, {\n method: 'DELETE'\n });\n}\nasync function deleteKbOperation(id, projectRoot) {\n const params = new URLSearchParams({\n id\n });\n if (projectRoot) params.set('projectRoot', projectRoot);\n return fetchJson(`/api/kb/operations?${params}`, {\n method: 'DELETE'\n });\n}\nasync function deleteKbFile(relativePath, projectRoot) {\n return fetchJson('/api/kb/files', {\n method: 'DELETE',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n relativePath,\n projectRoot\n })\n });\n}\nasync function deleteKbFiles(relativePaths, projectRoot) {\n return fetchJson('/api/kb/files', {\n method: 'DELETE',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n relativePaths,\n projectRoot\n })\n });\n}\nasync function deleteKbFolders(folderPaths, projectRoot) {\n return fetchJson('/api/kb/files', {\n method: 'DELETE',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n folderPaths,\n projectRoot\n })\n });\n}\nasync function deleteKbSelection(relativePaths, folderPaths, projectRoot) {\n return fetchJson('/api/kb/files', {\n method: 'DELETE',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n relativePaths,\n folderPaths,\n projectRoot\n })\n });\n}\nasync function deleteAllKbFiles(projectRoot) {\n return fetchJson('/api/kb/files', {\n method: 'DELETE',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n all: true,\n projectRoot\n })\n });\n}\nasync function reindexKb(projectRoot) {\n return fetchJson('/api/kb/reindex', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n projectRoot\n })\n });\n}\nasync function getReindexStatus(projectRoot) {\n const params = new URLSearchParams();\n if (projectRoot) params.set('projectRoot', projectRoot);\n return fetchJson(`/api/kb/reindex?${params}`);\n}\nasync function getKbTags(projectRoot) {\n const p = projectRoot ? `?projectRoot=${encodeURIComponent(projectRoot)}` : '';\n return fetchJson(`/api/kb/tags${p}`);\n}\nasync function getKbIgnoreRules(projectRoot) {\n const p = projectRoot ? `?projectRoot=${encodeURIComponent(projectRoot)}` : '';\n return fetchJson(`/api/kb/ignore${p}`);\n}\nasync function saveKbIgnoreRules(rules, projectRoot) {\n return fetchJson('/api/kb/ignore', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n rules,\n projectRoot\n })\n });\n}\nasync function getKbDuplicates(projectRoot) {\n const p = projectRoot ? `?projectRoot=${encodeURIComponent(projectRoot)}` : '';\n return fetchJson(`/api/kb/duplicates${p}`);\n}\nasync function getKbFeatures() {\n return fetchJson('/api/kb/features');\n}\nasync function searchKb(query, opts) {\n const params = new URLSearchParams({\n q: query\n });\n if (opts?.projectRoot) params.set('projectRoot', opts.projectRoot);\n if (opts?.category) params.set('category', opts.category);\n if (opts?.limit) params.set('limit', String(opts.limit ?? 20));\n if (opts?.weights?.keyword != null) params.set('keywordWeight', String(opts.weights.keyword));\n if (opts?.weights?.vector != null) params.set('vectorWeight', String(opts.weights.vector));\n if (opts?.weights?.rewrite != null) params.set('rewriteWeight', String(opts.weights.rewrite));\n if (opts?.weights?.hybridBonus != null) params.set('hybridBonus', String(opts.weights.hybridBonus));\n return fetchJson(`/api/kb/search?${params}`);\n}\nasync function getPromptProjects() {\n return fetchJson('/api/prompt');\n}\nasync function getDocumentRoles(type) {\n return fetchJson(`/api/documents/roles${type ? `?type=${type}` : ''}`);\n}\nasync function saveDocumentRole(role) {\n return fetchJson('/api/documents/roles', {\n method: 'PUT',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(role)\n });\n}\nasync function deleteDocumentRole(type, id) {\n return fetchJson(`/api/documents/roles?type=${type}&id=${encodeURIComponent(id)}`, {\n method: 'DELETE'\n });\n}\nasync function saveProjectRoleConfig(config) {\n return fetchJson('/api/documents/roles?mode=config', {\n method: 'PUT',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(config)\n });\n}\nasync function deleteProjectRoleConfig(id) {\n return fetchJson(`/api/documents/roles?mode=config&id=${encodeURIComponent(id)}`, {\n method: 'DELETE'\n });\n}\nasync function getDocumentTemplates() {\n return fetchJson('/api/documents/templates');\n}\nasync function validateDocumentTemplate(templateId, projectRoot) {\n const p = projectRoot ? `&projectRoot=${encodeURIComponent(projectRoot)}` : '';\n return fetchJson(`/api/documents/templates?validate=${encodeURIComponent(templateId)}${p}`);\n}\nasync function saveDocumentTemplate(template) {\n return fetchJson('/api/documents/templates', {\n method: 'PUT',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(template)\n });\n}\nasync function deleteDocumentTemplate(templateId) {\n return fetchJson(`/api/documents/templates?templateId=${encodeURIComponent(templateId)}`, {\n method: 'DELETE'\n });\n}\nasync function duplicateDocumentTemplate(templateId) {\n return fetchJson('/api/documents/templates', {\n method: 'PATCH',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n templateId\n })\n });\n}\nasync function generateDocumentDraft(input) {\n return fetchJson('/api/documents/generate', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(input)\n });\n}\nasync function getGeneratedDocuments(projectRoot) {\n const p = projectRoot ? `?projectRoot=${encodeURIComponent(projectRoot)}` : '';\n return fetchJson(`/api/documents/generated${p}`);\n}\nasync function getGeneratedDocument(id, lite = false, projectRoot, signal) {\n const params = new URLSearchParams();\n if (lite) params.set('lite', '1');\n if (projectRoot) params.set('projectRoot', projectRoot);\n const query = params.toString() ? `?${params.toString()}` : '';\n return fetchJson(`/api/documents/generated/${encodeURIComponent(id)}${query}`, {\n signal\n });\n}\nasync function updateGeneratedDocument(id, patch, projectRoot) {\n const p = projectRoot ? `?projectRoot=${encodeURIComponent(projectRoot)}` : '';\n return fetchJson(`/api/documents/generated/${encodeURIComponent(id)}${p}`, {\n method: 'PUT',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(patch)\n });\n}\nasync function deleteGeneratedDocument(id, projectRoot) {\n const p = projectRoot ? `?projectRoot=${encodeURIComponent(projectRoot)}` : '';\n return fetchJson(`/api/documents/generated/${encodeURIComponent(id)}${p}`, {\n method: 'DELETE'\n });\n}\nasync function abortGeneratedDocument(documentId, projectRoot) {\n return fetchJson('/api/documents/generated', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n action: 'abort',\n documentId,\n projectRoot\n })\n });\n}\nasync function resumeGeneratedDocument(documentId, projectRoot) {\n return fetchJson('/api/documents/generated', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n action: 'resume',\n documentId,\n projectRoot\n })\n });\n}\nasync function getGeneratedAssets(projectRoot) {\n const p = projectRoot ? `?projectRoot=${encodeURIComponent(projectRoot)}` : '';\n return fetchJson(`/api/assets/generated${p}`);\n}\nasync function deleteGeneratedAsset(id, projectRoot) {\n const p = projectRoot ? `&projectRoot=${encodeURIComponent(projectRoot)}` : '';\n return fetchJson(`/api/assets/generated?id=${encodeURIComponent(id)}${p}`, {\n method: 'DELETE'\n });\n}\nasync function openGeneratedAsset(id, target, projectRoot) {\n return fetchJson('/api/assets/generated', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n id,\n action: 'open',\n target,\n projectRoot\n })\n });\n}\nasync function regenerateDocumentChapter(input) {\n return fetchJson('/api/documents/chapter/regenerate', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(input)\n });\n}\nasync function refineGeneratedDocument(input) {\n return fetchJson('/api/documents/refine', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(input)\n });\n}\nasync function getDocumentDrafts() {\n return fetchJson('/api/documents/drafts');\n}\nasync function saveDocumentDraft(draft, id) {\n return fetchJson('/api/documents/drafts', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n draft,\n id\n })\n });\n}\nasync function exportDocument(input) {\n const response = await fetch('/api/documents/export', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Accept: input.format === 'pdf' ? 'application/pdf' : '*/*'\n },\n body: JSON.stringify(input)\n });\n const contentType = response.headers.get('content-type') || '';\n const parseExportError = async ()=>{\n const text = await response.text();\n let message = text || '导出失败';\n try {\n const parsed = JSON.parse(text);\n const issueText = parsed.issues?.map((issue)=>issue.message).filter(Boolean).slice(0, 3).join(';');\n message = issueText ? `${parsed.error || '导出失败'}:${issueText}` : parsed.message || parsed.error || message;\n } catch {\n // 保留原始响应文本\n }\n throw new Error(message.length > 300 ? `${message.slice(0, 300)}...` : message);\n };\n if (!response.ok) await parseExportError();\n if (input.format === 'pdf' && !contentType.includes('application/pdf')) await parseExportError();\n if (input.format === 'docx' && !contentType.includes('officedocument.wordprocessingml.document')) await parseExportError();\n return response.blob();\n}\nasync function getProviders() {\n return fetchJson('/api/config/providers');\n}\nasync function saveProvider(name, cfg) {\n return fetchJson('/api/config/providers', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n name,\n ...cfg\n })\n });\n}\nasync function deleteProvider(name) {\n return fetchJson(`/api/config/providers/${encodeURIComponent(name)}`, {\n method: 'DELETE'\n });\n}\nasync function getModels() {\n return fetchJson('/api/config/models');\n}\nasync function saveModels(models) {\n return fetchJson('/api/config/models', {\n method: 'PUT',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(models)\n });\n}\nasync function getEmbeddingConfig() {\n return fetchJson('/api/config/embedding');\n}\nasync function saveEmbeddingConfig(config) {\n return fetchJson('/api/config/embedding', {\n method: 'PUT',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(config)\n });\n}\nasync function embeddingHealthCheck() {\n return fetchJson('/api/config/embedding/healthCheck', {\n method: 'POST'\n });\n}\nasync function getWebAccessConfig() {\n return fetchJson('/api/config/web-access');\n}\nasync function saveWebAccessConfig(config) {\n return fetchJson('/api/config/web-access', {\n method: 'PUT',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(config)\n });\n}\nasync function healthCheck(providerName) {\n return fetchJson('/api/config/healthCheck', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n provider: providerName\n })\n });\n}\nasync function getHealth() {\n return fetchJson('/api/health');\n}\nasync function getSystemStats() {\n return fetchJson('/api/system/stats');\n}\nasync function getErrorLogs(limit = 200) {\n return fetchJson(`/api/system/logs?limit=${limit}`);\n}\nasync function clearErrorLogs() {\n return fetchJson('/api/system/logs', {\n method: 'DELETE'\n });\n}\nasync function getKbCategoryStats(projectRoot) {\n const p = projectRoot ? `?projectRoot=${encodeURIComponent(projectRoot)}` : '';\n return fetchJson(`/api/kb/categories${p}`);\n}\n// ═══════ 供应商详情 ═══════\nasync function getProviderDetail(name) {\n return fetchJson(`/api/config/providers/${encodeURIComponent(name)}`);\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUFFK0osVUFBVUQ7UUFBYTtJQUFHO0FBQ2pQO0FBQ08sZUFBZUU7SUFBYyxPQUFPMU0sVUFBOEM7QUFBZ0I7QUFhbEcsZUFBZTJNO0lBQW1CLE9BQU8zTSxVQUF1QjtBQUFzQjtBQWN0RixlQUFlNE0sYUFBYTNLLFFBQVEsR0FBRztJQUFJLE9BQU9qQyxVQUFxQyxDQUFDLHVCQUF1QixFQUFFaUMsT0FBTztBQUFHO0FBQzNILGVBQWU0SztJQUFtQixPQUFPN00sVUFBd0Isb0JBQW9CO1FBQUV3QyxRQUFRO0lBQVM7QUFBSTtBQVU1RyxlQUFlc0ssbUJBQW1CeEwsV0FBb0I7SUFDM0QsTUFBTUMsSUFBSUQsY0FBYyxDQUFDLGFBQWEsRUFBRUUsbUJBQW1CRixjQUFjLEdBQUc7SUFDNUUsT0FBT3RCLFVBQTZCLENBQUMsa0JBQWtCLEVBQUV1QixHQUFHO0FBQzlEO0FBRUEsd0JBQXdCO0FBQ2pCLGVBQWV3TCxrQkFBa0I1SixJQUFZO0lBQ2xELE9BQU9uRCxVQUF3QixDQUFDLHNCQUFzQixFQUFFd0IsbUJBQW1CMkIsT0FBTztBQUNwRiIsInNvdXJjZXMiOlsiL1VzZXJzL3Bhbi9EZXNrdG9wL2NvZGVpbmcvY3VzdG9taXplLWFnZW50L2FwcHMvc2VydmVyL3NyYy9saWIvYXBpLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKiDlsIHoo4XnmoQgSlNPTiDor7fmsYLlh73mlbDvvIzoh6rliqjlsIbpnZ4gMnh4IOWTjeW6lOino+aekOS4uumUmeivr+S/oeaBr+W5tuaKm+WHuiAqL1xuYXN5bmMgZnVuY3Rpb24gZmV0Y2hKc29uPFQ+KHVybDogc3RyaW5nLCBvcHRpb25zPzogUmVxdWVzdEluaXQpOiBQcm9taXNlPFQ+IHtcbiAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2godXJsLCBvcHRpb25zKTtcbiAgaWYgKCFyZXMub2spIHtcbiAgICBjb25zdCBib2R5ID0gYXdhaXQgcmVzLnRleHQoKTtcbiAgICBsZXQgbWVzc2FnZSA9IGJvZHkgfHwgYEhUVFAgJHtyZXMuc3RhdHVzfWA7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2UoYm9keSkgYXMgeyBlcnJvcj86IHN0cmluZzsgbWVzc2FnZT86IHN0cmluZyB9O1xuICAgICAgbWVzc2FnZSA9IHBhcnNlZC5lcnJvciB8fCBwYXJzZWQubWVzc2FnZSB8fCBtZXNzYWdlO1xuICAgIH0gY2F0Y2gge1xuICAgICAgY29uc3QgaHRtbEVycm9yID0gYm9keS5tYXRjaCgvPHNjcmlwdCBpZD1cIl9fTkVYVF9EQVRBX19cIiB0eXBlPVwiYXBwbGljYXRpb25cXC9qc29uXCI+KFtcXHNcXFNdKj8pPFxcL3NjcmlwdD4vdSk/LlsxXTtcbiAgICAgIGlmIChodG1sRXJyb3IpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBuZXh0RGF0YSA9IEpTT04ucGFyc2UoaHRtbEVycm9yLnJlcGxhY2UoLyZxdW90Oy9ndSwgJ1wiJykpIGFzIHsgZXJyPzogeyBtZXNzYWdlPzogc3RyaW5nOyBzdGF0dXNDb2RlPzogbnVtYmVyIH0gfTtcbiAgICAgICAgICBtZXNzYWdlID0gbmV4dERhdGEuZXJyPy5tZXNzYWdlIHx8IGBIVFRQICR7cmVzLnN0YXR1c31gO1xuICAgICAgICB9IGNhdGNoIHsgbWVzc2FnZSA9IGBIVFRQICR7cmVzLnN0YXR1c31gOyB9XG4gICAgICB9XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgfVxuICByZXR1cm4gcmVzLmpzb24oKTtcbn1cblxuLy8g4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQIOefpeivhuW6kyDilZDilZDilZDilZDilZDilZDilZBcblxuZXhwb3J0IGludGVyZmFjZSBLYlZlY3RvclN0YXR1cyB7IHN0YXR1czogc3RyaW5nOyBlcnJvcj86IHN0cmluZzsgaW5kZXhlZENodW5rczogbnVtYmVyOyBsYXN0SW5kZXhlZEF0OiBudW1iZXI7IGJhY2tlbmQ6IHN0cmluZzsgfVxuZXhwb3J0IGludGVyZmFjZSBLYlN0YXRzIHsgc2NvcGU6IHN0cmluZzsgcHJvamVjdElkPzogc3RyaW5nOyBmaWxlQ291bnQ6IG51bWJlcjsgY2h1bmtDb3VudDogbnVtYmVyOyB0b3RhbFNpemVCeXRlczogbnVtYmVyOyBsYXN0SW5kZXhlZEF0OiBudW1iZXI7IHZlY3RvclN0YXR1cz86IEtiVmVjdG9yU3RhdHVzOyB9XG5leHBvcnQgaW50ZXJmYWNlIEtiRmlsZUl0ZW0geyByZWxhdGl2ZVBhdGg6IHN0cmluZzsgY2F0ZWdvcnk6IHN0cmluZzsgZm9ybWF0OiBzdHJpbmc7IGZpbGVTaXplOiBudW1iZXI7IG10aW1lOiBudW1iZXI7IGNodW5rQ291bnQ6IG51bWJlcjsgaW5kZXhlZEF0OiBudW1iZXI7IHN0YXR1czogc3RyaW5nOyBlcnJvck1lc3NhZ2U/OiBzdHJpbmc7IG1ldGFkYXRhSnNvbj86IHN0cmluZzsgbWF0Y2hlZEJ5PzogJ3BhdGgnIHwgJ21ldGFkYXRhJyB8ICdjb250ZW50JyB8ICdkaXNrJzsgc2NvcmU/OiBudW1iZXI7IH1cbmV4cG9ydCBpbnRlcmZhY2UgS2JGZWF0dXJlcyB7IHZlY3RvclN0b3JlOiBzdHJpbmc7IGVtYmVkZGluZ1Byb3ZpZGVyOiBzdHJpbmc7IGJ1aWx0aW5FeHRyYWN0b3JzOiBzdHJpbmdbXTsgZGVkdXBFbmdpbmU6IHN0cmluZzsgY2h1bmtlcjogc3RyaW5nOyB9XG5leHBvcnQgaW50ZXJmYWNlIEtiVXBsb2FkUHJvZ3Jlc3MgeyBpZDogc3RyaW5nOyBzdGFnZTogc3RyaW5nOyBwZXJjZW50OiBudW1iZXI7IG1lc3NhZ2U6IHN0cmluZzsgZmlsZU5hbWU/OiBzdHJpbmc7IGNodW5rQ291bnQ/OiBudW1iZXI7IHZlY3RvclN0YXR1cz86IEtiVmVjdG9yU3RhdHVzOyBlcnJvcj86IHN0cmluZzsgdXBkYXRlZEF0OiBudW1iZXI7IH1cbmV4cG9ydCBpbnRlcmZhY2UgS2JPcGVyYXRpb25SZWNvcmQgeyBpZDogc3RyaW5nOyB0eXBlOiAndXBsb2FkJyB8ICdkZWxldGUnIHwgJ3JlaW5kZXgnIHwgJ2RvY3VtZW50Jzsgc3RhZ2U6IHN0cmluZzsgc3RhdHVzOiAncHJvY2Vzc2luZycgfCAnc3VjY2VzcycgfCAnd2FybmluZycgfCAnZXJyb3InOyB0aXRsZTogc3RyaW5nOyBtZXNzYWdlOiBzdHJpbmc7IHBlcmNlbnQ6IG51bWJlcjsgZmlsZU5hbWU/OiBzdHJpbmc7IGZpbGVQYXRoPzogc3RyaW5nOyBjaHVua0NvdW50PzogbnVtYmVyOyB0ZXh0TGVuZ3RoPzogbnVtYmVyOyBleHRyYWN0aW9uTW9kZT86IHN0cmluZzsgZXJyb3I/OiBzdHJpbmc7IGRldGFpbHM/OiBzdHJpbmdbXTsgY3JlYXRlZEF0OiBudW1iZXI7IHVwZGF0ZWRBdDogbnVtYmVyOyB9XG5leHBvcnQgaW50ZXJmYWNlIEtiU3RvcmVkQ2h1bmsgeyBpZDogc3RyaW5nOyByZWxhdGl2ZVBhdGg6IHN0cmluZzsgY2h1bmtJbmRleDogbnVtYmVyOyBjb250ZW50OiBzdHJpbmc7IGNhdGVnb3J5OiBzdHJpbmc7IGZvcm1hdDogc3RyaW5nOyB0b2tlbkNvdW50OiBudW1iZXI7IHNlY3Rpb25UaXRsZT86IHN0cmluZzsgbWV0YWRhdGFKc29uPzogc3RyaW5nOyBjcmVhdGVkQXQ6IG51bWJlcjsgfVxuZXhwb3J0IGludGVyZmFjZSBLYlBhcmVudENodW5rIHsgaWQ6IHN0cmluZzsgcmVsYXRpdmVQYXRoOiBzdHJpbmc7IHBhcmVudElkOiBzdHJpbmc7IGNvbnRlbnQ6IHN0cmluZzsgY2F0ZWdvcnk6IHN0cmluZzsgZm9ybWF0OiBzdHJpbmc7IHNlY3Rpb25UaXRsZT86IHN0cmluZzsgY2h1bmtDb3VudDogbnVtYmVyOyBtZXRhZGF0YUpzb24/OiBzdHJpbmc7IGNyZWF0ZWRBdDogbnVtYmVyOyB9XG5leHBvcnQgaW50ZXJmYWNlIEtiRmlsZURldGFpbCB7IGZpbGU6IEtiRmlsZUl0ZW07IGFic29sdXRlUGF0aD86IHN0cmluZzsgZGlyZWN0b3J5Pzogc3RyaW5nOyBjaHVua3M6IEtiU3RvcmVkQ2h1bmtbXTsgcGFyZW50czogS2JQYXJlbnRDaHVua1tdOyByZWxhdGlvbnNoaXBzOiB1bmtub3duW107IHRhZ3M6IEFycmF5PHsgZmlsZVBhdGg6IHN0cmluZzsgdGFnOiBzdHJpbmc7IGNyZWF0ZWRBdDogbnVtYmVyIH0+OyB9XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRLYlN0YXRzKHByb2plY3RSb290Pzogc3RyaW5nKSB7XG4gIGNvbnN0IHAgPSBwcm9qZWN0Um9vdCA/IGA/cHJvamVjdFJvb3Q9JHtlbmNvZGVVUklDb21wb25lbnQocHJvamVjdFJvb3QpfWAgOiAnJztcbiAgcmV0dXJuIGZldGNoSnNvbjxLYlN0YXRzPihgL2FwaS9rYi9zdGF0cyR7cH1gKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEtiRmlsZXMob3B0cz86IHsgcHJvamVjdFJvb3Q/OiBzdHJpbmc7IGNhdGVnb3J5Pzogc3RyaW5nOyBwYWdlPzogbnVtYmVyOyBsaW1pdD86IG51bWJlciB9KSB7XG4gIGNvbnN0IHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoKTtcbiAgaWYgKG9wdHM/LnByb2plY3RSb290KSBwYXJhbXMuc2V0KCdwcm9qZWN0Um9vdCcsIG9wdHMucHJvamVjdFJvb3QpO1xuICBpZiAob3B0cz8uY2F0ZWdvcnkpIHBhcmFtcy5zZXQoJ2NhdGVnb3J5Jywgb3B0cy5jYXRlZ29yeSk7XG4gIGlmIChvcHRzPy5wYWdlKSBwYXJhbXMuc2V0KCdwYWdlJywgU3RyaW5nKG9wdHMucGFnZSA/PyAxKSk7XG4gIGlmIChvcHRzPy5saW1pdCkgcGFyYW1zLnNldCgnbGltaXQnLCBTdHJpbmcob3B0cy5saW1pdCA/PyA1MCkpO1xuICByZXR1cm4gZmV0Y2hKc29uPHsgZmlsZXM6IEtiRmlsZUl0ZW1bXTsgdG90YWw6IG51bWJlcjsgdmVjdG9yU3RhdHVzPzogS2JWZWN0b3JTdGF0dXM7IGluaXRpYWxpemluZz86IGJvb2xlYW4gfT4oYC9hcGkva2IvZmlsZXM/JHtwYXJhbXN9YCk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRLYkZpbGVzVHJlZShwYXJlbnRQYXRoOiBzdHJpbmcgPSAnJywgcHJvamVjdFJvb3Q/OiBzdHJpbmcpIHtcbiAgY29uc3QgcGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcygpO1xuICBpZiAocHJvamVjdFJvb3QpIHBhcmFtcy5zZXQoJ3Byb2plY3RSb290JywgcHJvamVjdFJvb3QpO1xuICBpZiAocGFyZW50UGF0aCkgcGFyYW1zLnNldCgncGFyZW50UGF0aCcsIHBhcmVudFBhdGgpO1xuICByZXR1cm4gZmV0Y2hKc29uPHsgbm9kZXM6IEFycmF5PHsga2V5OiBzdHJpbmc7IHRpdGxlOiBzdHJpbmc7IGlzRm9sZGVyOiBib29sZWFuOyBpc0xlYWY6IGJvb2xlYW47IGZpbGVDb3VudD86IG51bWJlciB9PiB9PihgL2FwaS9rYi9maWxlcy90cmVlPyR7cGFyYW1zfWApO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2VhcmNoS2JGaWxlcyhvcHRzPzogeyBxdWVyeT86IHN0cmluZzsgcHJvamVjdFJvb3Q/OiBzdHJpbmc7IGNhdGVnb3J5Pzogc3RyaW5nOyBsaW1pdD86IG51bWJlcjsgaW5jbHVkZUNvbnRlbnQ/OiBib29sZWFuIH0pIHtcbiAgY29uc3QgcGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcygpO1xuICBpZiAob3B0cz8ucXVlcnkpIHBhcmFtcy5zZXQoJ3EnLCBvcHRzLnF1ZXJ5KTtcbiAgaWYgKG9wdHM/LnByb2plY3RSb290KSBwYXJhbXMuc2V0KCdwcm9qZWN0Um9vdCcsIG9wdHMucHJvamVjdFJvb3QpO1xuICBpZiAob3B0cz8uY2F0ZWdvcnkpIHBhcmFtcy5zZXQoJ2NhdGVnb3J5Jywgb3B0cy5jYXRlZ29yeSk7XG4gIGlmIChvcHRzPy5saW1pdCkgcGFyYW1zLnNldCgnbGltaXQnLCBTdHJpbmcob3B0cy5saW1pdCkpO1xuICBpZiAob3B0cz8uaW5jbHVkZUNvbnRlbnQgPT09IGZhbHNlKSBwYXJhbXMuc2V0KCdpbmNsdWRlQ29udGVudCcsICcwJyk7XG4gIHJldHVybiBmZXRjaEpzb248eyBmaWxlczogS2JGaWxlSXRlbVtdOyB0b3RhbDogbnVtYmVyIH0+KGAvYXBpL2tiL2ZpbGVzL3NlYXJjaD8ke3BhcmFtc31gKTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBLYlJldHJpZXZhbEV2YWxDYXNlIHsgaWQ/OiBzdHJpbmc7IHF1ZXJ5OiBzdHJpbmc7IHJlbGV2YW50RmlsZXM/OiBzdHJpbmdbXTsgcmVsZXZhbnRTbmlwcGV0cz86IHN0cmluZ1tdOyBleHBlY3RlZFRlcm1zPzogc3RyaW5nW107IGZpbGVQYXRocz86IHN0cmluZ1tdOyBmaWxlUGF0aFByZWZpeGVzPzogc3RyaW5nW107IHRvcEs/OiBudW1iZXI7IH1cbmV4cG9ydCBpbnRlcmZhY2UgS2JSZXRyaWV2YWxFdmFsUmVwb3J0IHsgdG90YWxDYXNlczogbnVtYmVyOyB2YWxpZENhc2VzOiBudW1iZXI7IGludmFsaWRDYXNlczogbnVtYmVyOyB0b3BLOiBudW1iZXI7IHJlY2FsbEF0SzogbnVtYmVyOyBwcmVjaXNpb25BdEs6IG51bWJlcjsgbXJyOiBudW1iZXI7IG5kY2dBdEs6IG51bWJlcjsgcGFzczk1OiBib29sZWFuOyBjYXNlczogdW5rbm93bltdOyBpbnZhbGlkOiBBcnJheTx7IGlkOiBzdHJpbmc7IHF1ZXJ5OiBzdHJpbmc7IHJlYXNvbjogc3RyaW5nIH0+OyB9XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBldmFsdWF0ZUtiUmV0cmlldmFsKG9wdHM6IHsgcHJvamVjdFJvb3Q/OiBzdHJpbmc7IGNhc2VzPzogS2JSZXRyaWV2YWxFdmFsQ2FzZVtdOyB0b3BLPzogbnVtYmVyOyBnZW5lcmF0aW9uTW9kZT86IGJvb2xlYW47IGZpbGVQYXRocz86IHN0cmluZ1tdOyBmaWxlUGF0aFByZWZpeGVzPzogc3RyaW5nW107IGF1dG9HZW5lcmF0ZT86IGJvb2xlYW47IGxpbWl0PzogbnVtYmVyOyBwZXJGaWxlTGltaXQ/OiBudW1iZXI7IGZpbGVMYXllcj86ICdhbGwnIHwgJ2RvY3VtZW50JyB8ICdjYWQnOyBpbmNsdWRlRXh0ZW5zaW9ucz86IHN0cmluZ1tdOyBleGNsdWRlRXh0ZW5zaW9ucz86IHN0cmluZ1tdOyBjb21wYWN0PzogYm9vbGVhbjsgZGlzYWJsZVJlcmFua2VyPzogYm9vbGVhbiB9KSB7XG4gIHJldHVybiBmZXRjaEpzb248S2JSZXRyaWV2YWxFdmFsUmVwb3J0PignL2FwaS9rYi9ldmFsdWF0ZScsIHtcbiAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICBib2R5OiBKU09OLnN0cmluZ2lmeShvcHRzKSxcbiAgfSk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRLYkZpbGVEZXRhaWwocmVsYXRpdmVQYXRoOiBzdHJpbmcsIHByb2plY3RSb290Pzogc3RyaW5nKSB7XG4gIGNvbnN0IHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoeyByZWxhdGl2ZVBhdGggfSk7XG4gIGlmIChwcm9qZWN0Um9vdCkgcGFyYW1zLnNldCgncHJvamVjdFJvb3QnLCBwcm9qZWN0Um9vdCk7XG4gIHJldHVybiBmZXRjaEpzb248S2JGaWxlRGV0YWlsPihgL2FwaS9rYi9maWxlcy9kZXRhaWw/JHtwYXJhbXN9YCk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWluZGV4S2JGaWxlKHJlbGF0aXZlUGF0aDogc3RyaW5nLCBwcm9qZWN0Um9vdD86IHN0cmluZykge1xuICByZXR1cm4gZmV0Y2hKc29uPHsgc3VjY2VzczogYm9vbGVhbjsgYWNjZXB0ZWQ/OiBib29sZWFuOyBhbHJlYWR5UnVubmluZz86IGJvb2xlYW47IG9wZXJhdGlvbklkPzogc3RyaW5nOyBqb2I/OiBLYk9wZXJhdGlvblJlY29yZDsgZGV0YWlsPzogS2JGaWxlRGV0YWlsOyBmaWxlQ291bnQ/OiBudW1iZXIgfT4oJy9hcGkva2IvZmlsZXMvcmVpbmRleCcsIHtcbiAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IHJlbGF0aXZlUGF0aCwgcHJvamVjdFJvb3QgfSksXG4gIH0pO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gb3BlbktiRmlsZVRhcmdldChyZWxhdGl2ZVBhdGg6IHN0cmluZywgdGFyZ2V0OiAnZmlsZScgfCAnZGlyZWN0b3J5JywgcHJvamVjdFJvb3Q/OiBzdHJpbmcpIHtcbiAgcmV0dXJuIGZldGNoSnNvbjx7IHN1Y2Nlc3M6IGJvb2xlYW4gfT4oJy9hcGkva2IvZmlsZXMvb3BlbicsIHtcbiAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IHJlbGF0aXZlUGF0aCwgdGFyZ2V0LCBwcm9qZWN0Um9vdCB9KSxcbiAgfSk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgS2JVcGxvYWRCYXRjaFJlc3VsdCB7IHN1Y2Nlc3M6IGJvb2xlYW47IGFjY2VwdGVkPzogYm9vbGVhbjsgb3BlcmF0aW9uSWQ/OiBzdHJpbmc7IHJlbGF0aXZlUGF0aD86IHN0cmluZzsgam9icz86IEFycmF5PHsgaWQ6IHN0cmluZzsgcmVsYXRpdmVQYXRoOiBzdHJpbmc7IHN0YXR1czogc3RyaW5nIH0+OyBiYXRjaEluZGV4PzogbnVtYmVyOyB0b3RhbEJhdGNoZXM/OiBudW1iZXI7IGluZGV4aW5nU3RhcnRlZD86IGJvb2xlYW47IH1cblxuZnVuY3Rpb24gZmlsZVJlbGF0aXZlUGF0aChmaWxlOiBGaWxlKSB7XG4gIHJldHVybiAoZmlsZSBhcyBGaWxlICYgeyB3ZWJraXRSZWxhdGl2ZVBhdGg/OiBzdHJpbmcgfSkud2Via2l0UmVsYXRpdmVQYXRoIHx8IGZpbGUubmFtZTtcbn1cblxuZnVuY3Rpb24gYXBwZW5kVXBsb2FkRm9ybShmaWxlczogRmlsZVtdLCBvcHRzOiB7IHByb2plY3RSb290Pzogc3RyaW5nOyB1cGxvYWRJZD86IHN0cmluZzsgYmF0Y2hJbmRleDogbnVtYmVyOyB0b3RhbEJhdGNoZXM6IG51bWJlcjsgZmlsZU9mZnNldDogbnVtYmVyOyBzdGFydEluZGV4OiBib29sZWFuOyB1cGxvYWRDb21wbGV0ZT86IGJvb2xlYW4gfSkge1xuICBjb25zdCBmb3JtID0gbmV3IEZvcm1EYXRhKCk7XG4gIGlmIChvcHRzLnByb2plY3RSb290KSBmb3JtLmFwcGVuZCgncHJvamVjdFJvb3QnLCBvcHRzLnByb2plY3RSb290KTtcbiAgaWYgKG9wdHMudXBsb2FkSWQpIGZvcm0uYXBwZW5kKCd1cGxvYWRJZCcsIG9wdHMudXBsb2FkSWQpO1xuICBmb3JtLmFwcGVuZCgnYmF0Y2hJbmRleCcsIFN0cmluZyhvcHRzLmJhdGNoSW5kZXgpKTtcbiAgZm9ybS5hcHBlbmQoJ3RvdGFsQmF0Y2hlcycsIFN0cmluZyhvcHRzLnRvdGFsQmF0Y2hlcykpO1xuICBmb3JtLmFwcGVuZCgnZmlsZU9mZnNldCcsIFN0cmluZyhvcHRzLmZpbGVPZmZzZXQpKTtcbiAgZm9ybS5hcHBlbmQoJ3N0YXJ0SW5kZXgnLCBvcHRzLnN0YXJ0SW5kZXggPyAnMScgOiAnMCcpO1xuICBmb3JtLmFwcGVuZCgndXBsb2FkQ29tcGxldGUnLCAob3B0cy51cGxvYWRDb21wbGV0ZSA/PyBvcHRzLmJhdGNoSW5kZXggPT09IG9wdHMudG90YWxCYXRjaGVzIC0gMSkgPyAnMScgOiAnMCcpO1xuICBmb3IgKGNvbnN0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICBmb3JtLmFwcGVuZCgnZmlsZXMnLCBmaWxlLCBmaWxlLm5hbWUpO1xuICAgIGZvcm0uYXBwZW5kKCdyZWxhdGl2ZVBhdGhzJywgZmlsZVJlbGF0aXZlUGF0aChmaWxlKSk7XG4gIH1cbiAgcmV0dXJuIGZvcm07XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB1cGxvYWRLYkZpbGUoZmlsZTogRmlsZSwgcHJvamVjdFJvb3Q/OiBzdHJpbmcsIHVwbG9hZElkPzogc3RyaW5nKSB7XG4gIGNvbnN0IHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoKTtcbiAgaWYgKHVwbG9hZElkKSBwYXJhbXMuc2V0KCd1cGxvYWRJZCcsIHVwbG9hZElkKTtcbiAgcGFyYW1zLnNldCgnYmF0Y2hJbmRleCcsICcwJyk7XG4gIHBhcmFtcy5zZXQoJ3RvdGFsQmF0Y2hlcycsICcxJyk7XG4gIHJldHVybiBmZXRjaEpzb248S2JVcGxvYWRCYXRjaFJlc3VsdD4oYC9hcGkva2IvdXBsb2FkPyR7cGFyYW1zfWAsIHtcbiAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICBib2R5OiBhcHBlbmRVcGxvYWRGb3JtKFtmaWxlXSwgeyBwcm9qZWN0Um9vdCwgdXBsb2FkSWQsIGJhdGNoSW5kZXg6IDAsIHRvdGFsQmF0Y2hlczogMSwgZmlsZU9mZnNldDogMCwgc3RhcnRJbmRleDogdHJ1ZSB9KSxcbiAgfSk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB1cGxvYWRLYkZpbGVzKGZpbGVzOiBGaWxlW10sIHByb2plY3RSb290Pzogc3RyaW5nLCB1cGxvYWRJZD86IHN0cmluZywgb25CYXRjaFByb2dyZXNzPzogKHByb2dyZXNzOiB7IHVwbG9hZGVkRmlsZXM6IG51bWJlcjsgdG90YWxGaWxlczogbnVtYmVyOyBiYXRjaEluZGV4OiBudW1iZXI7IHRvdGFsQmF0Y2hlczogbnVtYmVyIH0pID0+IHZvaWQpIHtcbiAgY29uc3QgbWF4RmlsZXNQZXJCYXRjaCA9IE51bWJlcihwcm9jZXNzLmVudi5ORVhUX1BVQkxJQ19DVVNUT01JWkVfS0JfVVBMT0FEX0JBVENIX0ZJTEVTIHx8IDUwMCk7XG4gIGNvbnN0IG1heEJ5dGVzUGVyQmF0Y2ggPSBOdW1iZXIocHJvY2Vzcy5lbnYuTkVYVF9QVUJMSUNfQ1VTVE9NSVpFX0tCX1VQTE9BRF9CQVRDSF9CWVRFUyB8fCAxMjggKiAxMDI0ICogMTAyNCk7XG4gIGNvbnN0IG1heENvbmN1cnJlbnRCYXRjaGVzID0gTWF0aC5tYXgoMSwgTWF0aC5taW4oNCwgTnVtYmVyKHByb2Nlc3MuZW52Lk5FWFRfUFVCTElDX0NVU1RPTUlaRV9LQl9VUExPQURfQ09OQ1VSUkVOQ1kgfHwgMikpKTtcbiAgY29uc3QgYmF0Y2hlczogQXJyYXk8eyBmaWxlczogRmlsZVtdOyBvZmZzZXQ6IG51bWJlciB9PiA9IFtdO1xuICBsZXQgY3VycmVudDogRmlsZVtdID0gW107XG4gIGxldCBjdXJyZW50Qnl0ZXMgPSAwO1xuICBsZXQgY3VycmVudE9mZnNldCA9IDA7XG4gIGxldCBuZXh0T2Zmc2V0ID0gMDtcbiAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgaWYgKGN1cnJlbnQubGVuZ3RoID4gMCAmJiAoY3VycmVudC5sZW5ndGggPj0gbWF4RmlsZXNQZXJCYXRjaCB8fCBjdXJyZW50Qnl0ZXMgKyBmaWxlLnNpemUgPiBtYXhCeXRlc1BlckJhdGNoKSkge1xuICAgICAgYmF0Y2hlcy5wdXNoKHsgZmlsZXM6IGN1cnJlbnQsIG9mZnNldDogY3VycmVudE9mZnNldCB9KTtcbiAgICAgIGN1cnJlbnQgPSBbXTtcbiAgICAgIGN1cnJlbnRCeXRlcyA9IDA7XG4gICAgICBjdXJyZW50T2Zmc2V0ID0gbmV4dE9mZnNldDtcbiAgICB9XG4gICAgY3VycmVudC5wdXNoKGZpbGUpO1xuICAgIGN1cnJlbnRCeXRlcyArPSBmaWxlLnNpemU7XG4gICAgbmV4dE9mZnNldCArPSAxO1xuICB9XG4gIGlmIChjdXJyZW50Lmxlbmd0aCA+IDApIGJhdGNoZXMucHVzaCh7IGZpbGVzOiBjdXJyZW50LCBvZmZzZXQ6IGN1cnJlbnRPZmZzZXQgfSk7XG5cbiAgY29uc3QgcmVzdWx0czogS2JVcGxvYWRCYXRjaFJlc3VsdFtdID0gW107XG4gIGxldCBjb21wbGV0ZWRGaWxlcyA9IDA7XG4gIGxldCBjdXJzb3IgPSAwO1xuICBhc3luYyBmdW5jdGlvbiB1cGxvYWRCYXRjaChiYXRjaEluZGV4OiBudW1iZXIpIHtcbiAgICBjb25zdCBiYXRjaCA9IGJhdGNoZXNbYmF0Y2hJbmRleF0hO1xuICAgIGNvbnN0IHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoeyBiYXRjaEluZGV4OiBTdHJpbmcoYmF0Y2hJbmRleCksIHRvdGFsQmF0Y2hlczogU3RyaW5nKGJhdGNoZXMubGVuZ3RoKSB9KTtcbiAgICBpZiAodXBsb2FkSWQpIHBhcmFtcy5zZXQoJ3VwbG9hZElkJywgdXBsb2FkSWQpO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGZldGNoSnNvbjxLYlVwbG9hZEJhdGNoUmVzdWx0PihgL2FwaS9rYi91cGxvYWQ/JHtwYXJhbXN9YCwge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBib2R5OiBhcHBlbmRVcGxvYWRGb3JtKGJhdGNoLmZpbGVzLCB7XG4gICAgICAgIHByb2plY3RSb290LFxuICAgICAgICB1cGxvYWRJZCxcbiAgICAgICAgYmF0Y2hJbmRleCxcbiAgICAgICAgdG90YWxCYXRjaGVzOiBiYXRjaGVzLmxlbmd0aCxcbiAgICAgICAgZmlsZU9mZnNldDogYmF0Y2gub2Zmc2V0LFxuICAgICAgICBzdGFydEluZGV4OiBiYXRjaEluZGV4ID09PSAwLFxuICAgICAgICB1cGxvYWRDb21wbGV0ZTogYmF0Y2hlcy5sZW5ndGggPT09IDEsXG4gICAgICB9KSxcbiAgICB9KTtcbiAgICByZXN1bHRzW2JhdGNoSW5kZXhdID0gcmVzdWx0O1xuICAgIGNvbXBsZXRlZEZpbGVzICs9IGJhdGNoLmZpbGVzLmxlbmd0aDtcbiAgICBvbkJhdGNoUHJvZ3Jlc3M/Lih7IHVwbG9hZGVkRmlsZXM6IGNvbXBsZXRlZEZpbGVzLCB0b3RhbEZpbGVzOiBmaWxlcy5sZW5ndGgsIGJhdGNoSW5kZXgsIHRvdGFsQmF0Y2hlczogYmF0Y2hlcy5sZW5ndGggfSk7XG4gIH1cbiAgY29uc3Qgd29ya2VycyA9IEFycmF5LmZyb20oeyBsZW5ndGg6IE1hdGgubWluKG1heENvbmN1cnJlbnRCYXRjaGVzLCBiYXRjaGVzLmxlbmd0aCkgfSwgYXN5bmMgKCkgPT4ge1xuICAgIHdoaWxlIChjdXJzb3IgPCBiYXRjaGVzLmxlbmd0aCkge1xuICAgICAgY29uc3QgYmF0Y2hJbmRleCA9IGN1cnNvcisrO1xuICAgICAgYXdhaXQgdXBsb2FkQmF0Y2goYmF0Y2hJbmRleCk7XG4gICAgfVxuICB9KTtcbiAgYXdhaXQgUHJvbWlzZS5hbGwod29ya2Vycyk7XG4gIGlmIChiYXRjaGVzLmxlbmd0aCA+IDEpIHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBmZXRjaEpzb248S2JVcGxvYWRCYXRjaFJlc3VsdD4oYC9hcGkva2IvdXBsb2FkL2NvbXBsZXRlYCwge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgcHJvamVjdFJvb3QsIHVwbG9hZElkIH0pLFxuICAgIH0pO1xuICAgIHJlc3VsdHMucHVzaChyZXN1bHQpO1xuICB9XG4gIHJldHVybiByZXN1bHRzLmZpbHRlcihCb29sZWFuKS5hdCgtMSkgPz8geyBzdWNjZXNzOiB0cnVlIH07XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRLYlVwbG9hZFByb2dyZXNzKHVwbG9hZElkOiBzdHJpbmcpIHtcbiAgcmV0dXJuIGZldGNoSnNvbjxLYlVwbG9hZFByb2dyZXNzPihgL2FwaS9rYi91cGxvYWQvcHJvZ3Jlc3M/aWQ9JHtlbmNvZGVVUklDb21wb25lbnQodXBsb2FkSWQpfWApO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0S2JPcGVyYXRpb25zKHByb2plY3RSb290Pzogc3RyaW5nKSB7XG4gIGNvbnN0IHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoeyBsaW1pdDogJzUwJyB9KTtcbiAgaWYgKHByb2plY3RSb290KSBwYXJhbXMuc2V0KCdwcm9qZWN0Um9vdCcsIHByb2plY3RSb290KTtcbiAgcmV0dXJuIGZldGNoSnNvbjx7IG9wZXJhdGlvbnM6IEtiT3BlcmF0aW9uUmVjb3JkW10gfT4oYC9hcGkva2Ivb3BlcmF0aW9ucz8ke3BhcmFtc31gKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEpvYnMob3B0cz86IHsgcHJvamVjdFJvb3Q/OiBzdHJpbmc7IGFjdGl2ZT86IGJvb2xlYW47IGxpbWl0PzogbnVtYmVyIH0pIHtcbiAgY29uc3QgcGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh7IGxpbWl0OiBTdHJpbmcob3B0cz8ubGltaXQgPz8gNTApIH0pO1xuICBpZiAob3B0cz8ucHJvamVjdFJvb3QpIHBhcmFtcy5zZXQoJ3Byb2plY3RSb290Jywgb3B0cy5wcm9qZWN0Um9vdCk7XG4gIGlmIChvcHRzPy5hY3RpdmUpIHBhcmFtcy5zZXQoJ2FjdGl2ZScsICcxJyk7XG4gIHJldHVybiBmZXRjaEpzb248eyBqb2JzOiBLYk9wZXJhdGlvblJlY29yZFtdIH0+KGAvYXBpL2pvYnM/JHtwYXJhbXN9YCk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRKb2IoaWQ6IHN0cmluZywgcHJvamVjdFJvb3Q/OiBzdHJpbmcpIHtcbiAgY29uc3QgcGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcygpO1xuICBpZiAocHJvamVjdFJvb3QpIHBhcmFtcy5zZXQoJ3Byb2plY3RSb290JywgcHJvamVjdFJvb3QpO1xuICByZXR1cm4gZmV0Y2hKc29uPHsgam9iOiBLYk9wZXJhdGlvblJlY29yZCB9PihgL2FwaS9qb2JzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KGlkKX0/JHtwYXJhbXN9YCk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjbGVhcktiT3BlcmF0aW9ucyhwcm9qZWN0Um9vdD86IHN0cmluZykge1xuICBjb25zdCBwYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKCk7XG4gIGlmIChwcm9qZWN0Um9vdCkgcGFyYW1zLnNldCgncHJvamVjdFJvb3QnLCBwcm9qZWN0Um9vdCk7XG4gIHJldHVybiBmZXRjaEpzb248eyBzdWNjZXNzOiBib29sZWFuOyBkZWxldGVkOiBudW1iZXIgfT4oYC9hcGkva2Ivb3BlcmF0aW9ucz8ke3BhcmFtc31gLCB7IG1ldGhvZDogJ0RFTEVURScgfSk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZWxldGVLYk9wZXJhdGlvbihpZDogc3RyaW5nLCBwcm9qZWN0Um9vdD86IHN0cmluZykge1xuICBjb25zdCBwYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHsgaWQgfSk7XG4gIGlmIChwcm9qZWN0Um9vdCkgcGFyYW1zLnNldCgncHJvamVjdFJvb3QnLCBwcm9qZWN0Um9vdCk7XG4gIHJldHVybiBmZXRjaEpzb248eyBzdWNjZXNzOiBib29sZWFuOyBkZWxldGVkOiBudW1iZXIgfT4oYC9hcGkva2Ivb3BlcmF0aW9ucz8ke3BhcmFtc31gLCB7IG1ldGhvZDogJ0RFTEVURScgfSk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZWxldGVLYkZpbGUocmVsYXRpdmVQYXRoOiBzdHJpbmcsIHByb2plY3RSb290Pzogc3RyaW5nKSB7XG4gIHJldHVybiBmZXRjaEpzb248eyBzdWNjZXNzOiBib29sZWFuOyBkZWxldGVkPzogbnVtYmVyIH0+KCcvYXBpL2tiL2ZpbGVzJywge1xuICAgIG1ldGhvZDogJ0RFTEVURScsIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgcmVsYXRpdmVQYXRoLCBwcm9qZWN0Um9vdCB9KSxcbiAgfSk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZWxldGVLYkZpbGVzKHJlbGF0aXZlUGF0aHM6IHN0cmluZ1tdLCBwcm9qZWN0Um9vdD86IHN0cmluZykge1xuICByZXR1cm4gZmV0Y2hKc29uPHsgc3VjY2VzczogYm9vbGVhbjsgZGVsZXRlZD86IG51bWJlciB9PignL2FwaS9rYi9maWxlcycsIHtcbiAgICBtZXRob2Q6ICdERUxFVEUnLCBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IHJlbGF0aXZlUGF0aHMsIHByb2plY3RSb290IH0pLFxuICB9KTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRlbGV0ZUtiRm9sZGVycyhmb2xkZXJQYXRoczogc3RyaW5nW10sIHByb2plY3RSb290Pzogc3RyaW5nKSB7XG4gIHJldHVybiBmZXRjaEpzb248eyBzdWNjZXNzOiBib29sZWFuOyBkZWxldGVkPzogbnVtYmVyIH0+KCcvYXBpL2tiL2ZpbGVzJywge1xuICAgIG1ldGhvZDogJ0RFTEVURScsIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgZm9sZGVyUGF0aHMsIHByb2plY3RSb290IH0pLFxuICB9KTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRlbGV0ZUtiU2VsZWN0aW9uKHJlbGF0aXZlUGF0aHM6IHN0cmluZ1tdLCBmb2xkZXJQYXRoczogc3RyaW5nW10sIHByb2plY3RSb290Pzogc3RyaW5nKSB7XG4gIHJldHVybiBmZXRjaEpzb248eyBzdWNjZXNzOiBib29sZWFuOyBkZWxldGVkPzogbnVtYmVyIH0+KCcvYXBpL2tiL2ZpbGVzJywge1xuICAgIG1ldGhvZDogJ0RFTEVURScsIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgcmVsYXRpdmVQYXRocywgZm9sZGVyUGF0aHMsIHByb2plY3RSb290IH0pLFxuICB9KTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRlbGV0ZUFsbEtiRmlsZXMocHJvamVjdFJvb3Q/OiBzdHJpbmcpIHtcbiAgcmV0dXJuIGZldGNoSnNvbjx7IHN1Y2Nlc3M6IGJvb2xlYW47IGRlbGV0ZWQ/OiBudW1iZXIgfT4oJy9hcGkva2IvZmlsZXMnLCB7XG4gICAgbWV0aG9kOiAnREVMRVRFJywgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBhbGw6IHRydWUsIHByb2plY3RSb290IH0pLFxuICB9KTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlaW5kZXhLYihwcm9qZWN0Um9vdD86IHN0cmluZykge1xuICByZXR1cm4gZmV0Y2hKc29uPHsgc3VjY2VzczogYm9vbGVhbjsgYWNjZXB0ZWQ/OiBib29sZWFuOyBhbHJlYWR5UnVubmluZz86IGJvb2xlYW47IG9wZXJhdGlvbklkPzogc3RyaW5nOyBqb2I/OiBLYk9wZXJhdGlvblJlY29yZDsgc3RhdHM/OiBLYlN0YXRzIH0+KCcvYXBpL2tiL3JlaW5kZXgnLCB7XG4gICAgbWV0aG9kOiAnUE9TVCcsIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgcHJvamVjdFJvb3QgfSksXG4gIH0pO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0UmVpbmRleFN0YXR1cyhwcm9qZWN0Um9vdD86IHN0cmluZykge1xuICBjb25zdCBwYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKCk7XG4gIGlmIChwcm9qZWN0Um9vdCkgcGFyYW1zLnNldCgncHJvamVjdFJvb3QnLCBwcm9qZWN0Um9vdCk7XG4gIHJldHVybiBmZXRjaEpzb248eyBydW5uaW5nOiBib29sZWFuOyBhY3RpdmU/OiB7IG9wZXJhdGlvbklkOiBzdHJpbmc7IHN0YXJ0ZWRBdDogbnVtYmVyIH07IGpvYjogS2JPcGVyYXRpb25SZWNvcmQgfCBudWxsIH0+KGAvYXBpL2tiL3JlaW5kZXg/JHtwYXJhbXN9YCk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRLYlRhZ3MocHJvamVjdFJvb3Q/OiBzdHJpbmcpIHtcbiAgY29uc3QgcCA9IHByb2plY3RSb290ID8gYD9wcm9qZWN0Um9vdD0ke2VuY29kZVVSSUNvbXBvbmVudChwcm9qZWN0Um9vdCl9YCA6ICcnO1xuICByZXR1cm4gZmV0Y2hKc29uPHN0cmluZ1tdPihgL2FwaS9rYi90YWdzJHtwfWApO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0S2JJZ25vcmVSdWxlcyhwcm9qZWN0Um9vdD86IHN0cmluZykge1xuICBjb25zdCBwID0gcHJvamVjdFJvb3QgPyBgP3Byb2plY3RSb290PSR7ZW5jb2RlVVJJQ29tcG9uZW50KHByb2plY3RSb290KX1gIDogJyc7XG4gIHJldHVybiBmZXRjaEpzb248c3RyaW5nW10+KGAvYXBpL2tiL2lnbm9yZSR7cH1gKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNhdmVLYklnbm9yZVJ1bGVzKHJ1bGVzOiBzdHJpbmdbXSwgcHJvamVjdFJvb3Q/OiBzdHJpbmcpIHtcbiAgcmV0dXJuIGZldGNoSnNvbjx7IHN1Y2Nlc3M6IGJvb2xlYW4gfT4oJy9hcGkva2IvaWdub3JlJywge1xuICAgIG1ldGhvZDogJ1BPU1QnLCBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IHJ1bGVzLCBwcm9qZWN0Um9vdCB9KSxcbiAgfSk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRLYkR1cGxpY2F0ZXMocHJvamVjdFJvb3Q/OiBzdHJpbmcpIHtcbiAgY29uc3QgcCA9IHByb2plY3RSb290ID8gYD9wcm9qZWN0Um9vdD0ke2VuY29kZVVSSUNvbXBvbmVudChwcm9qZWN0Um9vdCl9YCA6ICcnO1xuICByZXR1cm4gZmV0Y2hKc29uKGAvYXBpL2tiL2R1cGxpY2F0ZXMke3B9YCk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRLYkZlYXR1cmVzKCkge1xuICByZXR1cm4gZmV0Y2hKc29uPEtiRmVhdHVyZXM+KCcvYXBpL2tiL2ZlYXR1cmVzJyk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgS2JTZWFyY2hSZXN1bHQge1xuICBpZDogc3RyaW5nO1xuICBjb250ZW50OiBzdHJpbmc7XG4gIGZpbGVQYXRoOiBzdHJpbmc7XG4gIHNjb3BlOiAncHJvamVjdCcgfCAnZ2xvYmFsJztcbiAgY29sbGVjdGlvbjogc3RyaW5nO1xuICBzY29yZTogbnVtYmVyO1xuICBjaHVua0luZGV4PzogbnVtYmVyO1xuICBwYXJlbnRJZD86IHN0cmluZztcbiAgc291cmNlPzogJ2tleXdvcmQnIHwgJ3ZlY3RvcicgfCAnaHlicmlkJztcbiAgc2VjdGlvblRpdGxlPzogc3RyaW5nO1xuICByb3dSYW5nZT86IHN0cmluZztcbiAgY2h1bmtLaW5kPzogc3RyaW5nO1xuICBzY29yZURldGFpbHM/OiB7IGtleXdvcmRTY29yZT86IG51bWJlcjsgYm0yNVNjb3JlPzogbnVtYmVyOyB2ZWN0b3JTY29yZT86IG51bWJlcjsgaHlicmlkU2NvcmU/OiBudW1iZXI7IGV4YWN0UGhyYXNlQm9vc3Q/OiBudW1iZXI7IHJlcmFua0Jvb3N0PzogbnVtYmVyIH07XG4gIGZhY2V0cz86IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bWJlciB8IHN0cmluZ1tdPjtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNlYXJjaEtiKHF1ZXJ5OiBzdHJpbmcsIG9wdHM/OiB7IHByb2plY3RSb290Pzogc3RyaW5nOyBjYXRlZ29yeT86IHN0cmluZzsgbGltaXQ/OiBudW1iZXI7IHdlaWdodHM/OiB7IGtleXdvcmQ/OiBudW1iZXI7IHZlY3Rvcj86IG51bWJlcjsgcmV3cml0ZT86IG51bWJlcjsgaHlicmlkQm9udXM/OiBudW1iZXIgfSB9KSB7XG4gIGNvbnN0IHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoeyBxOiBxdWVyeSB9KTtcbiAgaWYgKG9wdHM/LnByb2plY3RSb290KSBwYXJhbXMuc2V0KCdwcm9qZWN0Um9vdCcsIG9wdHMucHJvamVjdFJvb3QpO1xuICBpZiAob3B0cz8uY2F0ZWdvcnkpIHBhcmFtcy5zZXQoJ2NhdGVnb3J5Jywgb3B0cy5jYXRlZ29yeSk7XG4gIGlmIChvcHRzPy5saW1pdCkgcGFyYW1zLnNldCgnbGltaXQnLCBTdHJpbmcob3B0cy5saW1pdCA/PyAyMCkpO1xuICBpZiAob3B0cz8ud2VpZ2h0cz8ua2V5d29yZCAhPSBudWxsKSBwYXJhbXMuc2V0KCdrZXl3b3JkV2VpZ2h0JywgU3RyaW5nKG9wdHMud2VpZ2h0cy5rZXl3b3JkKSk7XG4gIGlmIChvcHRzPy53ZWlnaHRzPy52ZWN0b3IgIT0gbnVsbCkgcGFyYW1zLnNldCgndmVjdG9yV2VpZ2h0JywgU3RyaW5nKG9wdHMud2VpZ2h0cy52ZWN0b3IpKTtcbiAgaWYgKG9wdHM/LndlaWdodHM/LnJld3JpdGUgIT0gbnVsbCkgcGFyYW1zLnNldCgncmV3cml0ZVdlaWdodCcsIFN0cmluZyhvcHRzLndlaWdodHMucmV3cml0ZSkpO1xuICBpZiAob3B0cz8ud2VpZ2h0cz8uaHlicmlkQm9udXMgIT0gbnVsbCkgcGFyYW1zLnNldCgnaHlicmlkQm9udXMnLCBTdHJpbmcob3B0cy53ZWlnaHRzLmh5YnJpZEJvbnVzKSk7XG4gIHJldHVybiBmZXRjaEpzb248eyByZXN1bHRzOiBLYlNlYXJjaFJlc3VsdFtdOyB0b3RhbDogbnVtYmVyOyBxdWVyeVRpbWVNcz86IG51bWJlcjsgZGVidWc/OiB7IG9yaWdpbmFsUXVlcnk/OiBzdHJpbmc7IHJld3JpdHRlblF1ZXJpZXM/OiBzdHJpbmdbXTsgd2VpZ2h0cz86IFJlY29yZDxzdHJpbmcsIG51bWJlcj47IHJlY2FsbENvdW50cz86IFJlY29yZDxzdHJpbmcsIG51bWJlcj47IHJlcmFua2VyPzogc3RyaW5nIH0gfT4oYC9hcGkva2Ivc2VhcmNoPyR7cGFyYW1zfWApO1xufVxuXG4vLyDilZDilZDilZDilZDilZDilZDilZAg5paH5qGj5bel5L2c5Y+wIOKVkOKVkOKVkOKVkOKVkOKVkOKVkFxuXG5leHBvcnQgaW50ZXJmYWNlIERvY3VtZW50VGVtcGxhdGVDaGFwdGVyIHsgaWQ6IHN0cmluZzsgdGl0bGU6IHN0cmluZzsgcHVycG9zZTogc3RyaW5nOyBxdWVyaWVzOiBzdHJpbmdbXTsgcmVxdWlyZWRGYWN0czogc3RyaW5nW107IHNlY3Rpb25zPzogc3RyaW5nW107IHRhYmxlU2VjdGlvbnM/OiBzdHJpbmdbXTsgdGFibGVSZXF1aXJlbWVudHM/OiBzdHJpbmdbXTsgcGlubmVkRXZpZGVuY2VGaWxlUGF0aHM/OiBzdHJpbmdbXTsgfVxuZXhwb3J0IGludGVyZmFjZSBQcm9tcHRCaW5kaW5nIHsgcHJvbXB0SWQ6IHN0cmluZzsgcm9sZUlkOiBzdHJpbmc7IH1cbmV4cG9ydCBpbnRlcmZhY2UgUHJvamVjdEJpbmRpbmcgeyBtYXRlcmlhbFJvb3RQYXRoOiBzdHJpbmc7IH1cbmV4cG9ydCB0eXBlIFByb21wdEV4ZWN1dGlvblR5cGUgPSAnZmFjdF9leHRyYWN0aW9uJyB8ICdjaGFwdGVyX2dlbmVyYXRpb24nIHwgJ2xsbV9yZXZpZXcnIHwgJ3ZhbGlkYXRpb24nIHwgJ2Zvcm1hdHRpbmcnIHwgJ3JlZmVyZW5jZSc7XG5leHBvcnQgdHlwZSBEb2N1bWVudFJvbGVUeXBlID0gJ3Byb21wdCc7XG5leHBvcnQgaW50ZXJmYWNlIERvY3VtZW50Um9sZSB7IGlkOiBzdHJpbmc7IG5hbWU6IHN0cmluZzsgZGVzY3JpcHRpb246IHN0cmluZzsgdHlwZTogRG9jdW1lbnRSb2xlVHlwZTsgcmVzb3VyY2VJZD86IHN0cmluZzsgcmVzb3VyY2VJZHM/OiBzdHJpbmdbXTsgYnVpbHRJbj86IGJvb2xlYW47IGV4ZWN1dGlvblR5cGU/OiBQcm9tcHRFeGVjdXRpb25UeXBlOyB9XG5leHBvcnQgaW50ZXJmYWNlIFByb2plY3RSb2xlSXRlbSB7IHJvbGVJZDogc3RyaW5nOyBvcmRlcjogbnVtYmVyOyB9XG5leHBvcnQgaW50ZXJmYWNlIFByb2plY3RSb2xlQ29uZmlnIHsgaWQ6IHN0cmluZzsgbmFtZTogc3RyaW5nOyBkZXNjcmlwdGlvbjogc3RyaW5nOyBwcm9tcHRSb2xlczogUHJvamVjdFJvbGVJdGVtW107IGJ1aWx0SW4/OiBib29sZWFuOyB9XG5leHBvcnQgaW50ZXJmYWNlIERvY3VtZW50RXhwb3J0U2V0dGluZ3MgeyBwYWdlPzogeyBwYXBlcj86IHN0cmluZzsgbWFyZ2luVG9wPzogc3RyaW5nOyBtYXJnaW5SaWdodD86IHN0cmluZzsgbWFyZ2luQm90dG9tPzogc3RyaW5nOyBtYXJnaW5MZWZ0Pzogc3RyaW5nIH07IHR5cG9ncmFwaHk/OiB7IGZvbnRGYW1pbHk/OiBzdHJpbmc7IGxpbmVIZWlnaHQ/OiBzdHJpbmc7IHRpdGxlU2l6ZT86IHN0cmluZzsgYm9keVNpemU/OiBzdHJpbmcgfTsgdGFyZ2V0UGFnZXM/OiB7IG1pbj86IG51bWJlcjsgdGFyZ2V0PzogbnVtYmVyOyBtYXg/OiBudW1iZXIgfTsgfVxuZXhwb3J0IGludGVyZmFjZSBEb2N1bWVudEdlbmVyYXRpb25TZXR0aW5ncyB7IHRhcmdldFBhZ2VzPzogeyBtaW4/OiBudW1iZXI7IHRhcmdldD86IG51bWJlcjsgbWF4PzogbnVtYmVyIH07IH1cbmV4cG9ydCBpbnRlcmZhY2UgRG9jdW1lbnRUZW1wbGF0ZSB7IGlkOiBzdHJpbmc7IG5hbWU6IHN0cmluZzsgZGVzY3JpcHRpb246IHN0cmluZzsgY2F0ZWdvcnk6IHN0cmluZzsgb3V0cHV0VGl0bGU6IHN0cmluZzsgY2hhcHRlcnM6IERvY3VtZW50VGVtcGxhdGVDaGFwdGVyW107IGV4cG9ydFNldHRpbmdzPzogRG9jdW1lbnRFeHBvcnRTZXR0aW5nczsgZ2VuZXJhdGlvblNldHRpbmdzPzogRG9jdW1lbnRHZW5lcmF0aW9uU2V0dGluZ3M7IHByb2plY3RSb2xlQ29uZmlnSWQ/OiBzdHJpbmc7IHByb2plY3RCaW5kaW5ncz86IFByb2plY3RCaW5kaW5nW107IHByb21wdElkcz86IHN0cmluZ1tdOyBwcm9tcHRCaW5kaW5ncz86IFByb21wdEJpbmRpbmdbXTsgYnVpbHRJbj86IGJvb2xlYW47IH1cbmV4cG9ydCBpbnRlcmZhY2UgQ2hhcHRlclJlYWRpbmVzc0RpYWdub3N0aWMgeyBjaGFwdGVySWQ6IHN0cmluZzsgdGl0bGU6IHN0cmluZzsgcmVxdWlyZWRGYWN0czogc3RyaW5nW107IGNvdmVyZWRGYWN0czogc3RyaW5nW107IG1pc3NpbmdGYWN0czogc3RyaW5nW107IHJlcXVpcmVkUm9sZXM6IHN0cmluZ1tdOyBzYXRpc2ZpZWRSb2xlczogc3RyaW5nW107IGV2aWRlbmNlQ291bnQ6IG51bWJlcjsgcmVhZGluZXNzUmF0ZTogbnVtYmVyOyB9XG5leHBvcnQgaW50ZXJmYWNlIERvY3VtZW50R2VuZXJhdGlvblJlYWRpbmVzcyB7IHJlYWR5OiBib29sZWFuOyBtYXRlcmlhbENvdmVyYWdlUmF0ZTogbnVtYmVyOyByb2xlU2F0aXNmYWN0aW9uUmF0ZTogbnVtYmVyOyBzcGVjQ29tcGxldGVuZXNzUmF0ZTogbnVtYmVyOyBtaXNzaW5nUm9sZXM6IHN0cmluZ1tdOyB3ZWFrUm9sZXM6IHN0cmluZ1tdOyBkaWFnbm9zdGljczogc3RyaW5nW107IGNoYXB0ZXJEaWFnbm9zdGljczogQ2hhcHRlclJlYWRpbmVzc0RpYWdub3N0aWNbXTsgYmxvY2tpbmdJc3N1ZXM6IHN0cmluZ1tdOyB3YXJuaW5nczogc3RyaW5nW107IH1cbmV4cG9ydCBpbnRlcmZhY2UgRG9jdW1lbnRUZW1wbGF0ZVZhbGlkYXRpb24geyB0ZW1wbGF0ZUlkOiBzdHJpbmc7IHByb2plY3RSb2xlQ29uZmlnSWQ/OiBzdHJpbmc7IGZpbGVEaWFnbm9zdGljczogQXJyYXk8eyBmaWxlUGF0aDogc3RyaW5nOyByb2xlTmFtZT86IHN0cmluZzsgZXhpc3RzOiBib29sZWFuOyBpbmRleGVkOiBib29sZWFuOyBjaHVua0NvdW50OiBudW1iZXI7IHZlY3RvclJlYWR5OiBib29sZWFuIH0+OyBwcm9tcHREaWFnbm9zdGljczogQXJyYXk8UHJvbXB0QmluZGluZyAmIHsgcm9sZU5hbWU/OiBzdHJpbmc7IHByb21wdFRpdGxlPzogc3RyaW5nOyBwcm9tcHRTb3VyY2U/OiAnY3VzdG9tJyB8ICdmaWxlJzsgY29udGVudEhhc2g/OiBzdHJpbmc7IGNvbnRlbnRQcmV2aWV3Pzogc3RyaW5nOyBleGlzdHM6IGJvb2xlYW47IGNvbnRlbnRMZW5ndGg6IG51bWJlciB9PjsgcmVhZGluZXNzPzogRG9jdW1lbnRHZW5lcmF0aW9uUmVhZGluZXNzOyBpc3N1ZXM6IEFycmF5PHsgbGV2ZWw6ICdlcnJvcicgfCAnd2FybmluZyc7IG1lc3NhZ2U6IHN0cmluZyB9PiB9XG5leHBvcnQgaW50ZXJmYWNlIFByb21wdFByb2plY3QgeyBpZDogc3RyaW5nOyBwcm9qZWN0SWQ6IHN0cmluZzsgcHJvamVjdFJvb3Q/OiBzdHJpbmc7IHByb2plY3ROYW1lOiBzdHJpbmc7IGN1c3RvbWl6ZVBhdGg6IHN0cmluZzsgY29udGVudDogc3RyaW5nOyBtdGltZTogc3RyaW5nOyBoYXNGaWxlOiBib29sZWFuOyBpc0N1cnJlbnQ6IGJvb2xlYW47IHNlbGVjdGVkOiBib29sZWFuOyBzb3VyY2U6ICdjdXJyZW50JyB8ICdwcm9qZWN0JyB8ICdjdXN0b20nOyB9XG5leHBvcnQgaW50ZXJmYWNlIERvY3VtZW50RXZpZGVuY2UgeyBjaGFwdGVySWQ6IHN0cmluZzsgZmlsZVBhdGg6IHN0cmluZzsgc2NvcmU6IG51bWJlcjsgY29udGVudDogc3RyaW5nOyByb2xlSWQ/OiBzdHJpbmc7IHByb2Nlc3NpbmdUeXBlPzogc3RyaW5nOyBzZWN0aW9uVGl0bGU/OiBzdHJpbmc7IHNvdXJjZT86IHN0cmluZzsgfVxuZXhwb3J0IGludGVyZmFjZSBEb2N1bWVudERyYWZ0Q2hhcHRlciB7IGlkOiBzdHJpbmc7IHRpdGxlOiBzdHJpbmc7IGNvbnRlbnQ6IHN0cmluZzsgZXZpZGVuY2U6IERvY3VtZW50RXZpZGVuY2VbXTsgbWlzc2luZ0ZhY3RzOiBzdHJpbmdbXTsgc2VjdGlvbnM/OiBzdHJpbmdbXTsgfVxuZXhwb3J0IGludGVyZmFjZSBGYWN0U291cmNlUmVmIHsgZmlsZVBhdGg6IHN0cmluZzsgcm9sZUlkOiBzdHJpbmc7IHByb2Nlc3NpbmdUeXBlPzogc3RyaW5nOyBzZWN0aW9uVGl0bGU/OiBzdHJpbmc7IGNodW5rSW5kZXg/OiBudW1iZXI7IGNlbGxSYW5nZT86IHN0cmluZzsgfVxuZXhwb3J0IGludGVyZmFjZSBEb2N1bWVudEZhY3QgeyBrZXk6IHN0cmluZzsgdmFsdWU6IHN0cmluZzsgc291cmNlRmlsZTogc3RyaW5nOyByb2xlSWQ6IHN0cmluZzsgcHJvY2Vzc2luZ1R5cGU/OiBzdHJpbmc7IGNvbmZpZGVuY2U6IG51bWJlcjsgZmllbGRJZD86IHN0cmluZzsgZmllbGROYW1lPzogc3RyaW5nOyBzb3VyY2VSZWY/OiBGYWN0U291cmNlUmVmOyB9XG5leHBvcnQgaW50ZXJmYWNlIFN0cnVjdHVyZWRUYWJsZUZhY3QgeyB0YWJsZVR5cGU6IHN0cmluZzsgc2hlZXQ/OiBzdHJpbmc7IGhlYWRlcnM6IHN0cmluZ1tdOyByb3dzOiBzdHJpbmdbXVtdOyBzb3VyY2VGaWxlOiBzdHJpbmc7IHNvdXJjZVJhbmdlPzogc3RyaW5nOyB9XG5leHBvcnQgaW50ZXJmYWNlIERvY3VtZW50RmFjdHNNb2RlbCB7IHByb2plY3Q6IERvY3VtZW50RmFjdFtdOyBzY2hlZHVsZTogRG9jdW1lbnRGYWN0W107IHF1YWxpdHk6IERvY3VtZW50RmFjdFtdOyBzYWZldHk6IERvY3VtZW50RmFjdFtdOyByZXNvdXJjZXM6IERvY3VtZW50RmFjdFtdOyB0YWJsZXM6IFN0cnVjdHVyZWRUYWJsZUZhY3RbXTsgZHJhd2luZ3M6IERvY3VtZW50RmFjdFtdOyBydWxlczogRG9jdW1lbnRGYWN0W107IHNwZWNpZmljYXRpb25zOiBEb2N1bWVudEZhY3RbXTsgc2NoZW1hRmFjdHM6IFJlY29yZDxzdHJpbmcsIERvY3VtZW50RmFjdFtdPjsgbWlzc2luZzogc3RyaW5nW107IGNvbmZsaWN0czogc3RyaW5nW107IH1cbmV4cG9ydCBpbnRlcmZhY2UgVmFsaWRhdGlvbklzc3VlIHsgbGV2ZWw6ICdlcnJvcicgfCAnd2FybmluZycgfCAnaW5mbyc7IG1lc3NhZ2U6IHN0cmluZzsgc291cmNlPzogc3RyaW5nOyBzdWdnZXN0aW9uPzogc3RyaW5nOyB9XG5leHBvcnQgaW50ZXJmYWNlIEV4cG9ydEdhdGVSZXN1bHQgeyBwYXNzZWQ6IGJvb2xlYW47IGJsb2NraW5nSXNzdWVzOiBWYWxpZGF0aW9uSXNzdWVbXTsgY2hlY2tsaXN0OiBBcnJheTx7IGtleTogc3RyaW5nOyBsYWJlbDogc3RyaW5nOyBwYXNzZWQ6IGJvb2xlYW47IG1lc3NhZ2U/OiBzdHJpbmcgfT47IH1cbmV4cG9ydCBpbnRlcmZhY2UgRG9jdW1lbnRFeGVjdXRpb25TdGFnZSB7IHR5cGU6ICdyb2xlX2JpbmRpbmcnIHwgJ2tub3dsZWRnZV9yZXRyaWV2YWwnIHwgJ2ZpbGVfdW5kZXJzdGFuZGluZycgfCAnZmFjdF9leHRyYWN0aW9uJyB8ICdjaGFwdGVyX2dlbmVyYXRpb24nIHwgJ2Fzc2V0X2dlbmVyYXRpb24nIHwgJ2xsbV9yZXZpZXcnIHwgJ3ZhbGlkYXRpb24nIHwgJ2Zvcm1hdHRpbmcnIHwgJ2V4cG9ydF9yZWFkeScgfCAncmVmZXJlbmNlJzsgcm9sZUlkOiBzdHJpbmc7IHByb21wdElkPzogc3RyaW5nOyBzdGF0dXM6ICdydW5uaW5nJyB8ICdzdWNjZXNzJyB8ICdmYWxsYmFjaycgfCAnc2tpcHBlZCcgfCAnZmFpbGVkJzsgbWVzc2FnZT86IHN0cmluZzsgZGV0YWlscz86IHN0cmluZ1tdOyBwcm9ncmVzcz86IHsgY3VycmVudDogbnVtYmVyOyB0b3RhbDogbnVtYmVyOyBsYWJlbD86IHN0cmluZyB9OyB0aXRsZT86IHN0cmluZzsgc3VidGl0bGU/OiBzdHJpbmc7IHJvbGVOYW1lPzogc3RyaW5nOyBwcm9tcHROYW1lPzogc3RyaW5nOyBncm91cD86IHN0cmluZzsgb3JkZXI/OiBudW1iZXI7IGV4ZWN1dGlvblZlcnNpb24/OiAyOyB9XG5leHBvcnQgaW50ZXJmYWNlIERvY3VtZW50QXNzZXQgeyBpZDogc3RyaW5nOyB0eXBlOiAnaW1hZ2UnIHwgJ2F1ZGlvJyB8ICd2aWRlbycgfCAnZmlsZSc7IHJvbGU6ICdjb3ZlcicgfCAncmVmZXJlbmNlJyB8ICdnZW5lcmF0ZWQnIHwgJ2F0dGFjaG1lbnQnIHwgJ21hcCcgfCAnb3BlcmF0b3InOyBwYXRoPzogc3RyaW5nOyB1cmw/OiBzdHJpbmc7IHByb21wdD86IHN0cmluZzsgbW9kZWxQcm92aWRlcj86IHN0cmluZzsgc3RhdHVzOiAnZ2VuZXJhdGVkJyB8ICdwcm9tcHRfcmVhZHknIHwgJ2ZhbGxiYWNrJzsgbWVzc2FnZT86IHN0cmluZzsgfVxuZXhwb3J0IGludGVyZmFjZSBHZW5lcmF0ZWRBc3NldFJlY29yZCBleHRlbmRzIERvY3VtZW50QXNzZXQgeyBuYW1lOiBzdHJpbmc7IHNvdXJjZTogJ2tub3dsZWRnZV9iYXNlJyB8ICdnZW5lcmF0ZWQnIHwgJ3VwbG9hZGVkJyB8ICdleHRlcm5hbF91cmwnOyBpbmRleGVkOiBib29sZWFuOyB1c2VkQnlEb2N1bWVudElkczogc3RyaW5nW107IGNyZWF0ZWRBdDogbnVtYmVyOyB1cGRhdGVkQXQ6IG51bWJlcjsgfVxuZXhwb3J0IGludGVyZmFjZSBHZW5lcmF0ZWREb2N1bWVudFJlY29yZCB7IGlkOiBzdHJpbmc7IHRhc2tJZD86IHN0cmluZzsgdGVtcGxhdGVJZDogc3RyaW5nOyB0ZW1wbGF0ZU5hbWU/OiBzdHJpbmc7IHRpdGxlOiBzdHJpbmc7IHJlcXVpcmVtZW50OiBzdHJpbmc7IHByb2plY3RSb290Pzogc3RyaW5nOyBwcm9qZWN0SWQ/OiBzdHJpbmc7IGtub3dsZWRnZUJhc2VQYXRoPzogc3RyaW5nOyBtYXJrZG93bjogc3RyaW5nOyBlZGl0ZWRNYXJrZG93bj86IHN0cmluZzsgc3RhdHVzOiAnZ2VuZXJhdGluZycgfCAnY29tcGxldGVkJyB8ICd3YXJuaW5nJyB8ICdmYWlsZWQnIHwgJ2Fib3J0ZWQnOyBkcmFmdD86IEdlbmVyYXRlZERvY3VtZW50RHJhZnQ7IGV4ZWN1dGlvblN0YWdlcz86IEdlbmVyYXRlZERvY3VtZW50RHJhZnRbJ2V4ZWN1dGlvblN0YWdlcyddOyBwYXJ0aWFsQ2hhcHRlcnM/OiBHZW5lcmF0ZWREb2N1bWVudERyYWZ0WydwYXJ0aWFsQ2hhcHRlcnMnXTsgY2hlY2twb2ludENoYXB0ZXJzPzogRG9jdW1lbnREcmFmdENoYXB0ZXJbXTsgcmV2aWV3TWV0YWRhdGE/OiBHZW5lcmF0ZWREb2N1bWVudERyYWZ0WydyZXZpZXdNZXRhZGF0YSddOyBhc3NldHM6IERvY3VtZW50QXNzZXRbXTsgY3JlYXRlZEF0OiBudW1iZXI7IHVwZGF0ZWRBdDogbnVtYmVyOyBjb21wbGV0ZWRBdD86IG51bWJlcjsgZXJyb3I/OiBzdHJpbmc7IHdhcm5pbmdJc3N1ZXM/OiBzdHJpbmdbXTsgbWF4RXZpZGVuY2VQZXJDaGFwdGVyPzogbnVtYmVyOyB9XG5leHBvcnQgaW50ZXJmYWNlIERvY3VtZW50UmV2aWV3TWV0YWRhdGEgeyBjaGFwdGVyU3VtbWFyaWVzOiBBcnJheTx7IGNoYXB0ZXJJZDogc3RyaW5nOyB0aXRsZTogc3RyaW5nOyBzdGF0dXM6ICdwYXNzJyB8ICd3YXJuJyB8ICdmYWlsJzsgaXNzdWVzOiBzdHJpbmdbXTsgc3VnZ2VzdGlvbnM6IHN0cmluZ1tdOyBjaGFyczogbnVtYmVyIH0+OyBnbG9iYWxJc3N1ZXM6IHN0cmluZ1tdOyBkaWFnbm9zdGljczogeyBzdHJhdGVneTogeyBtb2RlOiAnZmFzdCcgfCAnYmFsYW5jZWQnIHwgJ2xvbmdmb3JtJyB8ICdzdHJpY3QnOyBsYXJnZURvY3VtZW50TW9kZT86IGJvb2xlYW47IGVuYWJsZUNoYXB0ZXJSZXZpZXc6IGJvb2xlYW47IGVuYWJsZUdsb2JhbFJldmlldzogYm9vbGVhbjsgZW5hYmxlRG9jdW1lbnRCdWRnZXRFeHBhbnNpb24/OiBib29sZWFuOyBlbmFibGVGaW5hbFF1YWxpdHlSZXZpZXc/OiBib29sZWFuOyBtYXhDaGFwdGVyUmV2aWV3Q29uY3VycmVuY3k6IG51bWJlcjsgdGFyZ2V0TGxtQ29uY3VycmVuY3k6IG51bWJlciB9OyBtZXRyaWNzOiBBcnJheTx7IG5hbWU6IHN0cmluZzsgc3RhcnRlZEF0OiBudW1iZXI7IGVuZGVkQXQ6IG51bWJlcjsgZHVyYXRpb25NczogbnVtYmVyOyBtZXRhPzogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbj4gfT47IGxsbTogeyBjYWxsczogbnVtYmVyOyBmYWlsdXJlczogbnVtYmVyOyB0aHJvdHRsZWRXYWl0czogbnVtYmVyOyB0aHJvdHRsZWRXYWl0TXM/OiBudW1iZXI7IG1heEFjdGl2ZTogbnVtYmVyOyBjdXJyZW50TGltaXQ6IG51bWJlcjsgbGltaXRBZGp1c3RtZW50czogbnVtYmVyIH07IGV2aWRlbmNlPzogeyByYXc6IG51bWJlcjsgdXNlZDogbnVtYmVyOyBmaWx0ZXJlZE5vaXNlOiBudW1iZXI7IGF2Z05vaXNlU2NvcmU6IG51bWJlcjsgYXZnRmFjdERlbnNpdHk6IG51bWJlcjsgc2VhcmNoUXVlcmllcz86IG51bWJlcjsgc2VhcmNoTXM/OiBudW1iZXI7IGNvbnRleHRDaGFycz86IG51bWJlciB9OyBxdWFsaXR5PzogeyBibG9ja2luZ0NvdW50OiBudW1iZXI7IGltcG9ydGFudENvdW50OiBudW1iZXI7IG1pbm9yQ291bnQ6IG51bWJlcjsgcmVwYWlyZWRDb3VudDogbnVtYmVyIH0gfSB9XG5leHBvcnQgaW50ZXJmYWNlIEdlbmVyYXRlZERvY3VtZW50RHJhZnQgeyB0ZW1wbGF0ZUlkOiBzdHJpbmc7IHRlbXBsYXRlTmFtZTogc3RyaW5nOyB0aXRsZTogc3RyaW5nOyByZXF1aXJlbWVudDogc3RyaW5nOyBwcm9qZWN0Um9vdD86IHN0cmluZzsgcHJvamVjdElkPzogc3RyaW5nOyBtYXJrZG93bjogc3RyaW5nOyBleHBvcnRTZXR0aW5ncz86IERvY3VtZW50RXhwb3J0U2V0dGluZ3M7IGdlbmVyYXRpb25TZXR0aW5ncz86IERvY3VtZW50R2VuZXJhdGlvblNldHRpbmdzOyBmYWN0czogUmVjb3JkPHN0cmluZywgc3RyaW5nPjsgc3RydWN0dXJlZEZhY3RzOiBEb2N1bWVudEZhY3RbXTsgZmFjdHNNb2RlbDogRG9jdW1lbnRGYWN0c01vZGVsOyBjaGFwdGVyczogRG9jdW1lbnREcmFmdENoYXB0ZXJbXTsgc291cmNlczogQXJyYXk8eyBmaWxlUGF0aDogc3RyaW5nOyBjb3VudDogbnVtYmVyIH0+OyBtaXNzaW5nSXRlbXM6IHN0cmluZ1tdOyB2YWxpZGF0aW9uOiB7IHBhc3NlZDogYm9vbGVhbjsgd2FybmluZ3M6IHN0cmluZ1tdOyBlcnJvcnM6IHN0cmluZ1tdIH07IHZhbGlkYXRpb25Jc3N1ZXM6IFZhbGlkYXRpb25Jc3N1ZVtdOyBleGVjdXRpb25TdGFnZXM6IERvY3VtZW50RXhlY3V0aW9uU3RhZ2VbXTsgZXhwb3J0R2F0ZTogRXhwb3J0R2F0ZVJlc3VsdDsgYXNzZXRzPzogRG9jdW1lbnRBc3NldFtdOyBwYXJ0aWFsQ2hhcHRlcnM/OiBBcnJheTx7IGlkOiBzdHJpbmc7IHRpdGxlOiBzdHJpbmc7IGNoYXJzOiBudW1iZXI7IHN0YXR1czogJ2NvbXBsZXRlZCcgfCAnZmFpbGVkJzsgdXBkYXRlZEF0OiBudW1iZXIgfT47IHJldmlld01ldGFkYXRhPzogRG9jdW1lbnRSZXZpZXdNZXRhZGF0YTsgZ2VuZXJhdGVkQXQ6IG51bWJlcjsgfVxuZXhwb3J0IGludGVyZmFjZSBTdG9yZWREb2N1bWVudERyYWZ0IGV4dGVuZHMgR2VuZXJhdGVkRG9jdW1lbnREcmFmdCB7IGlkOiBzdHJpbmc7IHVwZGF0ZWRBdDogbnVtYmVyOyB9XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRQcm9tcHRQcm9qZWN0cygpIHsgcmV0dXJuIGZldGNoSnNvbjxQcm9tcHRQcm9qZWN0W10+KCcvYXBpL3Byb21wdCcpOyB9XG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0RG9jdW1lbnRSb2xlcyh0eXBlPzogRG9jdW1lbnRSb2xlVHlwZSkgeyByZXR1cm4gZmV0Y2hKc29uPHsgcm9sZXM6IERvY3VtZW50Um9sZVtdOyBjb25maWdzOiBQcm9qZWN0Um9sZUNvbmZpZ1tdIH0+KGAvYXBpL2RvY3VtZW50cy9yb2xlcyR7dHlwZSA/IGA/dHlwZT0ke3R5cGV9YCA6ICcnfWApOyB9XG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2F2ZURvY3VtZW50Um9sZShyb2xlOiBEb2N1bWVudFJvbGUpIHtcbiAgcmV0dXJuIGZldGNoSnNvbjx7IHJvbGU6IERvY3VtZW50Um9sZTsgcm9sZXM6IERvY3VtZW50Um9sZVtdOyBjb25maWdzOiBQcm9qZWN0Um9sZUNvbmZpZ1tdIH0+KCcvYXBpL2RvY3VtZW50cy9yb2xlcycsIHsgbWV0aG9kOiAnUFVUJywgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sIGJvZHk6IEpTT04uc3RyaW5naWZ5KHJvbGUpIH0pO1xufVxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRlbGV0ZURvY3VtZW50Um9sZSh0eXBlOiBEb2N1bWVudFJvbGVUeXBlLCBpZDogc3RyaW5nKSB7XG4gIHJldHVybiBmZXRjaEpzb248eyBzdWNjZXNzOiBib29sZWFuOyByb2xlczogRG9jdW1lbnRSb2xlW107IGNvbmZpZ3M6IFByb2plY3RSb2xlQ29uZmlnW10gfT4oYC9hcGkvZG9jdW1lbnRzL3JvbGVzP3R5cGU9JHt0eXBlfSZpZD0ke2VuY29kZVVSSUNvbXBvbmVudChpZCl9YCwgeyBtZXRob2Q6ICdERUxFVEUnIH0pO1xufVxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNhdmVQcm9qZWN0Um9sZUNvbmZpZyhjb25maWc6IFByb2plY3RSb2xlQ29uZmlnKSB7XG4gIHJldHVybiBmZXRjaEpzb248eyBjb25maWc6IFByb2plY3RSb2xlQ29uZmlnOyByb2xlczogRG9jdW1lbnRSb2xlW107IGNvbmZpZ3M6IFByb2plY3RSb2xlQ29uZmlnW10gfT4oJy9hcGkvZG9jdW1lbnRzL3JvbGVzP21vZGU9Y29uZmlnJywgeyBtZXRob2Q6ICdQVVQnLCBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSwgYm9keTogSlNPTi5zdHJpbmdpZnkoY29uZmlnKSB9KTtcbn1cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZWxldGVQcm9qZWN0Um9sZUNvbmZpZyhpZDogc3RyaW5nKSB7XG4gIHJldHVybiBmZXRjaEpzb248eyBzdWNjZXNzOiBib29sZWFuOyByb2xlczogRG9jdW1lbnRSb2xlW107IGNvbmZpZ3M6IFByb2plY3RSb2xlQ29uZmlnW10gfT4oYC9hcGkvZG9jdW1lbnRzL3JvbGVzP21vZGU9Y29uZmlnJmlkPSR7ZW5jb2RlVVJJQ29tcG9uZW50KGlkKX1gLCB7IG1ldGhvZDogJ0RFTEVURScgfSk7XG59XG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0RG9jdW1lbnRUZW1wbGF0ZXMoKSB7IHJldHVybiBmZXRjaEpzb248eyB0ZW1wbGF0ZXM6IERvY3VtZW50VGVtcGxhdGVbXSB9PignL2FwaS9kb2N1bWVudHMvdGVtcGxhdGVzJyk7IH1cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB2YWxpZGF0ZURvY3VtZW50VGVtcGxhdGUodGVtcGxhdGVJZDogc3RyaW5nLCBwcm9qZWN0Um9vdD86IHN0cmluZykge1xuICBjb25zdCBwID0gcHJvamVjdFJvb3QgPyBgJnByb2plY3RSb290PSR7ZW5jb2RlVVJJQ29tcG9uZW50KHByb2plY3RSb290KX1gIDogJyc7XG4gIHJldHVybiBmZXRjaEpzb248eyB2YWxpZGF0aW9uOiBEb2N1bWVudFRlbXBsYXRlVmFsaWRhdGlvbiB9PihgL2FwaS9kb2N1bWVudHMvdGVtcGxhdGVzP3ZhbGlkYXRlPSR7ZW5jb2RlVVJJQ29tcG9uZW50KHRlbXBsYXRlSWQpfSR7cH1gKTtcbn1cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzYXZlRG9jdW1lbnRUZW1wbGF0ZSh0ZW1wbGF0ZTogRG9jdW1lbnRUZW1wbGF0ZSkge1xuICByZXR1cm4gZmV0Y2hKc29uPHsgdGVtcGxhdGU6IERvY3VtZW50VGVtcGxhdGU7IHRlbXBsYXRlczogRG9jdW1lbnRUZW1wbGF0ZVtdIH0+KCcvYXBpL2RvY3VtZW50cy90ZW1wbGF0ZXMnLCB7IG1ldGhvZDogJ1BVVCcsIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LCBib2R5OiBKU09OLnN0cmluZ2lmeSh0ZW1wbGF0ZSkgfSk7XG59XG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGVsZXRlRG9jdW1lbnRUZW1wbGF0ZSh0ZW1wbGF0ZUlkOiBzdHJpbmcpIHtcbiAgcmV0dXJuIGZldGNoSnNvbjx7IHN1Y2Nlc3M6IGJvb2xlYW47IHRlbXBsYXRlczogRG9jdW1lbnRUZW1wbGF0ZVtdIH0+KGAvYXBpL2RvY3VtZW50cy90ZW1wbGF0ZXM/dGVtcGxhdGVJZD0ke2VuY29kZVVSSUNvbXBvbmVudCh0ZW1wbGF0ZUlkKX1gLCB7IG1ldGhvZDogJ0RFTEVURScgfSk7XG59XG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZHVwbGljYXRlRG9jdW1lbnRUZW1wbGF0ZSh0ZW1wbGF0ZUlkOiBzdHJpbmcpIHtcbiAgcmV0dXJuIGZldGNoSnNvbjx7IHRlbXBsYXRlOiBEb2N1bWVudFRlbXBsYXRlOyB0ZW1wbGF0ZXM6IERvY3VtZW50VGVtcGxhdGVbXSB9PignL2FwaS9kb2N1bWVudHMvdGVtcGxhdGVzJywgeyBtZXRob2Q6ICdQQVRDSCcsIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LCBib2R5OiBKU09OLnN0cmluZ2lmeSh7IHRlbXBsYXRlSWQgfSkgfSk7XG59XG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVEb2N1bWVudERyYWZ0KGlucHV0OiB7IHRlbXBsYXRlSWQ6IHN0cmluZzsgcmVxdWlyZW1lbnQ/OiBzdHJpbmc7IG1heEV2aWRlbmNlUGVyQ2hhcHRlcj86IG51bWJlcjsgcHJvamVjdFJvb3Q/OiBzdHJpbmcgfSkge1xuICByZXR1cm4gZmV0Y2hKc29uPHsgZHJhZnQ/OiBHZW5lcmF0ZWREb2N1bWVudERyYWZ0OyB0YXNrSWQ/OiBzdHJpbmc7IGRvY3VtZW50SWQ/OiBzdHJpbmc7IHJlY29yZD86IEdlbmVyYXRlZERvY3VtZW50UmVjb3JkIH0+KCcvYXBpL2RvY3VtZW50cy9nZW5lcmF0ZScsIHsgbWV0aG9kOiAnUE9TVCcsIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LCBib2R5OiBKU09OLnN0cmluZ2lmeShpbnB1dCkgfSk7XG59XG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0R2VuZXJhdGVkRG9jdW1lbnRzKHByb2plY3RSb290Pzogc3RyaW5nKSB7XG4gIGNvbnN0IHAgPSBwcm9qZWN0Um9vdCA/IGA/cHJvamVjdFJvb3Q9JHtlbmNvZGVVUklDb21wb25lbnQocHJvamVjdFJvb3QpfWAgOiAnJztcbiAgcmV0dXJuIGZldGNoSnNvbjx7IGRvY3VtZW50czogR2VuZXJhdGVkRG9jdW1lbnRSZWNvcmRbXSB9PihgL2FwaS9kb2N1bWVudHMvZ2VuZXJhdGVkJHtwfWApO1xufVxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEdlbmVyYXRlZERvY3VtZW50KGlkOiBzdHJpbmcsIGxpdGUgPSBmYWxzZSwgcHJvamVjdFJvb3Q/OiBzdHJpbmcsIHNpZ25hbD86IEFib3J0U2lnbmFsKSB7XG4gIGNvbnN0IHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoKTtcbiAgaWYgKGxpdGUpIHBhcmFtcy5zZXQoJ2xpdGUnLCAnMScpO1xuICBpZiAocHJvamVjdFJvb3QpIHBhcmFtcy5zZXQoJ3Byb2plY3RSb290JywgcHJvamVjdFJvb3QpO1xuICBjb25zdCBxdWVyeSA9IHBhcmFtcy50b1N0cmluZygpID8gYD8ke3BhcmFtcy50b1N0cmluZygpfWAgOiAnJztcbiAgcmV0dXJuIGZldGNoSnNvbjx7IGRvY3VtZW50OiBHZW5lcmF0ZWREb2N1bWVudFJlY29yZCB9PihgL2FwaS9kb2N1bWVudHMvZ2VuZXJhdGVkLyR7ZW5jb2RlVVJJQ29tcG9uZW50KGlkKX0ke3F1ZXJ5fWAsIHsgc2lnbmFsIH0pO1xufVxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZUdlbmVyYXRlZERvY3VtZW50KGlkOiBzdHJpbmcsIHBhdGNoOiBQYXJ0aWFsPEdlbmVyYXRlZERvY3VtZW50UmVjb3JkPiwgcHJvamVjdFJvb3Q/OiBzdHJpbmcpIHtcbiAgY29uc3QgcCA9IHByb2plY3RSb290ID8gYD9wcm9qZWN0Um9vdD0ke2VuY29kZVVSSUNvbXBvbmVudChwcm9qZWN0Um9vdCl9YCA6ICcnO1xuICByZXR1cm4gZmV0Y2hKc29uPHsgZG9jdW1lbnQ6IEdlbmVyYXRlZERvY3VtZW50UmVjb3JkIH0+KGAvYXBpL2RvY3VtZW50cy9nZW5lcmF0ZWQvJHtlbmNvZGVVUklDb21wb25lbnQoaWQpfSR7cH1gLCB7IG1ldGhvZDogJ1BVVCcsIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LCBib2R5OiBKU09OLnN0cmluZ2lmeShwYXRjaCkgfSk7XG59XG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGVsZXRlR2VuZXJhdGVkRG9jdW1lbnQoaWQ6IHN0cmluZywgcHJvamVjdFJvb3Q/OiBzdHJpbmcpIHtcbiAgY29uc3QgcCA9IHByb2plY3RSb290ID8gYD9wcm9qZWN0Um9vdD0ke2VuY29kZVVSSUNvbXBvbmVudChwcm9qZWN0Um9vdCl9YCA6ICcnO1xuICByZXR1cm4gZmV0Y2hKc29uPHsgb2s6IGJvb2xlYW4gfT4oYC9hcGkvZG9jdW1lbnRzL2dlbmVyYXRlZC8ke2VuY29kZVVSSUNvbXBvbmVudChpZCl9JHtwfWAsIHsgbWV0aG9kOiAnREVMRVRFJyB9KTtcbn1cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhYm9ydEdlbmVyYXRlZERvY3VtZW50KGRvY3VtZW50SWQ6IHN0cmluZywgcHJvamVjdFJvb3Q/OiBzdHJpbmcpIHsgcmV0dXJuIGZldGNoSnNvbjx7IGRvY3VtZW50OiBHZW5lcmF0ZWREb2N1bWVudFJlY29yZCB9PignL2FwaS9kb2N1bWVudHMvZ2VuZXJhdGVkJywgeyBtZXRob2Q6ICdQT1NUJywgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgYWN0aW9uOiAnYWJvcnQnLCBkb2N1bWVudElkLCBwcm9qZWN0Um9vdCB9KSB9KTsgfVxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlc3VtZUdlbmVyYXRlZERvY3VtZW50KGRvY3VtZW50SWQ6IHN0cmluZywgcHJvamVjdFJvb3Q/OiBzdHJpbmcpIHsgcmV0dXJuIGZldGNoSnNvbjx7IHRhc2tJZDogc3RyaW5nOyBkb2N1bWVudElkOiBzdHJpbmc7IHJlY29yZDogR2VuZXJhdGVkRG9jdW1lbnRSZWNvcmQgfT4oJy9hcGkvZG9jdW1lbnRzL2dlbmVyYXRlZCcsIHsgbWV0aG9kOiAnUE9TVCcsIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LCBib2R5OiBKU09OLnN0cmluZ2lmeSh7IGFjdGlvbjogJ3Jlc3VtZScsIGRvY3VtZW50SWQsIHByb2plY3RSb290IH0pIH0pOyB9XG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0R2VuZXJhdGVkQXNzZXRzKHByb2plY3RSb290Pzogc3RyaW5nKSB7XG4gIGNvbnN0IHAgPSBwcm9qZWN0Um9vdCA/IGA/cHJvamVjdFJvb3Q9JHtlbmNvZGVVUklDb21wb25lbnQocHJvamVjdFJvb3QpfWAgOiAnJztcbiAgcmV0dXJuIGZldGNoSnNvbjx7IGFzc2V0czogR2VuZXJhdGVkQXNzZXRSZWNvcmRbXSB9PihgL2FwaS9hc3NldHMvZ2VuZXJhdGVkJHtwfWApO1xufVxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRlbGV0ZUdlbmVyYXRlZEFzc2V0KGlkOiBzdHJpbmcsIHByb2plY3RSb290Pzogc3RyaW5nKSB7XG4gIGNvbnN0IHAgPSBwcm9qZWN0Um9vdCA/IGAmcHJvamVjdFJvb3Q9JHtlbmNvZGVVUklDb21wb25lbnQocHJvamVjdFJvb3QpfWAgOiAnJztcbiAgcmV0dXJuIGZldGNoSnNvbjx7IG9rOiBib29sZWFuOyBhc3NldHM6IEdlbmVyYXRlZEFzc2V0UmVjb3JkW10gfT4oYC9hcGkvYXNzZXRzL2dlbmVyYXRlZD9pZD0ke2VuY29kZVVSSUNvbXBvbmVudChpZCl9JHtwfWAsIHsgbWV0aG9kOiAnREVMRVRFJyB9KTtcbn1cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBvcGVuR2VuZXJhdGVkQXNzZXQoaWQ6IHN0cmluZywgdGFyZ2V0OiAnZmlsZScgfCAnZGlyZWN0b3J5JywgcHJvamVjdFJvb3Q/OiBzdHJpbmcpIHsgcmV0dXJuIGZldGNoSnNvbjx7IG9rOiBib29sZWFuIH0+KCcvYXBpL2Fzc2V0cy9nZW5lcmF0ZWQnLCB7IG1ldGhvZDogJ1BPU1QnLCBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSwgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBpZCwgYWN0aW9uOiAnb3BlbicsIHRhcmdldCwgcHJvamVjdFJvb3QgfSkgfSk7IH1cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWdlbmVyYXRlRG9jdW1lbnRDaGFwdGVyKGlucHV0OiB7IHRlbXBsYXRlSWQ6IHN0cmluZzsgY2hhcHRlcklkOiBzdHJpbmc7IHJlcXVpcmVtZW50Pzogc3RyaW5nOyBtYXhFdmlkZW5jZVBlckNoYXB0ZXI/OiBudW1iZXI7IHByb2plY3RSb290Pzogc3RyaW5nOyBkb2N1bWVudElkPzogc3RyaW5nOyBjdXJyZW50TWFya2Rvd24/OiBzdHJpbmc7IGV4aXN0aW5nRmFjdHM/OiBzdHJpbmdbXSB9KSB7XG4gIHJldHVybiBmZXRjaEpzb248eyBjaGFwdGVyOiBEb2N1bWVudERyYWZ0Q2hhcHRlciB9PignL2FwaS9kb2N1bWVudHMvY2hhcHRlci9yZWdlbmVyYXRlJywgeyBtZXRob2Q6ICdQT1NUJywgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sIGJvZHk6IEpTT04uc3RyaW5naWZ5KGlucHV0KSB9KTtcbn1cbmV4cG9ydCBpbnRlcmZhY2UgUmVmaW5lU2VsZWN0aW9uIHsgc3RhcnQ6IG51bWJlcjsgZW5kOiBudW1iZXI7IHRleHQ/OiBzdHJpbmc7IH1cbmV4cG9ydCBpbnRlcmZhY2UgUmVmaW5lUGxhbiB7XG4gIHNjb3BlOiAnc2VsZWN0aW9uJyB8ICdzZWN0aW9uJyB8ICdjaGFwdGVyJyB8ICdkb2N1bWVudCc7XG4gIGFjdGlvbjogJ3BvbGlzaCcgfCAnZXhwYW5kJyB8ICdzdW1tYXJpemUnIHwgJ3JlcGxhY2UnIHwgJ2RlbGV0ZScgfCAnYWRkJyB8ICdyZXN0cnVjdHVyZScgfCAndGFibGUnO1xuICB0YXJnZXRUaXRsZT86IHN0cmluZztcbiAgdGFyZ2V0UmFuZ2U/OiB7IHN0YXJ0OiBudW1iZXI7IGVuZDogbnVtYmVyIH07XG4gIGJhc2VNYXJrZG93bkhhc2g/OiBzdHJpbmc7XG4gIHRhcmdldFRleHRIYXNoPzogc3RyaW5nO1xuICBjb25maWRlbmNlOiBudW1iZXI7XG4gIHN1bW1hcnk6IHN0cmluZztcbiAgbmVlZHNDb25maXJtYXRpb246IGJvb2xlYW47XG59XG5leHBvcnQgaW50ZXJmYWNlIFJlZmluZVJlc3VsdCB7IG1hcmtkb3duPzogc3RyaW5nOyBwbGFuPzogUmVmaW5lUGxhbjsgc3VtbWFyeT86IHN0cmluZzsgYmVmb3JlU25pcHBldD86IHN0cmluZzsgYWZ0ZXJTbmlwcGV0Pzogc3RyaW5nOyBjaGFuZ2VkQ2hhcnM/OiBudW1iZXI7IH1cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWZpbmVHZW5lcmF0ZWREb2N1bWVudChpbnB1dDogeyBtb2RlPzogJ3BsYW4nIHwgJ2FwcGx5JzsgdGl0bGU6IHN0cmluZzsgbWFya2Rvd246IHN0cmluZzsgaW5zdHJ1Y3Rpb246IHN0cmluZzsgZmFjdHM/OiBzdHJpbmdbXTsgY2hhcHRlcnM/OiBzdHJpbmdbXTsgc2VsZWN0aW9uPzogUmVmaW5lU2VsZWN0aW9uOyBjdXJzb3JPZmZzZXQ/OiBudW1iZXI7IHBsYW4/OiBSZWZpbmVQbGFuIH0pIHtcbiAgcmV0dXJuIGZldGNoSnNvbjxSZWZpbmVSZXN1bHQ+KCcvYXBpL2RvY3VtZW50cy9yZWZpbmUnLCB7IG1ldGhvZDogJ1BPU1QnLCBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSwgYm9keTogSlNPTi5zdHJpbmdpZnkoaW5wdXQpIH0pO1xufVxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldERvY3VtZW50RHJhZnRzKCkgeyByZXR1cm4gZmV0Y2hKc29uPHsgZHJhZnRzOiBTdG9yZWREb2N1bWVudERyYWZ0W10gfT4oJy9hcGkvZG9jdW1lbnRzL2RyYWZ0cycpOyB9XG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2F2ZURvY3VtZW50RHJhZnQoZHJhZnQ6IEdlbmVyYXRlZERvY3VtZW50RHJhZnQsIGlkPzogc3RyaW5nKSB7XG4gIHJldHVybiBmZXRjaEpzb248eyBkcmFmdDogU3RvcmVkRG9jdW1lbnREcmFmdCB9PignL2FwaS9kb2N1bWVudHMvZHJhZnRzJywgeyBtZXRob2Q6ICdQT1NUJywgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgZHJhZnQsIGlkIH0pIH0pO1xufVxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGV4cG9ydERvY3VtZW50KGlucHV0OiB7IGRvY3VtZW50SWQ/OiBzdHJpbmc7IHRpdGxlPzogc3RyaW5nOyBtYXJrZG93bj86IHN0cmluZzsgZm9ybWF0OiAnbWFya2Rvd24nIHwgJ2h0bWwnIHwgJ3BkZicgfCAnZG9jeCc7IGVuZm9yY2VHYXRlPzogYm9vbGVhbjsgdXNlQ2xpZW50TWFya2Rvd24/OiBib29sZWFuOyBleHBvcnRHYXRlPzogRXhwb3J0R2F0ZVJlc3VsdDsgd29yZFRlbXBsYXRlUGF0aD86IHN0cmluZzsgcHJvamVjdFJvb3Q/OiBzdHJpbmcgfSkge1xuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKCcvYXBpL2RvY3VtZW50cy9leHBvcnQnLCB7IG1ldGhvZDogJ1BPU1QnLCBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsIEFjY2VwdDogaW5wdXQuZm9ybWF0ID09PSAncGRmJyA/ICdhcHBsaWNhdGlvbi9wZGYnIDogJyovKicgfSwgYm9keTogSlNPTi5zdHJpbmdpZnkoaW5wdXQpIH0pO1xuICBjb25zdCBjb250ZW50VHlwZSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KCdjb250ZW50LXR5cGUnKSB8fCAnJztcbiAgY29uc3QgcGFyc2VFeHBvcnRFcnJvciA9IGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB0ZXh0ID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpO1xuICAgIGxldCBtZXNzYWdlID0gdGV4dCB8fCAn5a+85Ye65aSx6LSlJztcbiAgICB0cnkge1xuICAgICAgY29uc3QgcGFyc2VkID0gSlNPTi5wYXJzZSh0ZXh0KSBhcyB7IGVycm9yPzogc3RyaW5nOyBtZXNzYWdlPzogc3RyaW5nOyBpc3N1ZXM/OiBBcnJheTx7IG1lc3NhZ2U/OiBzdHJpbmcgfT4gfTtcbiAgICAgIGNvbnN0IGlzc3VlVGV4dCA9IHBhcnNlZC5pc3N1ZXM/Lm1hcChpc3N1ZSA9PiBpc3N1ZS5tZXNzYWdlKS5maWx0ZXIoQm9vbGVhbikuc2xpY2UoMCwgMykuam9pbign77ybJyk7XG4gICAgICBtZXNzYWdlID0gaXNzdWVUZXh0ID8gYCR7cGFyc2VkLmVycm9yIHx8ICflr7zlh7rlpLHotKUnfe+8miR7aXNzdWVUZXh0fWAgOiBwYXJzZWQubWVzc2FnZSB8fCBwYXJzZWQuZXJyb3IgfHwgbWVzc2FnZTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIOS/neeVmeWOn+Wni+WTjeW6lOaWh+acrFxuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZS5sZW5ndGggPiAzMDAgPyBgJHttZXNzYWdlLnNsaWNlKDAsIDMwMCl9Li4uYCA6IG1lc3NhZ2UpO1xuICB9O1xuICBpZiAoIXJlc3BvbnNlLm9rKSBhd2FpdCBwYXJzZUV4cG9ydEVycm9yKCk7XG4gIGlmIChpbnB1dC5mb3JtYXQgPT09ICdwZGYnICYmICFjb250ZW50VHlwZS5pbmNsdWRlcygnYXBwbGljYXRpb24vcGRmJykpIGF3YWl0IHBhcnNlRXhwb3J0RXJyb3IoKTtcbiAgaWYgKGlucHV0LmZvcm1hdCA9PT0gJ2RvY3gnICYmICFjb250ZW50VHlwZS5pbmNsdWRlcygnb2ZmaWNlZG9jdW1lbnQud29yZHByb2Nlc3NpbmdtbC5kb2N1bWVudCcpKSBhd2FpdCBwYXJzZUV4cG9ydEVycm9yKCk7XG4gIHJldHVybiByZXNwb25zZS5ibG9iKCk7XG59XG5cbi8vIOKVkOKVkOKVkOKVkOKVkOKVkOKVkCDmqKHlnovphY3nva4g4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQXG5cbmV4cG9ydCBpbnRlcmZhY2UgTW9kZWxDYXBhYmlsaXRpZXMgeyBpbWFnZUdlbmVyYXRpb24/OiBib29sZWFuOyBpbWFnZVVuZGVyc3RhbmRpbmc/OiBib29sZWFuOyBmaWxlVW5kZXJzdGFuZGluZz86IGJvb2xlYW47IGF1ZGlvPzogYm9vbGVhbjsgdmlkZW8/OiBib29sZWFuOyB9XG5leHBvcnQgaW50ZXJmYWNlIFByb3ZpZGVySW5mbyB7IG5hbWU6IHN0cmluZzsgYXBpS2V5Pzogc3RyaW5nOyBiYXNlVXJsPzogc3RyaW5nOyBwcm90b2NvbD86IHN0cmluZzsgZGlyZWN0RW5kcG9pbnQ/OiBib29sZWFuOyBkZXRlY3RlZFByb3RvY29sOiBzdHJpbmc7IGhhc0FwaUtleTogYm9vbGVhbjsgY2FwYWJpbGl0aWVzPzogTW9kZWxDYXBhYmlsaXRpZXM7IH1cbmV4cG9ydCBpbnRlcmZhY2UgTW9kZWxzQ29uZmlnIHsgcmVhZGVyOiB7IGFjdGl2ZTogc3RyaW5nOyBsaXN0OiB7IG5hbWU6IHN0cmluZzsgcHJvdmlkZXI6IHN0cmluZyB9W10gfTsgcmVhc29uaW5nOiB7IGFjdGl2ZTogc3RyaW5nOyBsaXN0OiB7IG5hbWU6IHN0cmluZzsgcHJvdmlkZXI6IHN0cmluZyB9W10gfTsgYWN0aW9uOiB7IGFjdGl2ZTogc3RyaW5nOyBsaXN0OiB7IG5hbWU6IHN0cmluZzsgcHJvdmlkZXI6IHN0cmluZyB9W10gfTsgfVxuZXhwb3J0IGludGVyZmFjZSBFbWJlZGRpbmdDb25maWcgeyBwcm92aWRlcjogJ29wZW5haS1jb21wYXRpYmxlJyB8ICd0cmFuc2Zvcm1lcnMtbG9jYWwnOyBiYXNlVXJsPzogc3RyaW5nOyBhcGlLZXk/OiBzdHJpbmc7IG1vZGVsPzogc3RyaW5nOyBkaW1lbnNpb25zPzogbnVtYmVyOyBoYXNBcGlLZXk/OiBib29sZWFuOyB9XG5leHBvcnQgaW50ZXJmYWNlIFdlYkFjY2Vzc0NvbmZpZyB7IGVuYWJsZWQ6IGJvb2xlYW47IGFsbG93UHJvamVjdEZhY3RzOiBmYWxzZTsgbWF4UXVlcmllc1BlckNoYXB0ZXI6IG51bWJlcjsgbWF4UmVzdWx0c1BlclF1ZXJ5OiBudW1iZXI7IHRydXN0ZWREb21haW5zOiBzdHJpbmdbXTsgfVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0UHJvdmlkZXJzKCkgeyByZXR1cm4gZmV0Y2hKc29uPFByb3ZpZGVySW5mb1tdPignL2FwaS9jb25maWcvcHJvdmlkZXJzJyk7IH1cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzYXZlUHJvdmlkZXIobmFtZTogc3RyaW5nLCBjZmc6IHsgYXBpS2V5Pzogc3RyaW5nOyBiYXNlVXJsPzogc3RyaW5nOyBwcm90b2NvbD86IHN0cmluZzsgZGlyZWN0RW5kcG9pbnQ/OiBib29sZWFuOyBjYXBhYmlsaXRpZXM/OiBNb2RlbENhcGFiaWxpdGllczsgb2xkTmFtZT86IHN0cmluZyB9KSB7XG4gIHJldHVybiBmZXRjaEpzb248eyBzdWNjZXNzOiBib29sZWFuIH0+KCcvYXBpL2NvbmZpZy9wcm92aWRlcnMnLCB7IG1ldGhvZDogJ1BPU1QnLCBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSwgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBuYW1lLCAuLi5jZmcgfSkgfSk7XG59XG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGVsZXRlUHJvdmlkZXIobmFtZTogc3RyaW5nKSB7IHJldHVybiBmZXRjaEpzb248eyBzdWNjZXNzOiBib29sZWFuIH0+KGAvYXBpL2NvbmZpZy9wcm92aWRlcnMvJHtlbmNvZGVVUklDb21wb25lbnQobmFtZSl9YCwgeyBtZXRob2Q6ICdERUxFVEUnIH0pOyB9XG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0TW9kZWxzKCkgeyByZXR1cm4gZmV0Y2hKc29uPE1vZGVsc0NvbmZpZz4oJy9hcGkvY29uZmlnL21vZGVscycpOyB9XG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2F2ZU1vZGVscyhtb2RlbHM6IE1vZGVsc0NvbmZpZykge1xuICByZXR1cm4gZmV0Y2hKc29uPHsgc3VjY2VzczogYm9vbGVhbiB9PignL2FwaS9jb25maWcvbW9kZWxzJywgeyBtZXRob2Q6ICdQVVQnLCBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSwgYm9keTogSlNPTi5zdHJpbmdpZnkobW9kZWxzKSB9KTtcbn1cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRFbWJlZGRpbmdDb25maWcoKSB7IHJldHVybiBmZXRjaEpzb248RW1iZWRkaW5nQ29uZmlnPignL2FwaS9jb25maWcvZW1iZWRkaW5nJyk7IH1cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzYXZlRW1iZWRkaW5nQ29uZmlnKGNvbmZpZzogRW1iZWRkaW5nQ29uZmlnKSB7XG4gIHJldHVybiBmZXRjaEpzb248RW1iZWRkaW5nQ29uZmlnPignL2FwaS9jb25maWcvZW1iZWRkaW5nJywgeyBtZXRob2Q6ICdQVVQnLCBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSwgYm9keTogSlNPTi5zdHJpbmdpZnkoY29uZmlnKSB9KTtcbn1cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBlbWJlZGRpbmdIZWFsdGhDaGVjaygpIHtcbiAgcmV0dXJuIGZldGNoSnNvbjx7IHN1Y2Nlc3M6IGJvb2xlYW47IG1lc3NhZ2U6IHN0cmluZzsgbGF0ZW5jeU1zPzogbnVtYmVyIH0+KCcvYXBpL2NvbmZpZy9lbWJlZGRpbmcvaGVhbHRoQ2hlY2snLCB7IG1ldGhvZDogJ1BPU1QnIH0pO1xufVxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFdlYkFjY2Vzc0NvbmZpZygpIHsgcmV0dXJuIGZldGNoSnNvbjxXZWJBY2Nlc3NDb25maWc+KCcvYXBpL2NvbmZpZy93ZWItYWNjZXNzJyk7IH1cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzYXZlV2ViQWNjZXNzQ29uZmlnKGNvbmZpZzogUGFydGlhbDxXZWJBY2Nlc3NDb25maWc+KSB7XG4gIHJldHVybiBmZXRjaEpzb248V2ViQWNjZXNzQ29uZmlnPignL2FwaS9jb25maWcvd2ViLWFjY2VzcycsIHsgbWV0aG9kOiAnUFVUJywgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sIGJvZHk6IEpTT04uc3RyaW5naWZ5KGNvbmZpZykgfSk7XG59XG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaGVhbHRoQ2hlY2socHJvdmlkZXJOYW1lOiBzdHJpbmcpIHtcbiAgcmV0dXJuIGZldGNoSnNvbjx7IHN1Y2Nlc3M6IGJvb2xlYW47IG1lc3NhZ2U6IHN0cmluZzsgcmVxdWVzdElkPzogc3RyaW5nOyBtb2RlbE5hbWU/OiBzdHJpbmcgfT4oJy9hcGkvY29uZmlnL2hlYWx0aENoZWNrJywgeyBtZXRob2Q6ICdQT1NUJywgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgcHJvdmlkZXI6IHByb3ZpZGVyTmFtZSB9KSB9KTtcbn1cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRIZWFsdGgoKSB7IHJldHVybiBmZXRjaEpzb248eyBzdGF0dXM6IHN0cmluZzsgdXB0aW1lOiBudW1iZXIgfT4oJy9hcGkvaGVhbHRoJyk7IH1cblxuLy8g4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQIOezu+e7n+e7n+iuoSDilZDilZDilZDilZDilZDilZDilZBcblxuZXhwb3J0IGludGVyZmFjZSBTeXN0ZW1TdGF0cyB7XG4gIGNwdTogeyB1c2FnZVBlcmNlbnQ6IG51bWJlcjsgY29yZXM6IG51bWJlciB9O1xuICBtZW1vcnk6IHsgdG90YWxNQjogbnVtYmVyOyB1c2VkTUI6IG51bWJlcjsgcHJvY2Vzc01COiBudW1iZXI7IHVzYWdlUGVyY2VudDogbnVtYmVyIH07XG4gIHRva2VuczogeyB0b3RhbDogbnVtYmVyOyBwcm9tcHQ6IG51bWJlcjsgY29tcGxldGlvbjogbnVtYmVyIH07XG4gIG1vZGVsczogeyBwcm92aWRlcjogc3RyaW5nOyBtb2RlbDogc3RyaW5nOyBjb3VudDogbnVtYmVyIH1bXTtcbiAgdGFza3M6IHsgdG90YWw6IG51bWJlcjsgc3VjY2VzczogbnVtYmVyOyBmYWlsZWQ6IG51bWJlcjsgcnVubmluZzogbnVtYmVyOyB0eXBlczogUmVjb3JkPHN0cmluZywgbnVtYmVyPiB9O1xuICBsb2dzOiB7IGZpbGVzOiBudW1iZXI7IGV2ZW50czogbnVtYmVyOyBsYXRlc3RBdD86IHN0cmluZzsgc2Nhbm5lZERpcnM6IHN0cmluZ1tdIH07XG4gIHVwdGltZTogbnVtYmVyO1xufVxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFN5c3RlbVN0YXRzKCkgeyByZXR1cm4gZmV0Y2hKc29uPFN5c3RlbVN0YXRzPignL2FwaS9zeXN0ZW0vc3RhdHMnKTsgfVxuXG5leHBvcnQgaW50ZXJmYWNlIEVycm9yTG9nRW50cnkge1xuICBpZDogc3RyaW5nO1xuICBsZXZlbDogJ2Vycm9yJyB8ICd3YXJuJyB8ICdpbmZvJztcbiAgc291cmNlOiBzdHJpbmc7XG4gIGZ1bmN0aW9uTmFtZT86IHN0cmluZztcbiAgbWVzc2FnZTogc3RyaW5nO1xuICBzdGFjaz86IHN0cmluZztcbiAgcmVxdWVzdD86IHsgbWV0aG9kPzogc3RyaW5nOyB1cmw/OiBzdHJpbmc7IHF1ZXJ5PzogdW5rbm93biB9O1xuICBtZXRhPzogdW5rbm93bjtcbiAgY3JlYXRlZEF0OiBudW1iZXI7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRFcnJvckxvZ3MobGltaXQgPSAyMDApIHsgcmV0dXJuIGZldGNoSnNvbjx7IGxvZ3M6IEVycm9yTG9nRW50cnlbXSB9PihgL2FwaS9zeXN0ZW0vbG9ncz9saW1pdD0ke2xpbWl0fWApOyB9XG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY2xlYXJFcnJvckxvZ3MoKSB7IHJldHVybiBmZXRjaEpzb248eyBvazogdHJ1ZSB9PignL2FwaS9zeXN0ZW0vbG9ncycsIHsgbWV0aG9kOiAnREVMRVRFJyB9KTsgfVxuXG4vLyDilZDilZDilZDilZDilZDilZDilZAg5o+Q56S66K+NIOKVkOKVkOKVkOKVkOKVkOKVkOKVkFxuLy8gKOWNoeeJh+W8jyBBUEnvvIznm7TmjqXlnKggcHJvbXB0IOmhtemdouS4remAmui/hyBmZXRjaCDkvb/nlKgpXG5cbi8vIOKVkOKVkOKVkOKVkOKVkOKVkOKVkCDnn6Xor4blupPliIbnsbvnu5/orqEg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQXG5cbmV4cG9ydCBpbnRlcmZhY2UgS2JDYXRlZ29yeVN0YXRzIHtcbiAgY2F0ZWdvcnk6IHN0cmluZzsgZmlsZUNvdW50OiBudW1iZXI7IHRvdGFsU2l6ZTogbnVtYmVyO1xufVxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEtiQ2F0ZWdvcnlTdGF0cyhwcm9qZWN0Um9vdD86IHN0cmluZykge1xuICBjb25zdCBwID0gcHJvamVjdFJvb3QgPyBgP3Byb2plY3RSb290PSR7ZW5jb2RlVVJJQ29tcG9uZW50KHByb2plY3RSb290KX1gIDogJyc7XG4gIHJldHVybiBmZXRjaEpzb248S2JDYXRlZ29yeVN0YXRzW10+KGAvYXBpL2tiL2NhdGVnb3JpZXMke3B9YCk7XG59XG5cbi8vIOKVkOKVkOKVkOKVkOKVkOKVkOKVkCDkvpvlupTllYbor6bmg4Ug4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0UHJvdmlkZXJEZXRhaWwobmFtZTogc3RyaW5nKSB7XG4gIHJldHVybiBmZXRjaEpzb248UHJvdmlkZXJJbmZvPihgL2FwaS9jb25maWcvcHJvdmlkZXJzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KG5hbWUpfWApO1xufVxuIl0sIm5hbWVzIjpbImZldGNoSnNvbiIsInVybCIsIm9wdGlvbnMiLCJyZXMiLCJmZXRjaCIsIm9rIiwiYm9keSIsInRleHQiLCJtZXNzYWdlIiwic3RhdHVzIiwicGFyc2VkIiwiSlNPTiIsInBhcnNlIiwiZXJyb3IiLCJodG1sRXJyb3IiLCJtYXRjaCIsIm5leHREYXRhIiwicmVwbGFjZSIsImVyciIsIkVycm9yIiwianNvbiIsImdldEtiU3RhdHMiLCJwcm9qZWN0Um9vdCIsInAiLCJlbmNvZGVVUklDb21wb25lbnQiLCJnZXRLYkZpbGVzIiwib3B0cyIsInBhcmFtcyIsIlVSTFNlYXJjaFBhcmFtcyIsInNldCIsImNhdGVnb3J5IiwicGFnZSIsIlN0cmluZyIsImxpbWl0IiwiZ2V0S2JGaWxlc1RyZWUiLCJwYXJlbnRQYXRoIiwic2VhcmNoS2JGaWxlcyIsInF1ZXJ5IiwiaW5jbHVkZUNvbnRlbnQiLCJldmFsdWF0ZUtiUmV0cmlldmFsIiwibWV0aG9kIiwiaGVhZGVycyIsInN0cmluZ2lmeSIsImdldEtiRmlsZURldGFpbCIsInJlbGF0aXZlUGF0aCIsInJlaW5kZXhLYkZpbGUiLCJvcGVuS2JGaWxlVGFyZ2V0IiwidGFyZ2V0IiwiZmlsZVJlbGF0aXZlUGF0aCIsImZpbGUiLCJ3ZWJraXRSZWxhdGl2ZVBhdGgiLCJuYW1lIiwiYXBwZW5kVXBsb2FkRm9ybSIsImZpbGVzIiwiZm9ybSIsIkZvcm1EYXRhIiwiYXBwZW5kIiwidXBsb2FkSWQiLCJiYXRjaEluZGV4IiwidG90YWxCYXRjaGVzIiwiZmlsZU9mZnNldCIsInN0YXJ0SW5kZXgiLCJ1cGxvYWRDb21wbGV0ZSIsInVwbG9hZEtiRmlsZSIsInVwbG9hZEtiRmlsZXMiLCJvbkJhdGNoUHJvZ3Jlc3MiLCJtYXhGaWxlc1BlckJhdGNoIiwiTnVtYmVyIiwicHJvY2VzcyIsImVudiIsIk5FWFRfUFVCTElDX0NVU1RPTUlaRV9LQl9VUExPQURfQkFUQ0hfRklMRVMiLCJtYXhCeXRlc1BlckJhdGNoIiwiTkVYVF9QVUJMSUNfQ1VTVE9NSVpFX0tCX1VQTE9BRF9CQVRDSF9CWVRFUyIsIm1heENvbmN1cnJlbnRCYXRjaGVzIiwiTWF0aCIsIm1heCIsIm1pbiIsIk5FWFRfUFVCTElDX0NVU1RPTUlaRV9LQl9VUExPQURfQ09OQ1VSUkVOQ1kiLCJiYXRjaGVzIiwiY3VycmVudCIsImN1cnJlbnRCeXRlcyIsImN1cnJlbnRPZmZzZXQiLCJuZXh0T2Zmc2V0IiwibGVuZ3RoIiwic2l6ZSIsInB1c2giLCJvZmZzZXQiLCJyZXN1bHRzIiwiY29tcGxldGVkRmlsZXMiLCJjdXJzb3IiLCJ1cGxvYWRCYXRjaCIsImJhdGNoIiwicmVzdWx0IiwidXBsb2FkZWRGaWxlcyIsInRvdGFsRmlsZXMiLCJ3b3JrZXJzIiwiQXJyYXkiLCJmcm9tIiwiUHJvbWlzZSIsImFsbCIsImZpbHRlciIsIkJvb2xlYW4iLCJhdCIsInN1Y2Nlc3MiLCJnZXRLYlVwbG9hZFByb2dyZXNzIiwiZ2V0S2JPcGVyYXRpb25zIiwiZ2V0Sm9icyIsImFjdGl2ZSIsImdldEpvYiIsImlkIiwiY2xlYXJLYk9wZXJhdGlvbnMiLCJkZWxldGVLYk9wZXJhdGlvbiIsImRlbGV0ZUtiRmlsZSIsImRlbGV0ZUtiRmlsZXMiLCJyZWxhdGl2ZVBhdGhzIiwiZGVsZXRlS2JGb2xkZXJzIiwiZm9sZGVyUGF0aHMiLCJkZWxldGVLYlNlbGVjdGlvbiIsImRlbGV0ZUFsbEtiRmlsZXMiLCJyZWluZGV4S2IiLCJnZXRSZWluZGV4U3RhdHVzIiwiZ2V0S2JUYWdzIiwiZ2V0S2JJZ25vcmVSdWxlcyIsInNhdmVLYklnbm9yZVJ1bGVzIiwicnVsZXMiLCJnZXRLYkR1cGxpY2F0ZXMiLCJnZXRLYkZlYXR1cmVzIiwic2VhcmNoS2IiLCJxIiwid2VpZ2h0cyIsImtleXdvcmQiLCJ2ZWN0b3IiLCJyZXdyaXRlIiwiaHlicmlkQm9udXMiLCJnZXRQcm9tcHRQcm9qZWN0cyIsImdldERvY3VtZW50Um9sZXMiLCJ0eXBlIiwic2F2ZURvY3VtZW50Um9sZSIsInJvbGUiLCJkZWxldGVEb2N1bWVudFJvbGUiLCJzYXZlUHJvamVjdFJvbGVDb25maWciLCJjb25maWciLCJkZWxldGVQcm9qZWN0Um9sZUNvbmZpZyIsImdldERvY3VtZW50VGVtcGxhdGVzIiwidmFsaWRhdGVEb2N1bWVudFRlbXBsYXRlIiwidGVtcGxhdGVJZCIsInNhdmVEb2N1bWVudFRlbXBsYXRlIiwidGVtcGxhdGUiLCJkZWxldGVEb2N1bWVudFRlbXBsYXRlIiwiZHVwbGljYXRlRG9jdW1lbnRUZW1wbGF0ZSIsImdlbmVyYXRlRG9jdW1lbnREcmFmdCIsImlucHV0IiwiZ2V0R2VuZXJhdGVkRG9jdW1lbnRzIiwiZ2V0R2VuZXJhdGVkRG9jdW1lbnQiLCJsaXRlIiwic2lnbmFsIiwidG9TdHJpbmciLCJ1cGRhdGVHZW5lcmF0ZWREb2N1bWVudCIsInBhdGNoIiwiZGVsZXRlR2VuZXJhdGVkRG9jdW1lbnQiLCJhYm9ydEdlbmVyYXRlZERvY3VtZW50IiwiZG9jdW1lbnRJZCIsImFjdGlvbiIsInJlc3VtZUdlbmVyYXRlZERvY3VtZW50IiwiZ2V0R2VuZXJhdGVkQXNzZXRzIiwiZGVsZXRlR2VuZXJhdGVkQXNzZXQiLCJvcGVuR2VuZXJhdGVkQXNzZXQiLCJyZWdlbmVyYXRlRG9jdW1lbnRDaGFwdGVyIiwicmVmaW5lR2VuZXJhdGVkRG9jdW1lbnQiLCJnZXREb2N1bWVudERyYWZ0cyIsInNhdmVEb2N1bWVudERyYWZ0IiwiZHJhZnQiLCJleHBvcnREb2N1bWVudCIsInJlc3BvbnNlIiwiQWNjZXB0IiwiZm9ybWF0IiwiY29udGVudFR5cGUiLCJnZXQiLCJwYXJzZUV4cG9ydEVycm9yIiwiaXNzdWVUZXh0IiwiaXNzdWVzIiwibWFwIiwiaXNzdWUiLCJzbGljZSIsImpvaW4iLCJpbmNsdWRlcyIsImJsb2IiLCJnZXRQcm92aWRlcnMiLCJzYXZlUHJvdmlkZXIiLCJjZmciLCJkZWxldGVQcm92aWRlciIsImdldE1vZGVscyIsInNhdmVNb2RlbHMiLCJtb2RlbHMiLCJnZXRFbWJlZGRpbmdDb25maWciLCJzYXZlRW1iZWRkaW5nQ29uZmlnIiwiZW1iZWRkaW5nSGVhbHRoQ2hlY2siLCJnZXRXZWJBY2Nlc3NDb25maWciLCJzYXZlV2ViQWNjZXNzQ29uZmlnIiwiaGVhbHRoQ2hlY2siLCJwcm92aWRlck5hbWUiLCJwcm92aWRlciIsImdldEhlYWx0aCIsImdldFN5c3RlbVN0YXRzIiwiZ2V0RXJyb3JMb2dzIiwiY2xlYXJFcnJvckxvZ3MiLCJnZXRLYkNhdGVnb3J5U3RhdHMiLCJnZXRQcm92aWRlckRldGFpbCJdLCJpZ25vcmVMaXN0IjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/lib/api.ts\n");
155
155
 
156
156
  /***/ }),
157
157
 
@@ -1 +1 @@
1
- "use strict";exports.id=1928,exports.ids=[1928],exports.modules={61928:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.r(b),c.d(b,{default:()=>m});var e=c(8732),f=c(82015),g=c(94487),h=c(60056),i=c(79270),j=c(22147),k=a([g]);function l({title:a,value:b,subtext:c,icon:d,colorClass:f,animationClass:g}){return(0,e.jsxs)("div",{className:`p-4 animateFadeIn flex flex-col justify-between border-l-2 border-transparent hover:border-[var(--colorBrand)] transition-colors ${g||""}`,style:{opacity:0},children:[(0,e.jsxs)("div",{className:"flex items-start justify-between mb-2",children:[(0,e.jsx)("div",{className:"text-xs font-semibold text-[var(--colorTextSecondary)] tracking-wide uppercase",children:a}),d&&(0,e.jsx)("div",{className:f,style:{opacity:.7},children:d})]}),(0,e.jsxs)("div",{children:[(0,e.jsx)("div",{className:"text-3xl font-bold tracking-tight",children:b}),c&&(0,e.jsx)("div",{className:"text-xs mt-1 truncate font-medium",style:{color:"var(--colorTextTertiary)"},children:c})]})]})}function m(){let a=(0,g.Vr)(),[b,c]=(0,f.useState)(null),[d,k]=(0,f.useState)(!0),[m,n]=(0,f.useState)(0),[o,p]=(0,f.useState)(0),[q,r]=(0,f.useState)(0),[s,t]=(0,f.useState)(0),[u,v]=(0,f.useState)(null),w=(0,f.useCallback)(async()=>{k(!0);try{let[a,b,d,e,f]=await Promise.all([(0,j.FC)(),(0,j.Z3)().catch(()=>[]),(0,j.lv)().catch(()=>({roles:[],configs:[]})),(0,j.Dl)().catch(()=>({templates:[]})),(0,j.II)().catch(()=>null)]);c(a),n(Array.isArray(b)?b.length:0);let g=Array.isArray(d.roles)?d.roles:[];p(g.filter(a=>"file"===a.type).length),r(g.filter(a=>"prompt"===a.type).length),t(Array.isArray(e.templates)?e.templates.length:0),v(f)}catch{}finally{k(!1)}},[]),x=b?.tasks.total?Math.round(b.tasks.success/b.tasks.total*100):0,y=b?.models?.[0],z=b?.logs.latestAt?new Date(b.logs.latestAt).toLocaleString():a("overview.noLogs");return(0,e.jsxs)("div",{className:"space-y-12",children:[(0,e.jsxs)("div",{className:"flex flex-col sm:flex-row sm:items-end justify-between gap-4 pb-6 border-b border-[var(--borderColor)]",children:[(0,e.jsxs)("div",{children:[(0,e.jsx)("h1",{className:"text-3xl font-extrabold tracking-tight text-[var(--colorText)] mb-2",children:a("overview.title")}),(0,e.jsx)("p",{className:"text-sm text-[var(--colorTextSecondary)]",children:a("overview.description")})]}),(0,e.jsxs)(h.Space,{children:[(0,e.jsxs)("span",{className:"text-xs font-mono",style:{color:"var(--colorTextTertiary)"},children:[a("overview.updated"),": ",z]}),(0,e.jsx)(h.Button,{type:"text",icon:(0,e.jsx)(i.ReloadOutlined,{spin:d}),onClick:()=>{w()}})]})]}),(0,e.jsxs)("div",{className:"grid grid-cols-2 lg:grid-cols-4 gap-8 divide-x border-b pb-8 border-[var(--borderColor)] divide-[var(--borderColor)] -mx-4 px-4",children:[(0,e.jsx)(l,{title:a("overview.uptime"),value:`${b?Math.floor(b.uptime/3600):0}h`,icon:(0,e.jsx)(i.ApiOutlined,{size:16}),colorClass:"text-[var(--colorBrand)]",animationClass:"stagger-1"}),(0,e.jsx)(l,{title:a("overview.tokensUsed"),value:(b?.tokens.total??0).toLocaleString(),subtext:`P ${b?.tokens.prompt??0} / C ${b?.tokens.completion??0}`,icon:(0,e.jsx)(i.ThunderboltOutlined,{size:16}),colorClass:"text-[var(--colorWarn)]",animationClass:"stagger-2"}),(0,e.jsx)(l,{title:a("overview.tasksTotal"),value:(b?.tasks.total??0).toLocaleString(),subtext:`✓ ${b?.tasks.success??0} | ✗ ${b?.tasks.failed??0} | ↻ ${b?.tasks.running??0}`,icon:(0,e.jsx)(i.FileTextOutlined,{size:16}),colorClass:"text-[var(--colorInfo)]",animationClass:"stagger-3"}),(0,e.jsx)(l,{title:a("overview.successRate"),value:`${x}%`,icon:x>80?(0,e.jsx)(i.CheckCircleOutlined,{size:16}):(0,e.jsx)(i.CloseCircleOutlined,{size:16}),colorClass:x>80?"text-[var(--colorOk)]":"text-[var(--colorDanger)]",animationClass:"stagger-4"})]}),(0,e.jsxs)("div",{children:[(0,e.jsx)("h2",{className:"text-sm font-semibold mb-6 uppercase tracking-wider text-[var(--colorTextSecondary)] animateFadeIn stagger-5",style:{opacity:0},children:a("overview.systemResources")}),(0,e.jsxs)("div",{className:"grid grid-cols-2 md:grid-cols-3 lg:grid-cols-6 gap-y-8 gap-x-4",children:[(0,e.jsx)(l,{title:a("overview.fileRoles"),value:o,animationClass:"stagger-5"}),(0,e.jsx)(l,{title:a("overview.promptRoles"),value:q,animationClass:"stagger-5"}),(0,e.jsx)(l,{title:a("overview.templateCount"),value:s,animationClass:"stagger-5"}),(0,e.jsx)(l,{title:a("overview.semanticModel"),value:u?.provider==="openai-compatible"?a("overview.external"):u?a("overview.local"):"—",subtext:u?.model??a("overview.notConfigured"),animationClass:"stagger-5"}),(0,e.jsx)(l,{title:a("overview.modelProviders"),value:m,animationClass:"stagger-5"}),(0,e.jsx)(l,{title:a("overview.auditLogs"),value:b?.logs.events??0,animationClass:"stagger-5"})]})]}),(0,e.jsxs)("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-12 pt-8 border-t border-[var(--borderColor)] animateFadeIn stagger-5",style:{opacity:0},children:[(0,e.jsxs)("div",{children:[(0,e.jsx)("div",{className:"text-sm font-semibold mb-6 uppercase tracking-wider text-[var(--colorTextSecondary)]",children:a("overview.hardwareUsage")}),(0,e.jsxs)("div",{className:"space-y-6",children:[(0,e.jsxs)("div",{className:"flex items-center gap-6",children:[(0,e.jsx)(h.Progress,{type:"dashboard",percent:b?.cpu.usagePercent??0,size:64,strokeColor:(b?.cpu.usagePercent??0)>80?"var(--colorDanger)":"var(--colorText)",strokeWidth:10}),(0,e.jsxs)("div",{children:[(0,e.jsx)("div",{className:"text-sm font-medium text-[var(--colorTextSecondary)]",children:a("overview.cpuUsage")}),(0,e.jsxs)("div",{className:"text-xl font-bold",children:[b?.cpu.usagePercent?.toFixed(1)??"0.0","%"]}),(0,e.jsxs)("div",{className:"text-xs text-[var(--colorTextTertiary)]",children:[b?.cpu.cores??0," ",a("overview.cores")]})]})]}),(0,e.jsxs)("div",{className:"flex items-center gap-6",children:[(0,e.jsx)(h.Progress,{type:"dashboard",percent:b?.memory.usagePercent??0,size:64,strokeColor:(b?.memory.usagePercent??0)>80?"var(--colorDanger)":"var(--colorTextSecondary)",strokeWidth:10}),(0,e.jsxs)("div",{children:[(0,e.jsx)("div",{className:"text-sm font-medium text-[var(--colorTextSecondary)]",children:a("overview.memoryUsage")}),(0,e.jsxs)("div",{className:"text-xl font-bold",children:[b?.memory.usagePercent??0,"%"]}),(0,e.jsxs)("div",{className:"text-xs text-[var(--colorTextTertiary)]",children:[b?.memory.processMB??0," MB / ",b?.memory.totalMB??0," MB"]})]})]})]})]}),(0,e.jsxs)("div",{children:[(0,e.jsx)("div",{className:"text-sm font-semibold mb-6 uppercase tracking-wider text-[var(--colorTextSecondary)]",children:a("overview.activityContext")}),(0,e.jsxs)("div",{className:"space-y-6",children:[(0,e.jsxs)("div",{children:[(0,e.jsx)("div",{className:"text-xs text-[var(--colorTextTertiary)] mb-1",children:a("overview.topModel")}),y?(0,e.jsxs)("div",{className:"font-semibold flex items-center gap-2",children:[(0,e.jsx)(i.RobotOutlined,{className:"text-[var(--colorTextSecondary)]"})," ",y.model,(0,e.jsxs)("span",{className:"font-normal text-[var(--colorTextTertiary)] text-sm",children:["@",y.provider]})]}):(0,e.jsx)("span",{className:"text-sm text-[var(--colorTextTertiary)]",children:a("overview.noDataAvailable")})]}),(0,e.jsxs)("div",{children:[(0,e.jsx)("div",{className:"text-xs text-[var(--colorTextTertiary)] mb-3",children:a("overview.recentTaskTypes")}),b?.tasks.types&&Object.keys(b.tasks.types).length>0?(0,e.jsx)("div",{className:"flex flex-wrap gap-2",children:Object.entries(b.tasks.types).sort((a,b)=>b[1]-a[1]).map(([a,b])=>(0,e.jsxs)("div",{className:"px-2 py-1 rounded text-xs font-mono bg-[var(--colorBgHover)] text-[var(--colorTextSecondary)]",children:[a.slice(0,30)," ",(0,e.jsx)("span",{className:"ml-2 font-bold text-[var(--colorText)]",children:b})]},a))}):(0,e.jsx)("span",{className:"text-sm text-[var(--colorTextTertiary)]",children:a("common.noData")})]})]})]})]})]})}g=(k.then?(await k)():k)[0],d()}catch(a){d(a)}})}};
1
+ "use strict";exports.id=1928,exports.ids=[1928],exports.modules={61928:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.r(b),c.d(b,{default:()=>m});var e=c(8732),f=c(82015),g=c(94487),h=c(60056),i=c(79270),j=c(22147),k=a([g]);function l({title:a,value:b,subtext:c,icon:d,colorClass:f,animationClass:g}){return(0,e.jsxs)("div",{className:`p-4 animateFadeIn flex flex-col justify-between border-l-2 border-transparent hover:border-[var(--colorBrand)] transition-colors ${g||""}`,style:{opacity:0},children:[(0,e.jsxs)("div",{className:"flex items-start justify-between mb-2",children:[(0,e.jsx)("div",{className:"text-xs font-semibold text-[var(--colorTextSecondary)] tracking-wide uppercase",children:a}),d&&(0,e.jsx)("div",{className:f,style:{opacity:.7},children:d})]}),(0,e.jsxs)("div",{children:[(0,e.jsx)("div",{className:"text-3xl font-bold tracking-tight",children:b}),c&&(0,e.jsx)("div",{className:"text-xs mt-1 truncate font-medium",style:{color:"var(--colorTextTertiary)"},children:c})]})]})}function m(){let a=(0,g.Vr)(),[b,c]=(0,f.useState)(null),[d,k]=(0,f.useState)(!0),[m,n]=(0,f.useState)(0),[o,p]=(0,f.useState)(0),[q,r]=(0,f.useState)(0),[s,t]=(0,f.useState)(null),u=(0,f.useCallback)(async()=>{k(!0);try{let[a,b,d,e,f]=await Promise.all([(0,j.FC)(),(0,j.Z3)().catch(()=>[]),(0,j.lv)().catch(()=>({roles:[],configs:[]})),(0,j.Dl)().catch(()=>({templates:[]})),(0,j.II)().catch(()=>null)]);c(a),n(Array.isArray(b)?b.length:0);let g=Array.isArray(d.roles)?d.roles:[];p(g.filter(a=>"prompt"===a.type).length),r(Array.isArray(e.templates)?e.templates.length:0),t(f)}catch{}finally{k(!1)}},[]),v=b?.tasks.total?Math.round(b.tasks.success/b.tasks.total*100):0,w=b?.models?.[0],x=b?.logs.latestAt?new Date(b.logs.latestAt).toLocaleString():a("overview.noLogs");return(0,e.jsxs)("div",{className:"space-y-12",children:[(0,e.jsxs)("div",{className:"flex flex-col sm:flex-row sm:items-end justify-between gap-4 pb-6 border-b border-[var(--borderColor)]",children:[(0,e.jsxs)("div",{children:[(0,e.jsx)("h1",{className:"text-3xl font-extrabold tracking-tight text-[var(--colorText)] mb-2",children:a("overview.title")}),(0,e.jsx)("p",{className:"text-sm text-[var(--colorTextSecondary)]",children:a("overview.description")})]}),(0,e.jsxs)(h.Space,{children:[(0,e.jsxs)("span",{className:"text-xs font-mono",style:{color:"var(--colorTextTertiary)"},children:[a("overview.updated"),": ",x]}),(0,e.jsx)(h.Button,{type:"text",icon:(0,e.jsx)(i.ReloadOutlined,{spin:d}),onClick:()=>{u()}})]})]}),(0,e.jsxs)("div",{className:"grid grid-cols-2 lg:grid-cols-4 gap-8 divide-x border-b pb-8 border-[var(--borderColor)] divide-[var(--borderColor)] -mx-4 px-4",children:[(0,e.jsx)(l,{title:a("overview.uptime"),value:`${b?Math.floor(b.uptime/3600):0}h`,icon:(0,e.jsx)(i.ApiOutlined,{size:16}),colorClass:"text-[var(--colorBrand)]",animationClass:"stagger-1"}),(0,e.jsx)(l,{title:a("overview.tokensUsed"),value:(b?.tokens.total??0).toLocaleString(),subtext:`P ${b?.tokens.prompt??0} / C ${b?.tokens.completion??0}`,icon:(0,e.jsx)(i.ThunderboltOutlined,{size:16}),colorClass:"text-[var(--colorWarn)]",animationClass:"stagger-2"}),(0,e.jsx)(l,{title:a("overview.tasksTotal"),value:(b?.tasks.total??0).toLocaleString(),subtext:`✓ ${b?.tasks.success??0} | ✗ ${b?.tasks.failed??0} | ↻ ${b?.tasks.running??0}`,icon:(0,e.jsx)(i.FileTextOutlined,{size:16}),colorClass:"text-[var(--colorInfo)]",animationClass:"stagger-3"}),(0,e.jsx)(l,{title:a("overview.successRate"),value:`${v}%`,icon:v>80?(0,e.jsx)(i.CheckCircleOutlined,{size:16}):(0,e.jsx)(i.CloseCircleOutlined,{size:16}),colorClass:v>80?"text-[var(--colorOk)]":"text-[var(--colorDanger)]",animationClass:"stagger-4"})]}),(0,e.jsxs)("div",{children:[(0,e.jsx)("h2",{className:"text-sm font-semibold mb-6 uppercase tracking-wider text-[var(--colorTextSecondary)] animateFadeIn stagger-5",style:{opacity:0},children:a("overview.systemResources")}),(0,e.jsxs)("div",{className:"grid grid-cols-2 md:grid-cols-3 lg:grid-cols-6 gap-y-8 gap-x-4",children:[(0,e.jsx)(l,{title:a("overview.materialUnderstanding"),value:"自动",animationClass:"stagger-5"}),(0,e.jsx)(l,{title:a("overview.promptRoles"),value:o,animationClass:"stagger-5"}),(0,e.jsx)(l,{title:a("overview.templateCount"),value:q,animationClass:"stagger-5"}),(0,e.jsx)(l,{title:a("overview.semanticModel"),value:s?.provider==="openai-compatible"?a("overview.external"):s?a("overview.local"):"—",subtext:s?.model??a("overview.notConfigured"),animationClass:"stagger-5"}),(0,e.jsx)(l,{title:a("overview.modelProviders"),value:m,animationClass:"stagger-5"}),(0,e.jsx)(l,{title:a("overview.auditLogs"),value:b?.logs.events??0,animationClass:"stagger-5"})]})]}),(0,e.jsxs)("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-12 pt-8 border-t border-[var(--borderColor)] animateFadeIn stagger-5",style:{opacity:0},children:[(0,e.jsxs)("div",{children:[(0,e.jsx)("div",{className:"text-sm font-semibold mb-6 uppercase tracking-wider text-[var(--colorTextSecondary)]",children:a("overview.hardwareUsage")}),(0,e.jsxs)("div",{className:"space-y-6",children:[(0,e.jsxs)("div",{className:"flex items-center gap-6",children:[(0,e.jsx)(h.Progress,{type:"dashboard",percent:b?.cpu.usagePercent??0,size:64,strokeColor:(b?.cpu.usagePercent??0)>80?"var(--colorDanger)":"var(--colorText)",strokeWidth:10}),(0,e.jsxs)("div",{children:[(0,e.jsx)("div",{className:"text-sm font-medium text-[var(--colorTextSecondary)]",children:a("overview.cpuUsage")}),(0,e.jsxs)("div",{className:"text-xl font-bold",children:[b?.cpu.usagePercent?.toFixed(1)??"0.0","%"]}),(0,e.jsxs)("div",{className:"text-xs text-[var(--colorTextTertiary)]",children:[b?.cpu.cores??0," ",a("overview.cores")]})]})]}),(0,e.jsxs)("div",{className:"flex items-center gap-6",children:[(0,e.jsx)(h.Progress,{type:"dashboard",percent:b?.memory.usagePercent??0,size:64,strokeColor:(b?.memory.usagePercent??0)>80?"var(--colorDanger)":"var(--colorTextSecondary)",strokeWidth:10}),(0,e.jsxs)("div",{children:[(0,e.jsx)("div",{className:"text-sm font-medium text-[var(--colorTextSecondary)]",children:a("overview.memoryUsage")}),(0,e.jsxs)("div",{className:"text-xl font-bold",children:[b?.memory.usagePercent??0,"%"]}),(0,e.jsxs)("div",{className:"text-xs text-[var(--colorTextTertiary)]",children:[b?.memory.processMB??0," MB / ",b?.memory.totalMB??0," MB"]})]})]})]})]}),(0,e.jsxs)("div",{children:[(0,e.jsx)("div",{className:"text-sm font-semibold mb-6 uppercase tracking-wider text-[var(--colorTextSecondary)]",children:a("overview.activityContext")}),(0,e.jsxs)("div",{className:"space-y-6",children:[(0,e.jsxs)("div",{children:[(0,e.jsx)("div",{className:"text-xs text-[var(--colorTextTertiary)] mb-1",children:a("overview.topModel")}),w?(0,e.jsxs)("div",{className:"font-semibold flex items-center gap-2",children:[(0,e.jsx)(i.RobotOutlined,{className:"text-[var(--colorTextSecondary)]"})," ",w.model,(0,e.jsxs)("span",{className:"font-normal text-[var(--colorTextTertiary)] text-sm",children:["@",w.provider]})]}):(0,e.jsx)("span",{className:"text-sm text-[var(--colorTextTertiary)]",children:a("overview.noDataAvailable")})]}),(0,e.jsxs)("div",{children:[(0,e.jsx)("div",{className:"text-xs text-[var(--colorTextTertiary)] mb-3",children:a("overview.recentTaskTypes")}),b?.tasks.types&&Object.keys(b.tasks.types).length>0?(0,e.jsx)("div",{className:"flex flex-wrap gap-2",children:Object.entries(b.tasks.types).sort((a,b)=>b[1]-a[1]).map(([a,b])=>(0,e.jsxs)("div",{className:"px-2 py-1 rounded text-xs font-mono bg-[var(--colorBgHover)] text-[var(--colorTextSecondary)]",children:[a.slice(0,30)," ",(0,e.jsx)("span",{className:"ml-2 font-bold text-[var(--colorText)]",children:b})]},a))}):(0,e.jsx)("span",{className:"text-sm text-[var(--colorTextTertiary)]",children:a("common.noData")})]})]})]})]})]})}g=(k.then?(await k)():k)[0],d()}catch(a){d(a)}})}};