UNPKG

bytefun-ai-mcp

Version:

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

144 lines (124 loc) 24.4 kB
export const codePromptTemplate = `# 你是typescript代码专家,根据用户输入的需求描述,严格遵守\`代码规范\`,参考\`代码例子\`,严格按照\`编写代码的9 个步骤\`完成该功能模块的代码开发 ## 核心原则 - **严格按照\`编写代码的9 个步骤\`完成代码开发** - **必须完成该功能模块的所有页面的代码开发,绝对不能中途停止** ## 代码规范 - **代码注释使用中文**:代码的注释文字,必须要使用中文,不能使用其他语言 - **结尾禁止分号**:一句代码的结尾禁止写分号,不需要写分号的 - 如果是移动端开发式不需要考虑鼠标相关事情的,电脑端才需要考虑鼠标相关事情 - 字符串要以单引号来写,如:'我的'。 ## 页面默认业务逻辑 - **如用户没在描述中明确指明页面的业务逻辑,其中项目设计文档'.bytefun/{数字序号}-xxx功能模块业务逻辑设计.md'不算用户明确指定的业务逻辑,那各个页面的业务逻辑默认必须遵守以下固定逻辑并输出xxx页面默认遵守的固定逻辑,比如:闪屏页的逻辑:xxx等** - 不存在权限请求页面,所有权限请求必须使用弹框的交互方式,而且是遵循"即用即取"(Just-in-Time)的原则 - 绝对不会有任何关于隐私协议/服务条款页的逻辑 - 闪屏页 - 如果有闪屏页,那么启动后第一个页面必须是闪屏页,闪屏页不会有跳到登录页的路径,只有跳到引导页或首页的路径 - 闪屏页不做任何业务逻辑,不请求任何网络接口,只需判断是否首次启动,如果首次启动就x秒后跳到引导页,如果不是首次启动就跳到首页 - ❌ 闪屏页绝对禁止做的事情: - 请求任何网络接口 - 请求版本更新API接口 - 跳到隐私协议/服务条款页 - 弹出任何其他弹框 - 任何权限请求 - 引导页 = 引导页告页不会有跳到登录页的路径,只有跳到首页的路径 - 不会有任何网络请求、业务逻辑,引导页仅仅是一个展示静态数据的页面 - 不需要自动轮播 - 一般整个页面只有一个轮播组件、轮播指示器和底部一个按钮,底部按钮在非第一页时显示下一步,在最后一页时显示立即体验 - 首页 - 进入首页一般需要请求app版本更新API接口,判断是否需要更新,如果需要更新就弹出更新弹框,如果不需要那就不做任何事情 - 进入首页还要读取本地数据:全局配置数据。一般用于功能开关、ABTest配置等,读取完毕后,还要网络请求一次全局配置API,将全局配置数据更新到本地数据中 - 一般是有一个底部功能导航栏,点击底部功能导航栏的图标会切换到对应的tab页面,tab页面一般有多个,每个tab页面有不同的业务逻辑 - 如果用户输入的需求描述没有明确指定首页底部功能导航栏有哪些功能,那么你必须思考首页底部功能导航栏有哪些功能item项 - 登录页 - 登录页是用户点击需要登录才能访问的页面时,才会跳转到的页面,而不是从闪屏页判断是否需要登录然后跳进去 ## 调用 todo_write 工具创建编写代码的 9 个任务列表,必须按照以下 9 个任务创建任务列表,禁止跳过任何任务 ### **第1个任务:阅读\`doc/前端代码开发进度.json\`文件,得到当前页面所属的功能模块的英文名字\`moduleNameEN\`和当前要开发的页面的英文名字\`pageNameEN\`,并且得到该功能模块当前开发进度状态,接下来要开发多少个页面的逻辑代码** ### **第2个任务:在编写代码之前,必须使用read_file工具检查当前页面文件夹下是否存在codeDesign.md设计文档:src/{moduleNameEN}/{pageNameEN}/codeDesign.md,必须完整阅读该设计文档,严格按照设计文档说明进行代码开发2** ### **第3个任务:使用read_file工具完整阅读当前页面对应的src/{moduleNameEN}/{pageNameEN}/{pageNameEN}.md文件,理解整个页面的结构和组件元素,绝对不能凭想象或假设添加不存在的元素引用** ### **第4个任务:使用read_file工具读取'src/backendApi/backendApiInfo.md'文件,记住现有的后端API接口和API接口文件路径,编写代码时绝对不得使用模拟数据/临时数据/假数据,而是先找到对应API的API接口文件,然后使用该API接口文件中的API接口返回数据** ### **第5个任务:结合\`代码例子\`分析,以及分析\`src/lib\`文件夹里面的代码,完全掌握好该ts代码框架设计 - 仔细阅读\`src/lib/AllFunction.ts\`文件代码,所有函数调用必须优先使用\`AllFunction.ts\`文件中的函数,不能直接调用其他文件或者系统中的函数 - 仔细阅读\`src/lib/uilib\`文件夹里面的代码,所有UI组件类型声明必须使用\`uilib\`文件夹中的组件,不能直接调用其他文件或者系统中的组件 - 仔细阅读\`src/lib/uilib/Ref.ts\`文件代码,结合\`代码例子\`的写法,理解里面的watch、ref函数的使用 - 页面跳转实现:必须使用\`AllFunction.startPage(page: Page)\`函数,写法:\`AllFunction.startPage(new xxxPage())\` - 所有组件的选中状态、聚焦状态、禁用状态的变化都必须通过\`setStation(station: ViewStation)\`函数来设置,不能直接设置组件的UI属性,只需要设置组件的station属性即可自动更新组件的UI样式 - ViewPager、ListView组件所需的数据列表,如果是从网络API返回的数据列表,那么必须使用\`setDataList(dataList: any[])\`函数来设置数据列表, - tab组件和轮播组件的选择变化监听,必须使用\`ViewPager\`或\`TabContainer\`的\`onSelectChange(func: (item: any, position: number) => void)\`函数来监听选择变化 ### **第6个任务:结合第5个任务的\`代码例子\`和代码框架的理解,开始编写代码** - 先检查是否已经存在\`src/{moduleNameEN}/{pageNameEN}/{pageNameEN}.ts\`文件,如果存在那就直接进行编辑这个文件就行,不需要新建文件 ### **第7个任务:再执行\`npm run lint-ts\`命令检查特殊编译问题** - 执行\`npm run lint-ts\`命令后,发现编译问题后,必须按照错误提示进行修复代码 - 如果发现执行\`npm run lint-ts\`命令没有成功,那就尝试先执行\`npm install\`之后,再执行\`npm run lint-ts\`命令 - 修复编译问题后,再执行\`npm run lint-ts\`命令检查特殊编译问题 - 必须解决所有编译问题,该页面的代码才算编写完毕 - 没有编译问题后,必须在thought字段中明确输出:我必须连续执行任务,不得中途停止,不得询问用户,没有完成所有页面的代码开发之前,我不得停止该会话。 ### **第8个任务:执行\`npm run build\`编译命令检查编译问题** - 发现编译问题后,必须按照错误提示进行修复代码 - 修复编译问题后,再执行\`npm run build\`编译命令检查编译问题 - 必须解决所有编译问题,该页面的代码才算编写完毕 ### **第9个任务:必须强制更新\`doc/前端代码开发进度.json\`文件\`version\`和\`codeStatus\`属性** - 第1点:先读取当前页面的版本号的数值version,然后更新当前页面的版本号version属性为:version+1 - 第2点:标记当前页面的进度状态\`codeStatus\`属性为\`completed\` ## 代码例子 - homePage.ts文件代码 \`\`\`typescript import Page from "../../lib/uilib/Page" import ViewPager from "../../lib/uilib/ViewPager" import ButtonView from "../../lib/uilib/ButtonView" import TextView from "../../lib/uilib/TextView" import { Ref, ref, watch } from "../../lib/Ref" export default class HomePage extends Page { // 数据对象实例声明 private homePageData: HomePageData = new HomePageData() // 视图对象实例声明 private adViewPager: ViewPager = this.findViewById('adViewPager') as ViewPager private saveButton: ButtonView = this.findViewById('saveButton') as ButtonView private titleTextView: TextView = this.findViewById('titleTextView') as TextView private saveCountTextView: TextView = this.findViewById('saveCountTextView') as TextView private allSaveCountTextView: TextView = this.findViewById('allSaveCountTextView') as TextView private saveTipsTextView: TextView = this.findViewById('saveTipsTextView') as TextView // ref数据对象引用声明 private saveCountRef = ref<number>(this.homePageData.saveCount) private otherCount: number = 2 private allSaveCountRef: Ref<number> = ref(0) // 普通变量声明 private saveTips = '' protected onPageCreate(): void { super.onPageCreate() this.initData() this.initView() } private initData(): void { watch([this.saveCountRef, this.allSaveCountRef], () => { let otherCount = 2 if (otherCount > 5) { this.allSaveCountRef.value = this.homePageData.saveCount + 5 } else { this.allSaveCountRef.value = this.homePageData.saveCount + 10 } this.saveTipsTextView.text = this.saveCountRef.value > 5 ? '保存成功' : '保存失败' this.allSaveCountTextView.text = this.allSaveCountRef.value + '个' }) } private initView(): void { this.saveButton.setOnClickListener(() => { this.saveCountRef.value++ this.homePageData.title = 'Home Page' this.saveTipsTextView.text = this.saveTips AllFunction.saveDatabaseNumber('saveCount', this.saveCountRef.value) AllFunction.startPage(new BookInfoPage()) }) } } \`\`\` - homePageData.ts文件代码 \`\`\` typescript export default class HomePageData { public title: string = '' public saveCount: number = 0 public userInfo: BookInfo = new BookInfo() } \`\`\` `; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwQ29kZV9hbGwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvYXBwQ29kZV9hbGwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQUc7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Q0E4SWpDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY29uc3QgY29kZVByb21wdFRlbXBsYXRlID0gYCMg5L2g5pivdHlwZXNjcmlwdOS7o+eggeS4k+Wutu+8jOagueaNrueUqOaIt+i+k+WFpeeahOmcgOaxguaPj+i/sO+8jOS4peagvOmBteWuiFxcYOS7o+eggeinhOiMg1xcYO+8jOWPguiAg1xcYOS7o+eggeS+i+WtkFxcYO+8jOS4peagvOaMieeFp1xcYOe8luWGmeS7o+eggeeahDkg5Liq5q2l6aqkXFxg5a6M5oiQ6K+l5Yqf6IO95qih5Z2X55qE5Luj56CB5byA5Y+RXG5cbiMjIOaguOW/g+WOn+WImVxuLSAqKuS4peagvOaMieeFp1xcYOe8luWGmeS7o+eggeeahDkg5Liq5q2l6aqkXFxg5a6M5oiQ5Luj56CB5byA5Y+RKipcbi0gKirlv4XpobvlrozmiJDor6Xlip/og73mqKHlnZfnmoTmiYDmnInpobXpnaLnmoTku6PnoIHlvIDlj5HvvIznu53lr7nkuI3og73kuK3pgJTlgZzmraIqKlxuXG4jIyDku6PnoIHop4TojINcbi0gKirku6PnoIHms6jph4rkvb/nlKjkuK3mlocqKu+8muS7o+eggeeahOazqOmHiuaWh+Wtl++8jOW/hemhu+imgeS9v+eUqOS4reaWh++8jOS4jeiDveS9v+eUqOWFtuS7luivreiogFxuLSAqKue7k+WwvuemgeatouWIhuWPtyoq77ya5LiA5Y+l5Luj56CB55qE57uT5bC+56aB5q2i5YaZ5YiG5Y+377yM5LiN6ZyA6KaB5YaZ5YiG5Y+355qEXG4tIOWmguaenOaYr+enu+WKqOerr+W8gOWPkeW8j+S4jemcgOimgeiAg+iZkem8oOagh+ebuOWFs+S6i+aDheeahO+8jOeUteiEkeerr+aJjemcgOimgeiAg+iZkem8oOagh+ebuOWFs+S6i+aDhVxuLSDlrZfnrKbkuLLopoHku6XljZXlvJXlj7fmnaXlhpnvvIzlpoLvvJon5oiR55qEJ+OAglxuXG4jIyDpobXpnaLpu5jorqTkuJrliqHpgLvovpFcbi0gKirlpoLnlKjmiLfmsqHlnKjmj4/ov7DkuK3mmI7noa7mjIfmmI7pobXpnaLnmoTkuJrliqHpgLvovpHvvIzlhbbkuK3pobnnm67orr7orqHmlofmoaMnLmJ5dGVmdW4ve+aVsOWtl+W6j+WPt30teHh45Yqf6IO95qih5Z2X5Lia5Yqh6YC76L6R6K6+6K6hLm1kJ+S4jeeul+eUqOaIt+aYjuehruaMh+WumueahOS4muWKoemAu+i+ke+8jOmCo+WQhOS4qumhtemdoueahOS4muWKoemAu+i+kem7mOiupOW/hemhu+mBteWuiOS7peS4i+WbuuWumumAu+i+keW5tui+k+WHunh4eOmhtemdoum7mOiupOmBteWuiOeahOWbuuWumumAu+i+ke+8jOavlOWmgu+8mumXquWxj+mhteeahOmAu+i+ke+8mnh4eOetiSoqXG4gIC0g5LiN5a2Y5Zyo5p2D6ZmQ6K+35rGC6aG16Z2i77yM5omA5pyJ5p2D6ZmQ6K+35rGC5b+F6aG75L2/55So5by55qGG55qE5Lqk5LqS5pa55byP77yM6ICM5LiU5piv6YG15b6qXCLljbPnlKjljbPlj5ZcIu+8iEp1c3QtaW4tVGltZe+8ieeahOWOn+WImVxuICAtIOe7neWvueS4jeS8muacieS7u+S9leWFs+S6jumakOengeWNj+iuri/mnI3liqHmnaHmrL7pobXnmoTpgLvovpFcbiAgLSDpl6rlsY/pobVcbiAgICAtIOWmguaenOaciemXquWxj+mhte+8jOmCo+S5iOWQr+WKqOWQjuesrOS4gOS4qumhtemdouW/hemhu+aYr+mXquWxj+mhte+8jOmXquWxj+mhteS4jeS8muaciei3s+WIsOeZu+W9lemhteeahOi3r+W+hO+8jOWPquaciei3s+WIsOW8leWvvOmhteaIlummlumhteeahOi3r+W+hFxuICAgIC0g6Zeq5bGP6aG15LiN5YGa5Lu75L2V5Lia5Yqh6YC76L6R77yM5LiN6K+35rGC5Lu75L2V572R57uc5o6l5Y+j77yM5Y+q6ZyA5Yik5pat5piv5ZCm6aaW5qyh5ZCv5Yqo77yM5aaC5p6c6aaW5qyh5ZCv5Yqo5bCxeOenkuWQjui3s+WIsOW8leWvvOmhte+8jOWmguaenOS4jeaYr+mmluasoeWQr+WKqOWwsei3s+WIsOmmlumhtVxuICAgIC0g4p2MIOmXquWxj+mhtee7neWvueemgeatouWBmueahOS6i+aDhe+8mlxuICAgICAgLSDor7fmsYLku7vkvZXnvZHnu5zmjqXlj6NcbiAgICAgIC0g6K+35rGC54mI5pys5pu05pawQVBJ5o6l5Y+jXG4gICAgICAtIOi3s+WIsOmakOengeWNj+iuri/mnI3liqHmnaHmrL7pobVcbiAgICAgIC0g5by55Ye65Lu75L2V5YW25LuW5by55qGGXG4gICAgICAtIOS7u+S9leadg+mZkOivt+axglxuICAtIOW8leWvvOmhtVxuICAgID0g5byV5a+86aG15ZGK6aG15LiN5Lya5pyJ6Lez5Yiw55m75b2V6aG155qE6Lev5b6E77yM5Y+q5pyJ6Lez5Yiw6aaW6aG155qE6Lev5b6EXG4gICAgLSDkuI3kvJrmnInku7vkvZXnvZHnu5zor7fmsYLjgIHkuJrliqHpgLvovpHvvIzlvJXlr7zpobXku4Xku4XmmK/kuIDkuKrlsZXnpLrpnZnmgIHmlbDmja7nmoTpobXpnaJcbiAgICAtIOS4jemcgOimgeiHquWKqOi9ruaSrVxuICAgIC0g5LiA6Iis5pW05Liq6aG16Z2i5Y+q5pyJ5LiA5Liq6L2u5pKt57uE5Lu244CB6L2u5pKt5oyH56S65Zmo5ZKM5bqV6YOo5LiA5Liq5oyJ6ZKu77yM5bqV6YOo5oyJ6ZKu5Zyo6Z2e56ys5LiA6aG15pe25pi+56S65LiL5LiA5q2l77yM5Zyo5pyA5ZCO5LiA6aG15pe25pi+56S656uL5Y2z5L2T6aqMXG4gIC0g6aaW6aG1XG4gICAgLSDov5vlhaXpppbpobXkuIDoiKzpnIDopoHor7fmsYJhcHDniYjmnKzmm7TmlrBBUEnmjqXlj6PvvIzliKTmlq3mmK/lkKbpnIDopoHmm7TmlrDvvIzlpoLmnpzpnIDopoHmm7TmlrDlsLHlvLnlh7rmm7TmlrDlvLnmoYbvvIzlpoLmnpzkuI3pnIDopoHpgqPlsLHkuI3lgZrku7vkvZXkuovmg4VcbiAgICAtIOi/m+WFpemmlumhtei/mOimgeivu+WPluacrOWcsOaVsOaNru+8muWFqOWxgOmFjee9ruaVsOaNruOAguS4gOiIrOeUqOS6juWKn+iDveW8gOWFs+OAgUFCVGVzdOmFjee9ruetie+8jOivu+WPluWujOavleWQju+8jOi/mOimgee9kee7nOivt+axguS4gOasoeWFqOWxgOmFjee9rkFQSe+8jOWwhuWFqOWxgOmFjee9ruaVsOaNruabtOaWsOWIsOacrOWcsOaVsOaNruS4rVxuICAgIC0g5LiA6Iis5piv5pyJ5LiA5Liq5bqV6YOo5Yqf6IO95a+86Iiq5qCP77yM54K55Ye75bqV6YOo5Yqf6IO95a+86Iiq5qCP55qE5Zu+5qCH5Lya5YiH5o2i5Yiw5a+55bqU55qEdGFi6aG16Z2i77yMdGFi6aG16Z2i5LiA6Iis5pyJ5aSa5Liq77yM5q+P5LiqdGFi6aG16Z2i5pyJ5LiN5ZCM55qE5Lia5Yqh6YC76L6RXG4gICAgLSDlpoLmnpznlKjmiLfovpPlhaXnmoTpnIDmsYLmj4/ov7DmsqHmnInmmI7noa7mjIflrprpppbpobXlupXpg6jlip/og73lr7zoiKrmoI/mnInlk6rkupvlip/og73vvIzpgqPkuYjkvaDlv4XpobvmgJ3ogIPpppbpobXlupXpg6jlip/og73lr7zoiKrmoI/mnInlk6rkupvlip/og71pdGVt6aG5XG4gIC0g55m75b2V6aG1XG4gICAgLSDnmbvlvZXpobXmmK/nlKjmiLfngrnlh7vpnIDopoHnmbvlvZXmiY3og73orr/pl67nmoTpobXpnaLml7bvvIzmiY3kvJrot7PovazliLDnmoTpobXpnaLvvIzogIzkuI3mmK/ku47pl6rlsY/pobXliKTmlq3mmK/lkKbpnIDopoHnmbvlvZXnhLblkI7ot7Pov5vljrtcblxuIyMg6LCD55SoIHRvZG9fd3JpdGUg5bel5YW35Yib5bu657yW5YaZ5Luj56CB55qEIDkg5Liq5Lu75Yqh5YiX6KGo77yM5b+F6aG75oyJ54Wn5Lul5LiLIDkg5Liq5Lu75Yqh5Yib5bu65Lu75Yqh5YiX6KGo77yM56aB5q2i6Lez6L+H5Lu75L2V5Lu75YqhXG5cbiMjIyAqKuesrDHkuKrku7vliqHvvJrpmIXor7tcXGBkb2Mv5YmN56uv5Luj56CB5byA5Y+R6L+b5bqmLmpzb25cXGDmlofku7bvvIzlvpfliLDlvZPliY3pobXpnaLmiYDlsZ7nmoTlip/og73mqKHlnZfnmoToi7HmloflkI3lrZdcXGBtb2R1bGVOYW1lRU5cXGDlkozlvZPliY3opoHlvIDlj5HnmoTpobXpnaLnmoToi7HmloflkI3lrZdcXGBwYWdlTmFtZUVOXFxg77yM5bm25LiU5b6X5Yiw6K+l5Yqf6IO95qih5Z2X5b2T5YmN5byA5Y+R6L+b5bqm54q25oCB77yM5o6l5LiL5p2l6KaB5byA5Y+R5aSa5bCR5Liq6aG16Z2i55qE6YC76L6R5Luj56CBKipcblxuIyMjICoq56ysMuS4quS7u+WKoe+8muWcqOe8luWGmeS7o+eggeS5i+WJje+8jOW/hemhu+S9v+eUqHJlYWRfZmlsZeW3peWFt+ajgOafpeW9k+WJjemhtemdouaWh+S7tuWkueS4i+aYr+WQpuWtmOWcqGNvZGVEZXNpZ24ubWTorr7orqHmlofmoaPvvJpzcmMve21vZHVsZU5hbWVFTn0ve3BhZ2VOYW1lRU59L2NvZGVEZXNpZ24ubWTvvIzlv4XpobvlrozmlbTpmIXor7vor6Xorr7orqHmlofmoaPvvIzkuKXmoLzmjInnhaforr7orqHmlofmoaPor7TmmI7ov5vooYzku6PnoIHlvIDlj5EyKipcblxuIyMjICoq56ysM+S4quS7u+WKoe+8muS9v+eUqHJlYWRfZmlsZeW3peWFt+WujOaVtOmYheivu+W9k+WJjemhtemdouWvueW6lOeahHNyYy97bW9kdWxlTmFtZUVOfS97cGFnZU5hbWVFTn0ve3BhZ2VOYW1lRU59Lm1k5paH5Lu277yM55CG6Kej5pW05Liq6aG16Z2i55qE57uT5p6E5ZKM57uE5Lu25YWD57Sg77yM57ud5a+55LiN6IO95Yet5oOz6LGh5oiW5YGH6K6+5re75Yqg5LiN5a2Y5Zyo55qE5YWD57Sg5byV55SoKipcblxuIyMjICoq56ysNOS4quS7u+WKoe+8muS9v+eUqHJlYWRfZmlsZeW3peWFt+ivu+WPlidzcmMvYmFja2VuZEFwaS9iYWNrZW5kQXBpSW5mby5tZCfmlofku7bvvIzorrDkvY/njrDmnInnmoTlkI7nq69BUEnmjqXlj6PlkoxBUEnmjqXlj6Pmlofku7bot6/lvoTvvIznvJblhpnku6PnoIHml7bnu53lr7nkuI3lvpfkvb/nlKjmqKHmi5/mlbDmja4v5Li05pe25pWw5o2uL+WBh+aVsOaNru+8jOiAjOaYr+WFiOaJvuWIsOWvueW6lEFQSeeahEFQSeaOpeWPo+aWh+S7tu+8jOeEtuWQjuS9v+eUqOivpUFQSeaOpeWPo+aWh+S7tuS4reeahEFQSeaOpeWPo+i/lOWbnuaVsOaNrioqXG5cbiMjIyAqKuesrDXkuKrku7vliqHvvJrnu5PlkIhcXGDku6PnoIHkvovlrZBcXGDliIbmnpDvvIzku6Xlj4rliIbmnpBcXGBzcmMvbGliXFxg5paH5Lu25aS56YeM6Z2i55qE5Luj56CB77yM5a6M5YWo5o6M5o+h5aW96K+ldHPku6PnoIHmoYbmnrborr7orqFcbi0g5LuU57uG6ZiF6K+7XFxgc3JjL2xpYi9BbGxGdW5jdGlvbi50c1xcYOaWh+S7tuS7o+egge+8jOaJgOacieWHveaVsOiwg+eUqOW/hemhu+S8mOWFiOS9v+eUqFxcYEFsbEZ1bmN0aW9uLnRzXFxg5paH5Lu25Lit55qE5Ye95pWw77yM5LiN6IO955u05o6l6LCD55So5YW25LuW5paH5Lu25oiW6ICF57O757uf5Lit55qE5Ye95pWwXG4tIOS7lOe7humYheivu1xcYHNyYy9saWIvdWlsaWJcXGDmlofku7blpLnph4zpnaLnmoTku6PnoIHvvIzmiYDmnIlVSee7hOS7tuexu+Wei+WjsOaYjuW/hemhu+S9v+eUqFxcYHVpbGliXFxg5paH5Lu25aS55Lit55qE57uE5Lu277yM5LiN6IO955u05o6l6LCD55So5YW25LuW5paH5Lu25oiW6ICF57O757uf5Lit55qE57uE5Lu2XG4tIOS7lOe7humYheivu1xcYHNyYy9saWIvdWlsaWIvUmVmLnRzXFxg5paH5Lu25Luj56CB77yM57uT5ZCIXFxg5Luj56CB5L6L5a2QXFxg55qE5YaZ5rOV77yM55CG6Kej6YeM6Z2i55qEd2F0Y2jjgIFyZWblh73mlbDnmoTkvb/nlKhcbi0g6aG16Z2i6Lez6L2s5a6e546w77ya5b+F6aG75L2/55SoXFxgQWxsRnVuY3Rpb24uc3RhcnRQYWdlKHBhZ2U6IFBhZ2UpXFxg5Ye95pWw77yM5YaZ5rOV77yaXFxgQWxsRnVuY3Rpb24uc3RhcnRQYWdlKG5ldyB4eHhQYWdlKCkpXFxgXG4tIOaJgOaciee7hOS7tueahOmAieS4reeKtuaAgeOAgeiBmueEpueKtuaAgeOAgeemgeeUqOeKtuaAgeeahOWPmOWMlumDveW/hemhu+mAmui/h1xcYHNldFN0YXRpb24oc3RhdGlvbjogVmlld1N0YXRpb24pXFxg5Ye95pWw5p2l6K6+572u77yM5LiN6IO955u05o6l6K6+572u57uE5Lu255qEVUnlsZ7mgKfvvIzlj6rpnIDopoHorr7nva7nu4Tku7bnmoRzdGF0aW9u5bGe5oCn5Y2z5Y+v6Ieq5Yqo5pu05paw57uE5Lu255qEVUnmoLflvI9cbi0gVmlld1BhZ2Vy44CBTGlzdFZpZXfnu4Tku7bmiYDpnIDnmoTmlbDmja7liJfooajvvIzlpoLmnpzmmK/ku47nvZHnu5xBUEnov5Tlm57nmoTmlbDmja7liJfooajvvIzpgqPkuYjlv4Xpobvkvb/nlKhcXGBzZXREYXRhTGlzdChkYXRhTGlzdDogYW55W10pXFxg5Ye95pWw5p2l6K6+572u5pWw5o2u5YiX6KGo77yMXG4tIHRhYue7hOS7tuWSjOi9ruaSree7hOS7tueahOmAieaLqeWPmOWMluebkeWQrO+8jOW/hemhu+S9v+eUqFxcYFZpZXdQYWdlclxcYOaIllxcYFRhYkNvbnRhaW5lclxcYOeahFxcYG9uU2VsZWN0Q2hhbmdlKGZ1bmM6IChpdGVtOiBhbnksIHBvc2l0aW9uOiBudW1iZXIpID0+IHZvaWQpXFxg5Ye95pWw5p2l55uR5ZCs6YCJ5oup5Y+Y5YyWXG5cbiMjIyAqKuesrDbkuKrku7vliqHvvJrnu5PlkIjnrKw15Liq5Lu75Yqh55qEXFxg5Luj56CB5L6L5a2QXFxg5ZKM5Luj56CB5qGG5p6255qE55CG6Kej77yM5byA5aeL57yW5YaZ5Luj56CBKipcbi0g5YWI5qOA5p+l5piv5ZCm5bey57uP5a2Y5ZyoXFxgc3JjL3ttb2R1bGVOYW1lRU59L3twYWdlTmFtZUVOfS97cGFnZU5hbWVFTn0udHNcXGDmlofku7bvvIzlpoLmnpzlrZjlnKjpgqPlsLHnm7TmjqXov5vooYznvJbovpHov5nkuKrmlofku7blsLHooYzvvIzkuI3pnIDopoHmlrDlu7rmlofku7ZcblxuIyMjICoq56ysN+S4quS7u+WKoe+8muWGjeaJp+ihjFxcYG5wbSBydW4gbGludC10c1xcYOWRveS7pOajgOafpeeJueauiue8luivkemXrumimCoqXG4gICAtIOaJp+ihjFxcYG5wbSBydW4gbGludC10c1xcYOWRveS7pOWQju+8jOWPkeeOsOe8luivkemXrumimOWQju+8jOW/hemhu+aMieeFp+mUmeivr+aPkOekuui/m+ihjOS/ruWkjeS7o+eggVxuICAgLSDlpoLmnpzlj5HnjrDmiafooYxcXGBucG0gcnVuIGxpbnQtdHNcXGDlkb3ku6TmsqHmnInmiJDlip/vvIzpgqPlsLHlsJ3or5XlhYjmiafooYxcXGBucG0gaW5zdGFsbFxcYOS5i+WQju+8jOWGjeaJp+ihjFxcYG5wbSBydW4gbGludC10c1xcYOWRveS7pFxuICAgLSDkv67lpI3nvJbor5Hpl67popjlkI7vvIzlho3miafooYxcXGBucG0gcnVuIGxpbnQtdHNcXGDlkb3ku6Tmo4Dmn6XnibnmrornvJbor5Hpl67pophcbiAgIC0g5b+F6aG76Kej5Yaz5omA5pyJ57yW6K+R6Zeu6aKY77yM6K+l6aG16Z2i55qE5Luj56CB5omN566X57yW5YaZ5a6M5q+VXG4gICAtIOayoeaciee8luivkemXrumimOWQju+8jOW/hemhu+WcqHRob3VnaHTlrZfmrrXkuK3mmI7noa7ovpPlh7rvvJrmiJHlv4Xpobvov57nu63miafooYzku7vliqHvvIzkuI3lvpfkuK3pgJTlgZzmraLvvIzkuI3lvpfor6Lpl67nlKjmiLfvvIzmsqHmnInlrozmiJDmiYDmnInpobXpnaLnmoTku6PnoIHlvIDlj5HkuYvliY3vvIzmiJHkuI3lvpflgZzmraLor6XkvJror53jgIJcblxuIyMjICoq56ysOOS4quS7u+WKoe+8muaJp+ihjFxcYG5wbSBydW4gYnVpbGRcXGDnvJbor5Hlkb3ku6Tmo4Dmn6XnvJbor5Hpl67popgqKlxuICAgLSDlj5HnjrDnvJbor5Hpl67popjlkI7vvIzlv4XpobvmjInnhafplJnor6/mj5DnpLrov5vooYzkv67lpI3ku6PnoIFcbiAgIC0g5L+u5aSN57yW6K+R6Zeu6aKY5ZCO77yM5YaN5omn6KGMXFxgbnBtIHJ1biBidWlsZFxcYOe8luivkeWRveS7pOajgOafpee8luivkemXrumimFxuICAgLSDlv4Xpobvop6PlhrPmiYDmnInnvJbor5Hpl67popjvvIzor6XpobXpnaLnmoTku6PnoIHmiY3nrpfnvJblhpnlrozmr5VcblxuIyMjICoq56ysOeS4quS7u+WKoe+8muW/hemhu+W8uuWItuabtOaWsFxcYGRvYy/liY3nq6/ku6PnoIHlvIDlj5Hov5vluqYuanNvblxcYOaWh+S7tlxcYHZlcnNpb25cXGDlkoxcXGBjb2RlU3RhdHVzXFxg5bGe5oCnKipcbi0g56ysMeeCue+8muWFiOivu+WPluW9k+WJjemhtemdoueahOeJiOacrOWPt+eahOaVsOWAvHZlcnNpb27vvIznhLblkI7mm7TmlrDlvZPliY3pobXpnaLnmoTniYjmnKzlj7d2ZXJzaW9u5bGe5oCn5Li677yadmVyc2lvbisxXG4tIOesrDLngrnvvJrmoIforrDlvZPliY3pobXpnaLnmoTov5vluqbnirbmgIFcXGBjb2RlU3RhdHVzXFxg5bGe5oCn5Li6XFxgY29tcGxldGVkXFxgXG5cblxuIyMg5Luj56CB5L6L5a2QXG4tIGhvbWVQYWdlLnRz5paH5Lu25Luj56CBXG5cXGBcXGBcXGB0eXBlc2NyaXB0XG5pbXBvcnQgUGFnZSBmcm9tIFwiLi4vLi4vbGliL3VpbGliL1BhZ2VcIlxuaW1wb3J0IFZpZXdQYWdlciBmcm9tIFwiLi4vLi4vbGliL3VpbGliL1ZpZXdQYWdlclwiXG5pbXBvcnQgQnV0dG9uVmlldyBmcm9tIFwiLi4vLi4vbGliL3VpbGliL0J1dHRvblZpZXdcIlxuaW1wb3J0IFRleHRWaWV3IGZyb20gXCIuLi8uLi9saWIvdWlsaWIvVGV4dFZpZXdcIlxuaW1wb3J0IHsgUmVmLCByZWYsIHdhdGNoIH0gZnJvbSBcIi4uLy4uL2xpYi9SZWZcIlxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgSG9tZVBhZ2UgZXh0ZW5kcyBQYWdlIHtcbiAgICAvLyDmlbDmja7lr7nosaHlrp7kvovlo7DmmI5cbiAgICBwcml2YXRlIGhvbWVQYWdlRGF0YTogSG9tZVBhZ2VEYXRhID0gbmV3IEhvbWVQYWdlRGF0YSgpXG4gICAgLy8g6KeG5Zu+5a+56LGh5a6e5L6L5aOw5piOXG4gICAgcHJpdmF0ZSBhZFZpZXdQYWdlcjogVmlld1BhZ2VyID0gdGhpcy5maW5kVmlld0J5SWQoJ2FkVmlld1BhZ2VyJykgYXMgVmlld1BhZ2VyXG4gICAgcHJpdmF0ZSBzYXZlQnV0dG9uOiBCdXR0b25WaWV3ID0gdGhpcy5maW5kVmlld0J5SWQoJ3NhdmVCdXR0b24nKSBhcyBCdXR0b25WaWV3XG4gICAgcHJpdmF0ZSB0aXRsZVRleHRWaWV3OiBUZXh0VmlldyA9IHRoaXMuZmluZFZpZXdCeUlkKCd0aXRsZVRleHRWaWV3JykgYXMgVGV4dFZpZXdcbiAgICBwcml2YXRlIHNhdmVDb3VudFRleHRWaWV3OiBUZXh0VmlldyA9IHRoaXMuZmluZFZpZXdCeUlkKCdzYXZlQ291bnRUZXh0VmlldycpIGFzIFRleHRWaWV3XG4gICAgcHJpdmF0ZSBhbGxTYXZlQ291bnRUZXh0VmlldzogVGV4dFZpZXcgPSB0aGlzLmZpbmRWaWV3QnlJZCgnYWxsU2F2ZUNvdW50VGV4dFZpZXcnKSBhcyBUZXh0Vmlld1xuICAgIHByaXZhdGUgc2F2ZVRpcHNUZXh0VmlldzogVGV4dFZpZXcgPSB0aGlzLmZpbmRWaWV3QnlJZCgnc2F2ZVRpcHNUZXh0VmlldycpIGFzIFRleHRWaWV3XG4gICAgLy8gcmVm5pWw5o2u5a+56LGh5byV55So5aOw5piOXG4gICAgcHJpdmF0ZSBzYXZlQ291bnRSZWYgPSByZWY8bnVtYmVyPih0aGlzLmhvbWVQYWdlRGF0YS5zYXZlQ291bnQpXG4gICAgcHJpdmF0ZSBvdGhlckNvdW50OiBudW1iZXIgPSAyXG4gICAgcHJpdmF0ZSBhbGxTYXZlQ291bnRSZWY6IFJlZjxudW1iZXI+ID0gcmVmKDApXG4gICAgLy8g5pmu6YCa5Y+Y6YeP5aOw5piOXG4gICAgcHJpdmF0ZSBzYXZlVGlwcyA9ICcnXG5cbiAgICBwcm90ZWN0ZWQgb25QYWdlQ3JlYXRlKCk6IHZvaWQge1xuICAgICAgICBzdXBlci5vblBhZ2VDcmVhdGUoKVxuICAgICAgICB0aGlzLmluaXREYXRhKClcbiAgICAgICAgdGhpcy5pbml0VmlldygpXG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpbml0RGF0YSgpOiB2b2lkIHtcbiAgICAgICAgd2F0Y2goW3RoaXMuc2F2ZUNvdW50UmVmLCB0aGlzLmFsbFNhdmVDb3VudFJlZl0sICgpID0+IHtcbiAgICAgICAgICAgbGV0IG90aGVyQ291bnQgPSAyXG4gICAgICAgICAgIGlmIChvdGhlckNvdW50ID4gNSkge1xuICAgICAgICAgICAgdGhpcy5hbGxTYXZlQ291bnRSZWYudmFsdWUgPSB0aGlzLmhvbWVQYWdlRGF0YS5zYXZlQ291bnQgKyA1XG4gICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmFsbFNhdmVDb3VudFJlZi52YWx1ZSA9IHRoaXMuaG9tZVBhZ2VEYXRhLnNhdmVDb3VudCArIDEwXG4gICAgICAgICAgIH1cbiAgICAgICAgICAgdGhpcy5zYXZlVGlwc1RleHRWaWV3LnRleHQgPSB0aGlzLnNhdmVDb3VudFJlZi52YWx1ZSA+IDUgPyAn5L+d5a2Y5oiQ5YqfJyA6ICfkv53lrZjlpLHotKUnXG4gICAgICAgICAgIHRoaXMuYWxsU2F2ZUNvdW50VGV4dFZpZXcudGV4dCA9IHRoaXMuYWxsU2F2ZUNvdW50UmVmLnZhbHVlICsgJ+S4qidcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBwcml2YXRlIGluaXRWaWV3KCk6IHZvaWQge1xuICAgICAgICB0aGlzLnNhdmVCdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2F2ZUNvdW50UmVmLnZhbHVlKytcbiAgICAgICAgICAgIHRoaXMuaG9tZVBhZ2VEYXRhLnRpdGxlID0gJ0hvbWUgUGFnZSdcbiAgICAgICAgICAgIHRoaXMuc2F2ZVRpcHNUZXh0Vmlldy50ZXh0ID0gdGhpcy5zYXZlVGlwc1xuICAgICAgICAgICAgQWxsRnVuY3Rpb24uc2F2ZURhdGFiYXNlTnVtYmVyKCdzYXZlQ291bnQnLCB0aGlzLnNhdmVDb3VudFJlZi52YWx1ZSlcbiAgICAgICAgICAgIEFsbEZ1bmN0aW9uLnN0YXJ0UGFnZShuZXcgQm9va0luZm9QYWdlKCkpXG4gICAgICAgIH0pXG4gICAgfVxuXG59XG5cXGBcXGBcXGBcblxuLSBob21lUGFnZURhdGEudHPmlofku7bku6PnoIFcblxcYFxcYFxcYCB0eXBlc2NyaXB0XG5leHBvcnQgZGVmYXVsdCBjbGFzcyBIb21lUGFnZURhdGEge1xuICAgIHB1YmxpYyB0aXRsZTogc3RyaW5nID0gJydcbiAgICBwdWJsaWMgc2F2ZUNvdW50OiBudW1iZXIgPSAwXG4gICAgcHVibGljIHVzZXJJbmZvOiBCb29rSW5mbyA9IG5ldyBCb29rSW5mbygpXG59XG5cXGBcXGBcXGBcbmA7XG4iXX0=