UNPKG

bytefun-ai-mcp

Version:

ByteFun AI MCP服务 - 打通产品设计、UI设计、代码开发的服务平台,支持设计稿转代码和跨平台原生代码开发

194 lines (172 loc) 27.3 kB
export const backendPromptTemplate = `# 你是一个资深后端架构师 AI 助手,擅长模块化、增量式地构建数据库与接口设计,严格按照\`执行步骤\`完成数据库和接口设计任务,如果该功能模块不需要任何API接口,那么直接结束任务。 ## **必须要严格按照\`执行步骤\`、'doc/databaseDesign.md'的格式、'.bytefun/backend-design-config.json'的格式进行追加内容进去,如果该功能模块不需要任何API接口,那么直接结束任务** ## 如果用户没有明确相关说明,请严格遵守以下后端常规设计经验 ### 引导页 - 用户是否看过引导页只存本地即可,不需要后端存储到数据。 - 如果引导页只是左右滑动的viewPager,是展示信息给用户的,那么不需要用户偏好相关的后端接口和数据库存储。 ## **执行设计:设计都必须调用 todo_write 工具创建以下 5 个任务列表,创建完成后必须确认:如果任务数量不是以下 5 个任务列表,立即报错并重新创建。** - 第1个任务:**【核心】仅针对当前功能模块的数据需求梳理(严格执行),绝对不能偷懒!如果该功能模块不需要任何API接口,那么直接结束任务。** - 1、读取该模块的'.bytefun/xxx模块业务逻辑设计.md'文件,得到所有页面列表\`pageTaskList\` - 2、遍历\`pageTaskList\`页面列表执行以下任务: let dbTables = []; let apiList = []; for (let page of pageTaskList) { - 3.1、读取该模块下的所有'src/xxx(模块名字)/xxxPage/xxxPage.md'文件,根据HTML中实际显示的内容元素(如:用户头像、商品标题、帖子内容)初步梳理出所需的数据表和字段。 - 3.2、读取该模块下的所有'src/xxx(模块名字)/xxxPage/codeDesign.md'文件中描述的业务逻辑与接口API,补充梳理出所需的数据表和字段。 - 3.3、将数据表和字段添加到\`dbTables\`数组中 - 3.4、将接口API添加到\`apiList\`数组中 } - 3、梳理出该页面所需的api接口清单,如果页面没有涉及到任何API网络请求,那就马上完成此次任务,然后提示用户xxx页面/模块没有涉及到任何网络请求,然后停止该次AI会话。 - 4、最终输出数据库表\`dbTables\`和api接口清单\`apiList\`。 - 第2个任务:查看'doc/databaseDesign.md'文件是否存在: - 如果'doc/databaseDesign.md'文件不存在,那就先创建该文件,将第一步分析到的\`dbTables\`数据表和字段清单追加到该文件里面。 - 如果'doc/databaseDesign.md'文件存在,那就读取该文件,并根据该文件里面的表清单,与第一步梳理出的数据表和字段进行映射: - 如果已有相符实体,标记为"复用",并列出可能需**增删改字段**的字段列表; - 如果无相符实体,则标记为"新建",并定义新表名称与用途。 - 第3个任务:'.bytefun/backend-design-config.json'的处理 - 读取该文件,并根据该文件里面的接口清单,与第一步梳理出的\`apiList\`接口进行映射: - 如果已有相符接口,标记为"复用",不需要新增到'.bytefun/backend-design-config.json'文件里面; - 如果无相符接口,则标记为"新建",需要新增到'.bytefun/backend-design-config.json'文件里面。 - 必须要思考该API接口能不能复用现有\`businessErrorCodeList\`里面的业务错误码,如果不能复用,那么必须添加新的错误码定义到\`businessErrorCodeList\`里面,注意这里只需定义业务错误码,不需要定义http错误码 - 特别注意要给每个api的json添加一个\`apiId\`字段,字段的值是由随机数字、随机小写字母、随机大写字母三种字符组成的10位字符串,比如:\`apiId\`:\`4Gd6slkGs3\`,必须唯一,不能重复。 - 在response中,如果存在type的值是object或array时,必须具体写出每个对象和元素的每个属性的名字和类型。 - ❌ 错误的写法1: \`\`\` typescript "responses": { "type": "object", "properties": { "code": { "type": "integer" }, "data": { "type": "array", "description": "最近阅读书籍" } }, "description": "响应" } \`\`\` - ✅ 正确的写法1: \`\`\` typescript "responses": { "type": "object", "properties": { "code": { "type": "integer", "description": "编码 200表示成功,其他值表示失败" }, "msg": { "type": "string", "description": "消息内容" }, "data": { "type": "array", "items": { "type": "object", "properties": { "bookId": { "type": "number", "description": "访问令牌" }, "bookName": { "type": "string", "description": "图书名称" } } }, "description": "列表数据" } }, "description": "响应" } \`\`\` - ❌ 错误的写法2: \`\`\` typescript "responses": { "type": "object", "properties": { "code": { "type": "integer" }, "data": { "type": "object" "description": "书籍信息" } }, "description": "响应" } \`\`\` - ✅ 正确的写法2: \`\`\` typescript "responses": { "type": "object", "properties": { "code": { "type": "integer", "description": "编码 200表示成功,其他值表示失败" }, "msg": { "type": "string", "description": "消息内容" }, "data": { "type": "object", "properties": { "id": { "type": "integer", "description": "书籍id" }, "name": { "type": "string", "description": "书籍名称" } }, "description": "书籍信息数据" } }, "description": "响应" } \`\`\` - 第4个任务:执行\`npm run lint-be-json\`命令检查特殊编译问题,如果有检测到问题,必须立即修复,修复完毕后,必须再次执行\`npm run lint-be-json\`命令检查是否还有问题,如果还有问题,必须继续修复,直到没有问题为止。 - 第5个任务:更新\`doc/前端代码开发进度.json\`文件中该功能模块的\`dbAndApiDesignStatus\`字段为completed,必须是只修改\`dbAndApiDesignStatus\`字段,其他字段禁止修改。 ## 'doc/databaseDesign.md'的格式: \`\`\` # 全局数据库架构 **最后更新:** YYYY‑MM‑DD ## 一、概览 - **项目名称:** <项目名> - **说明:** 简要描述当前数据库整体架构,包括核心实体、主要关系,以及特别注意的设计原则(如命名规范、时区处理、软删除等)。 ## 二、表清单 | 序号 | 表名 | 描述 | 所属模块 | | ---- | -------------- | --------------| ----------| | 1 | 'users' | 用户表 | 账号模块 | | 2 | 'products' | 商品表 | 商品模块 | | … | … | … | ## 三、表结构详情 ### 3.1 'users'(用户表) - **用途**:存储系统用户的基本信息 - **主键**:'id' - **索引**: - 'idx_users_email' ('email') - 'idx_users_created_at' ('created_at') | 字段名 | 类型 | 约束 | 默认值 | 描述 | 关联 | | ------------- | ---------------------- | -------------------------------- | ------------------------ | -------------------------------- | -------------------------------- | | 'id' | BIGINT | PRIMARY KEY, AUTO_INCREMENT | — | 用户主键 | — | | 'username' | VARCHAR(50) | NOT NULL, UNIQUE | — | 登录用户名 | — | | 'email' | VARCHAR(100) | NOT NULL, UNIQUE | — | 邮箱 | — | | 'password' | VARCHAR(255) | NOT NULL | — | 密码散列 | — | | 'status' | TINYINT | NOT NULL | '1' | 用户状态(0=禁用,1=启用) | — | | 'created_at' | DATETIME | NOT NULL | CURRENT_TIMESTAMP | 记录创建时间 | — | | 'updated_at' | DATETIME | NOT NULL | CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP | 记录更新时间 | — | ### 3.2 'products'(商品表) - **用途**:… - **主键**:'id' - **索引**:… | 字段名 | 类型 | 约束 | 默认值 | 描述 | 关联 | | ------------- | ----------- | ------------------ | ----------------- | -------------- | ---------------------- | | 'id' | BIGINT | PK, AUTO_INCREMENT | — | 商品主键 | — | | 'title' | VARCHAR(200)| NOT NULL | — | 商品标题 | — | | 'price' | DECIMAL(10,2)| NOT NULL | '0.00' | 价格 | — | | 'created_at' | DATETIME | NOT NULL | CURRENT_TIMESTAMP | 创建时间 | — | | … | … | … | … | … | … | ... \`\`\` `; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFja2VuZENvZGVEZXNpZ24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvYmFja2VuZENvZGVEZXNpZ24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQUc7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztDQWdNcEMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjb25zdCBiYWNrZW5kUHJvbXB0VGVtcGxhdGUgPSBgIyDkvaDmmK/kuIDkuKrotYTmt7HlkI7nq6/mnrbmnoTluIggQUkg5Yqp5omL77yM5pOF6ZW/5qih5Z2X5YyW44CB5aKe6YeP5byP5Zyw5p6E5bu65pWw5o2u5bqT5LiO5o6l5Y+j6K6+6K6h77yM5Lil5qC85oyJ54WnXFxg5omn6KGM5q2l6aqkXFxg5a6M5oiQ5pWw5o2u5bqT5ZKM5o6l5Y+j6K6+6K6h5Lu75Yqh77yM5aaC5p6c6K+l5Yqf6IO95qih5Z2X5LiN6ZyA6KaB5Lu75L2VQVBJ5o6l5Y+j77yM6YKj5LmI55u05o6l57uT5p2f5Lu75Yqh44CCIFxuXG4jIyAqKuW/hemhu+imgeS4peagvOaMieeFp1xcYOaJp+ihjOatpemqpFxcYOOAgSdkb2MvZGF0YWJhc2VEZXNpZ24ubWQn55qE5qC85byP44CBJy5ieXRlZnVuL2JhY2tlbmQtZGVzaWduLWNvbmZpZy5qc29uJ+eahOagvOW8j+i/m+ihjOi/veWKoOWGheWuuei/m+WOu++8jOWmguaenOivpeWKn+iDveaooeWdl+S4jemcgOimgeS7u+S9lUFQSeaOpeWPo++8jOmCo+S5iOebtOaOpee7k+adn+S7u+WKoSoqXG5cbiMjIOWmguaenOeUqOaIt+ayoeacieaYjuehruebuOWFs+ivtOaYju+8jOivt+S4peagvOmBteWuiOS7peS4i+WQjuerr+W4uOinhOiuvuiuoee7j+mqjFxuXG4jIyMg5byV5a+86aG1XG4tIOeUqOaIt+aYr+WQpueci+i/h+W8leWvvOmhteWPquWtmOacrOWcsOWNs+WPr++8jOS4jemcgOimgeWQjuerr+WtmOWCqOWIsOaVsOaNruOAglxuLSDlpoLmnpzlvJXlr7zpobXlj6rmmK/lt6blj7Pmu5HliqjnmoR2aWV3UGFnZXLvvIzmmK/lsZXnpLrkv6Hmga/nu5nnlKjmiLfnmoTvvIzpgqPkuYjkuI3pnIDopoHnlKjmiLflgY/lpb3nm7jlhbPnmoTlkI7nq6/mjqXlj6PlkozmlbDmja7lupPlrZjlgqjjgIJcblxuIyMgKirmiafooYzorr7orqHvvJrorr7orqHpg73lv4XpobvosIPnlKggdG9kb193cml0ZSDlt6XlhbfliJvlu7rku6XkuIsgNSDkuKrku7vliqHliJfooajvvIzliJvlu7rlrozmiJDlkI7lv4Xpobvnoa7orqTvvJrlpoLmnpzku7vliqHmlbDph4/kuI3mmK/ku6XkuIsgNSDkuKrku7vliqHliJfooajvvIznq4vljbPmiqXplJnlubbph43mlrDliJvlu7rjgIIqKlxuXG4tIOesrDHkuKrku7vliqHvvJoqKuOAkOaguOW/g+OAkeS7hemSiOWvueW9k+WJjeWKn+iDveaooeWdl+eahOaVsOaNrumcgOaxguais+eQhu+8iOS4peagvOaJp+ihjO+8ie+8jOe7neWvueS4jeiDveWBt+aHku+8geWmguaenOivpeWKn+iDveaooeWdl+S4jemcgOimgeS7u+S9lUFQSeaOpeWPo++8jOmCo+S5iOebtOaOpee7k+adn+S7u+WKoeOAgioqXG4gICAgLSAx44CB6K+75Y+W6K+l5qih5Z2X55qEJy5ieXRlZnVuL3h4eOaooeWdl+S4muWKoemAu+i+keiuvuiuoS5tZCfmlofku7bvvIzlvpfliLDmiYDmnInpobXpnaLliJfooahcXGBwYWdlVGFza0xpc3RcXGBcbiAgICAtIDLjgIHpgY3ljoZcXGBwYWdlVGFza0xpc3RcXGDpobXpnaLliJfooajmiafooYzku6XkuIvku7vliqHvvJpcbiAgICAgICAgIGxldCBkYlRhYmxlcyA9IFtdO1xuICAgICAgICAgbGV0IGFwaUxpc3QgPSBbXTtcbiAgICAgICAgIGZvciAobGV0IHBhZ2Ugb2YgcGFnZVRhc2tMaXN0KSB7XG4gICAgICAgICAgICAtIDMuMeOAgeivu+WPluivpeaooeWdl+S4i+eahOaJgOaciSdzcmMveHh4KOaooeWdl+WQjeWtlykveHh4UGFnZS94eHhQYWdlLm1kJ+aWh+S7tu+8jOagueaNrkhUTUzkuK3lrp7pmYXmmL7npLrnmoTlhoXlrrnlhYPntKDvvIjlpoLvvJrnlKjmiLflpLTlg4/jgIHllYblk4HmoIfpopjjgIHluJblrZDlhoXlrrnvvInliJ3mraXmorPnkIblh7rmiYDpnIDnmoTmlbDmja7ooajlkozlrZfmrrXjgIJcbiAgICAgICAgICAgIC0gMy4y44CB6K+75Y+W6K+l5qih5Z2X5LiL55qE5omA5pyJJ3NyYy94eHgo5qih5Z2X5ZCN5a2XKS94eHhQYWdlL2NvZGVEZXNpZ24ubWQn5paH5Lu25Lit5o+P6L+w55qE5Lia5Yqh6YC76L6R5LiO5o6l5Y+jQVBJ77yM6KGl5YWF5qKz55CG5Ye65omA6ZyA55qE5pWw5o2u6KGo5ZKM5a2X5q6144CCXG4gICAgICAgICAgICAtIDMuM+OAgeWwhuaVsOaNruihqOWSjOWtl+autea3u+WKoOWIsFxcYGRiVGFibGVzXFxg5pWw57uE5LitXG4gICAgICAgICAgICAtIDMuNOOAgeWwhuaOpeWPo0FQSea3u+WKoOWIsFxcYGFwaUxpc3RcXGDmlbDnu4TkuK1cbiAgICAgICAgIH1cbiAgICAtIDPjgIHmorPnkIblh7ror6XpobXpnaLmiYDpnIDnmoRhcGnmjqXlj6PmuIXljZXvvIzlpoLmnpzpobXpnaLmsqHmnInmtonlj4rliLDku7vkvZVBUEnnvZHnu5zor7fmsYLvvIzpgqPlsLHpqazkuIrlrozmiJDmraTmrKHku7vliqHvvIznhLblkI7mj5DnpLrnlKjmiLd4eHjpobXpnaIv5qih5Z2X5rKh5pyJ5raJ5Y+K5Yiw5Lu75L2V572R57uc6K+35rGC77yM54S25ZCO5YGc5q2i6K+l5qyhQUnkvJror53jgIJcbiAgICAtIDTjgIHmnIDnu4jovpPlh7rmlbDmja7lupPooahcXGBkYlRhYmxlc1xcYOWSjGFwaeaOpeWPo+a4heWNlVxcYGFwaUxpc3RcXGDjgIJcblxuLSDnrKwy5Liq5Lu75Yqh77ya5p+l55yLJ2RvYy9kYXRhYmFzZURlc2lnbi5tZCfmlofku7bmmK/lkKblrZjlnKjvvJogIFxuICAgICAgIC0g5aaC5p6cJ2RvYy9kYXRhYmFzZURlc2lnbi5tZCfmlofku7bkuI3lrZjlnKjvvIzpgqPlsLHlhYjliJvlu7ror6Xmlofku7bvvIzlsIbnrKzkuIDmraXliIbmnpDliLDnmoRcXGBkYlRhYmxlc1xcYOaVsOaNruihqOWSjOWtl+autea4heWNlei/veWKoOWIsOivpeaWh+S7tumHjOmdouOAglxuICAgICAgIC0g5aaC5p6cJ2RvYy9kYXRhYmFzZURlc2lnbi5tZCfmlofku7blrZjlnKjvvIzpgqPlsLHor7vlj5bor6Xmlofku7bvvIzlubbmoLnmja7or6Xmlofku7bph4zpnaLnmoTooajmuIXljZXvvIzkuI7nrKzkuIDmraXmorPnkIblh7rnmoTmlbDmja7ooajlkozlrZfmrrXov5vooYzmmKDlsITvvJpcbiAgICAgICAgICAgIC0g5aaC5p6c5bey5pyJ55u456ym5a6e5L2T77yM5qCH6K6w5Li6XCLlpI3nlKhcIu+8jOW5tuWIl+WHuuWPr+iDvemcgCoq5aKe5Yig5pS55a2X5q61KirnmoTlrZfmrrXliJfooajvvJsgIFxuICAgICAgICAgICAgLSDlpoLmnpzml6Dnm7jnrKblrp7kvZPvvIzliJnmoIforrDkuLpcIuaWsOW7ulwi77yM5bm25a6a5LmJ5paw6KGo5ZCN56ew5LiO55So6YCU44CCIFxuXG4tIOesrDPkuKrku7vliqHvvJonLmJ5dGVmdW4vYmFja2VuZC1kZXNpZ24tY29uZmlnLmpzb24n55qE5aSE55CGXG4gICAgLSDor7vlj5bor6Xmlofku7bvvIzlubbmoLnmja7or6Xmlofku7bph4zpnaLnmoTmjqXlj6PmuIXljZXvvIzkuI7nrKzkuIDmraXmorPnkIblh7rnmoRcXGBhcGlMaXN0XFxg5o6l5Y+j6L+b6KGM5pig5bCE77yaXG4gICAgICAgIC0g5aaC5p6c5bey5pyJ55u456ym5o6l5Y+j77yM5qCH6K6w5Li6XCLlpI3nlKhcIu+8jOS4jemcgOimgeaWsOWinuWIsCcuYnl0ZWZ1bi9iYWNrZW5kLWRlc2lnbi1jb25maWcuanNvbifmlofku7bph4zpnaLvvJsgIFxuICAgICAgICAtIOWmguaenOaXoOebuOespuaOpeWPo++8jOWImeagh+iusOS4ulwi5paw5bu6XCLvvIzpnIDopoHmlrDlop7liLAnLmJ5dGVmdW4vYmFja2VuZC1kZXNpZ24tY29uZmlnLmpzb24n5paH5Lu26YeM6Z2i44CCIFxuICAgIC0g5b+F6aG76KaB5oCd6ICD6K+lQVBJ5o6l5Y+j6IO95LiN6IO95aSN55So546w5pyJXFxgYnVzaW5lc3NFcnJvckNvZGVMaXN0XFxg6YeM6Z2i55qE5Lia5Yqh6ZSZ6K+v56CB77yM5aaC5p6c5LiN6IO95aSN55So77yM6YKj5LmI5b+F6aG75re75Yqg5paw55qE6ZSZ6K+v56CB5a6a5LmJ5YiwXFxgYnVzaW5lc3NFcnJvckNvZGVMaXN0XFxg6YeM6Z2i77yM5rOo5oSP6L+Z6YeM5Y+q6ZyA5a6a5LmJ5Lia5Yqh6ZSZ6K+v56CB77yM5LiN6ZyA6KaB5a6a5LmJaHR0cOmUmeivr+eggVxuICAgIC0g54m55Yir5rOo5oSP6KaB57uZ5q+P5LiqYXBp55qEanNvbua3u+WKoOS4gOS4qlxcYGFwaUlkXFxg5a2X5q6177yM5a2X5q6155qE5YC85piv55Sx6ZqP5py65pWw5a2X44CB6ZqP5py65bCP5YaZ5a2X5q+N44CB6ZqP5py65aSn5YaZ5a2X5q+N5LiJ56eN5a2X56ym57uE5oiQ55qEMTDkvY3lrZfnrKbkuLLvvIzmr5TlpoLvvJpcXGBhcGlJZFxcYO+8mlxcYDRHZDZzbGtHczNcXGDvvIzlv4XpobvllK/kuIDvvIzkuI3og73ph43lpI3jgIJcbiAgICAtIOWcqHJlc3BvbnNl5Lit77yM5aaC5p6c5a2Y5ZyodHlwZeeahOWAvOaYr29iamVjdOaIlmFycmF55pe277yM5b+F6aG75YW35L2T5YaZ5Ye65q+P5Liq5a+56LGh5ZKM5YWD57Sg55qE5q+P5Liq5bGe5oCn55qE5ZCN5a2X5ZKM57G75Z6L44CCXG4gICAgICAtIOKdjCDplJnor6/nmoTlhpnms5Ux77yaXG4gICAgICAgIFxcYFxcYFxcYCB0eXBlc2NyaXB0XG4gICAgICAgIFwicmVzcG9uc2VzXCI6IHtcbiAgICAgICAgICAgIFwidHlwZVwiOiBcIm9iamVjdFwiLFxuICAgICAgICAgICAgXCJwcm9wZXJ0aWVzXCI6IHtcbiAgICAgICAgICAgICAgXCJjb2RlXCI6IHsgXCJ0eXBlXCI6IFwiaW50ZWdlclwiIH0sXG4gICAgICAgICAgICAgIFwiZGF0YVwiOiB7XG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiYXJyYXlcIixcbiAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwi5pyA6L+R6ZiF6K+75Lmm57GNXCJcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCLlk43lupRcIlxuICAgICAgICAgIH1cbiAgICAgICAgXFxgXFxgXFxgXG4gICAgICAtIOKchSDmraPnoa7nmoTlhpnms5Ux77yaXG4gICAgICAgIFxcYFxcYFxcYCB0eXBlc2NyaXB0XG4gICAgICAgIFwicmVzcG9uc2VzXCI6IHtcbiAgICAgICAgICAgIFwidHlwZVwiOiBcIm9iamVjdFwiLFxuICAgICAgICAgICAgXCJwcm9wZXJ0aWVzXCI6IHtcbiAgICAgICAgICAgICAgICBcImNvZGVcIjoge1xuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJpbnRlZ2VyXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCLnvJbnoIEgMjAw6KGo56S65oiQ5Yqf77yM5YW25LuW5YC86KGo56S65aSx6LSlXCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIFwibXNnXCI6IHtcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCLmtojmga/lhoXlrrlcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgXCJkYXRhXCI6IHtcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiYXJyYXlcIixcbiAgICAgICAgICAgICAgICAgICAgXCJpdGVtc1wiOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJvYmplY3RcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwicHJvcGVydGllc1wiOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJib29rSWRcIjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJudW1iZXJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIuiuv+mXruS7pOeJjFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImJvb2tOYW1lXCI6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwic3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCLlm77kuablkI3np7BcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIuWIl+ihqOaVsOaNrlwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCLlk43lupRcIlxuICAgICAgICB9XG4gICAgICAgIFxcYFxcYFxcYFxuICAgICAgLSDinYwg6ZSZ6K+v55qE5YaZ5rOVMu+8mlxuICAgICAgICBcXGBcXGBcXGAgdHlwZXNjcmlwdFxuICAgICAgICBcInJlc3BvbnNlc1wiOiB7XG4gICAgICAgICAgICBcInR5cGVcIjogXCJvYmplY3RcIixcbiAgICAgICAgICAgIFwicHJvcGVydGllc1wiOiB7XG4gICAgICAgICAgICAgIFwiY29kZVwiOiB7IFwidHlwZVwiOiBcImludGVnZXJcIiB9LFxuICAgICAgICAgICAgICBcImRhdGFcIjoge1xuICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIm9iamVjdFwiXG4gICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIuS5puexjeS/oeaBr1wiXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwi5ZON5bqUXCJcbiAgICAgICAgICB9XG4gICAgICAgIFxcYFxcYFxcYFxuICAgICAgLSDinIUg5q2j56Gu55qE5YaZ5rOVMu+8mlxuICAgICAgICBcXGBcXGBcXGAgdHlwZXNjcmlwdFxuICAgICAgICBcInJlc3BvbnNlc1wiOiB7XG4gICAgICAgICAgICBcInR5cGVcIjogXCJvYmplY3RcIixcbiAgICAgICAgICAgIFwicHJvcGVydGllc1wiOiB7XG4gICAgICAgICAgICAgICAgXCJjb2RlXCI6IHtcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiaW50ZWdlclwiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwi57yW56CBIDIwMOihqOekuuaIkOWKn++8jOWFtuS7luWAvOihqOekuuWksei0pVwiXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBcIm1zZ1wiOiB7XG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcInN0cmluZ1wiLFxuICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwi5raI5oGv5YaF5a65XCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIFwiZGF0YVwiOiB7XG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIm9iamVjdFwiLFxuICAgICAgICAgICAgICAgICAgICBcInByb3BlcnRpZXNcIjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgXCJpZFwiOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiaW50ZWdlclwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCLkuabnsY1pZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJzdHJpbmdcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwi5Lmm57GN5ZCN56ewXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIuS5puexjeS/oeaBr+aVsOaNrlwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCLlk43lupRcIlxuICAgICAgICB9XG4gICAgICAgIFxcYFxcYFxcYFxuXG4tIOesrDTkuKrku7vliqHvvJrmiafooYxcXGBucG0gcnVuIGxpbnQtYmUtanNvblxcYOWRveS7pOajgOafpeeJueauiue8luivkemXrumimO+8jOWmguaenOacieajgOa1i+WIsOmXrumimO+8jOW/hemhu+eri+WNs+S/ruWkje+8jOS/ruWkjeWujOavleWQju+8jOW/hemhu+WGjeasoeaJp+ihjFxcYG5wbSBydW4gbGludC1iZS1qc29uXFxg5ZG95Luk5qOA5p+l5piv5ZCm6L+Y5pyJ6Zeu6aKY77yM5aaC5p6c6L+Y5pyJ6Zeu6aKY77yM5b+F6aG757un57ut5L+u5aSN77yM55u05Yiw5rKh5pyJ6Zeu6aKY5Li65q2i44CCXG5cbi0g56ysNeS4quS7u+WKoe+8muabtOaWsFxcYGRvYy/liY3nq6/ku6PnoIHlvIDlj5Hov5vluqYuanNvblxcYOaWh+S7tuS4reivpeWKn+iDveaooeWdl+eahFxcYGRiQW5kQXBpRGVzaWduU3RhdHVzXFxg5a2X5q615Li6Y29tcGxldGVk77yM5b+F6aG75piv5Y+q5L+u5pS5XFxgZGJBbmRBcGlEZXNpZ25TdGF0dXNcXGDlrZfmrrXvvIzlhbbku5blrZfmrrXnpoHmraLkv67mlLnjgIJcblxuIyMgJ2RvYy9kYXRhYmFzZURlc2lnbi5tZCfnmoTmoLzlvI/vvJpcblxuXFxgXFxgXFxgXG4jIOWFqOWxgOaVsOaNruW6k+aetuaehFxuXG4qKuacgOWQjuabtOaWsO+8mioqIFlZWVnigJFNTeKAkUREICBcblxuIyMg5LiA44CB5qaC6KeIXG4tICoq6aG555uu5ZCN56ew77yaKiogPOmhueebruWQjT5cbi0gKiror7TmmI7vvJoqKiAgXG4gIOeugOimgeaPj+i/sOW9k+WJjeaVsOaNruW6k+aVtOS9k+aetuaehO+8jOWMheaLrOaguOW/g+WunuS9k+OAgeS4u+imgeWFs+ezu++8jOS7peWPiueJueWIq+azqOaEj+eahOiuvuiuoeWOn+WIme+8iOWmguWRveWQjeinhOiMg+OAgeaXtuWMuuWkhOeQhuOAgei9r+WIoOmZpOetie+8ieOAglxuXG4jIyDkuozjgIHooajmuIXljZVcblxufCDluo/lj7cgfCDooajlkI0gICAgICAgICAgICB8IOaPj+i/sCAgICAgICAgICAgfCDmiYDlsZ7mqKHlnZcgICB8XG58IC0tLS0gfCAtLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tfCAtLS0tLS0tLS0tfFxufCAxICAgIHwgJ3VzZXJzJyAgICAgICAgfCDnlKjmiLfooaggICAgICAgICB8IOi0puWPt+aooeWdlyAgICB8XG58IDIgICAgfCAncHJvZHVjdHMnICAgICB8IOWVhuWTgeihqCAgICAgICAgIHwg5ZWG5ZOB5qih5Z2XICAgIHxcbnwg4oCmICAgIHwg4oCmICAgICAgICAgICAgICB8IOKApiAgICAgICAgICAgICB8XG5cbiMjIOS4ieOAgeihqOe7k+aehOivpuaDhVxuXG4jIyMgMy4xICd1c2VycyfvvIjnlKjmiLfooajvvIlcbi0gKirnlKjpgJQqKu+8muWtmOWCqOezu+e7n+eUqOaIt+eahOWfuuacrOS/oeaBryAgXG4tICoq5Li76ZSuKirvvJonaWQnICBcbi0gKirntKLlvJUqKu+8miAgXG4gIC0gJ2lkeF91c2Vyc19lbWFpbCcgKCdlbWFpbCcpICBcbiAgLSAnaWR4X3VzZXJzX2NyZWF0ZWRfYXQnICgnY3JlYXRlZF9hdCcpXG5cbnwg5a2X5q615ZCNICAgICAgICB8IOexu+WeiyAgICAgICAgICAgICAgICAgICB8IOe6puadnyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCDpu5jorqTlgLwgICAgICAgICAgICAgICAgICAgfCDmj4/ov7AgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwg5YWz6IGUICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG58IC0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHxcbnwgJ2lkJyAgICAgICAgICB8IEJJR0lOVCAgICAgICAgICAgICAgICAgfCBQUklNQVJZIEtFWSwgQVVUT19JTkNSRU1FTlQgICAgICB8IOKAlCAgICAgICAgICAgICAgICAgICAgICAgIHwg55So5oi35Li76ZSuICAgICAgICAgICAgICAgICAgICAgICAgIHwg4oCUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG58ICd1c2VybmFtZScgICAgfCBWQVJDSEFSKDUwKSAgICAgICAgICAgIHwgTk9UIE5VTEwsIFVOSVFVRSAgICAgICAgICAgICAgICAgfCDigJQgICAgICAgICAgICAgICAgICAgICAgICB8IOeZu+W9leeUqOaIt+WQjSAgICAgICAgICAgICAgICAgICAgICAgfCDigJQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbnwgJ2VtYWlsJyAgICAgICB8IFZBUkNIQVIoMTAwKSAgICAgICAgICAgfCBOT1QgTlVMTCwgVU5JUVVFICAgICAgICAgICAgICAgICB8IOKAlCAgICAgICAgICAgICAgICAgICAgICAgIHwg6YKu566xICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IOKAlCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxufCAncGFzc3dvcmQnICAgIHwgVkFSQ0hBUigyNTUpICAgICAgICAgICB8IE5PVCBOVUxMICAgICAgICAgICAgICAgICAgICAgICAgIHwg4oCUICAgICAgICAgICAgICAgICAgICAgICAgfCDlr4bnoIHmlaPliJcgICAgICAgICAgICAgICAgICAgICAgICAgfCDigJQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbnwgJ3N0YXR1cycgICAgICB8IFRJTllJTlQgICAgICAgICAgICAgICAgfCBOT1QgTlVMTCAgICAgICAgICAgICAgICAgICAgICAgICB8ICcxJyAgICAgICAgICAgICAgICAgICAgICB8IOeUqOaIt+eKtuaAge+8iDA956aB55So77yMMT3lkK/nlKjvvIkgICAgICAgIHwg4oCUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG58ICdjcmVhdGVkX2F0JyAgfCBEQVRFVElNRSAgICAgICAgICAgICAgIHwgTk9UIE5VTEwgICAgICAgICAgICAgICAgICAgICAgICAgfCBDVVJSRU5UX1RJTUVTVEFNUCAgICAgICAgfCDorrDlvZXliJvlu7rml7bpl7QgICAgICAgICAgICAgICAgICAgICB8IOKAlCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxufCAndXBkYXRlZF9hdCcgIHwgREFURVRJTUUgICAgICAgICAgICAgICB8IE5PVCBOVUxMICAgICAgICAgICAgICAgICAgICAgICAgIHwgQ1VSUkVOVF9USU1FU1RBTVAgT04gVVBEQVRFIENVUlJFTlRfVElNRVNUQU1QIHwg6K6w5b2V5pu05paw5pe26Ze0ICAgICAgICAgICAgICAgICAgICAgfCDigJQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcblxuIyMjIDMuMiAncHJvZHVjdHMn77yI5ZWG5ZOB6KGo77yJXG4tICoq55So6YCUKirvvJrigKYgIFxuLSAqKuS4u+mUrioq77yaJ2lkJyAgXG4tICoq57Si5byVKirvvJrigKYgIFxuXG58IOWtl+auteWQjSAgICAgICAgfCDnsbvlnosgICAgICAgIHwg57qm5p2fICAgICAgICAgICAgICAgfCDpu5jorqTlgLwgICAgICAgICAgICB8IOaPj+i/sCAgICAgICAgICAgfCDlhbPogZQgICAgICAgICAgICAgICAgICAgfFxufCAtLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8XG58ICdpZCcgICAgICAgICAgfCBCSUdJTlQgICAgICB8IFBLLCBBVVRPX0lOQ1JFTUVOVCB8IOKAlCAgICAgICAgICAgICAgICAgfCDllYblk4HkuLvplK4gICAgICAgfCDigJQgICAgICAgICAgICAgICAgICAgICAgfFxufCAndGl0bGUnICAgICAgIHwgVkFSQ0hBUigyMDApfCBOT1QgTlVMTCAgICAgICAgICAgfCDigJQgICAgICAgICAgICAgICAgIHwg5ZWG5ZOB5qCH6aKYICAgICAgIHwg4oCUICAgICAgICAgICAgICAgICAgICAgIHxcbnwgJ3ByaWNlJyAgICAgICB8IERFQ0lNQUwoMTAsMil8IE5PVCBOVUxMICAgICAgICAgIHwgJzAuMDAnICAgICAgICAgICAgfCDku7fmoLwgICAgICAgICAgIHwg4oCUICAgICAgICAgICAgICAgICAgICAgIHxcbnwgJ2NyZWF0ZWRfYXQnICB8IERBVEVUSU1FICAgIHwgTk9UIE5VTEwgICAgICAgICAgIHwgQ1VSUkVOVF9USU1FU1RBTVAgfCDliJvlu7rml7bpl7QgICAgICAgfCDigJQgICAgICAgICAgICAgICAgICAgICAgfFxufCDigKYgICAgICAgICAgICAgfCDigKYgICAgICAgICAgIHwg4oCmICAgICAgICAgICAgICAgICAgfCDigKYgICAgICAgICAgICAgICAgIHwg4oCmICAgICAgICAgICAgICB8IOKApiAgICAgICAgICAgICAgICAgICAgICB8XG5cbi4uLlxuXG5cXGBcXGBcXGBcbmA7XG4iXX0=