UNPKG

bytefun-ai-mcp

Version:

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

205 lines (180 loc) 24.7 kB
export const codePromptTemplate = `# 你是typescript代码专家,根据\`编写规则\`帮我完成\`src/{{功能模块}}/{{页面名字}}/{{页面名字}}.ts\`页面跳转代码的开发 ## 代码规范 - **结尾禁止分号**:一句代码的结尾禁止写分号,不需要写分号的 ## **核心原则** - 只实现页面跳转和关闭页面的代码,其他任何代码不允许编写 - 绝对禁止注释页面跳转代码,即使跳转的目标页面的UI还没有开发完毕,也要先写上页面跳转代码,否则用户会认为你没有实现页面跳转代码 - 必须要完成所有页面的页面跳转代码开发才能结束任务,才能停止该AI会话 ## **🚨 严格禁止事项 - 防止AI大模型错误实现** ### **绝对禁止实现的功能代码** - **❌ 禁止实现任何UI显示与交互逻辑**:不得编写toast、dialog、text、input等UI显示相关代码 - **❌ 禁止实现非页面跳转的逻辑**:不得编写任何与页面跳转无关的逻辑代码 - **❌ 禁止实现网络请求逻辑**:不得编写API调用、数据获取等网络相关方法,请使用延时执行来模拟请求过程 - **❌ 禁止实现状态管理逻辑**:不得编写复杂的状态切换、数据管理等状态方法 - **❌ 禁止实现业务逻辑方法**:不得编写任何与页面跳转无关的业务处理方法 ### **只允许实现的代码类型** - **✅ 组件声明**:声明页面中可点击的UI组件(按钮、链接等) - **✅ 点击事件绑定**:为可点击组件绑定setOnClickListener事件 - **✅ 页面跳转调用**:在setOnClickListener事件中调用AllFunction.startPage(page: Page)进行页面跳转 - **✅ 关闭页面调用**:在setOnClickListener事件中调用AllFunction.closePage()进行页面关闭 - **✅ 简单延时跳转**:使用AllFunction.setTimeout实现延时跳转(如闪屏页) ### **错误实现示例(绝对禁止)** \`\`\`typescript // ❌ 错误:实现了Toast显示逻辑 private showToast(type: string): void { this.loginSuccessToast.visibility = ViewVisibility.VISIBLE // ... 更多Toast逻辑 } // ❌ 错误:实现了登录验证逻辑 private handleLogin(): void { // 模拟登录过程 AllFunction.setTimeout(() => { this.showToast('success') // ... 更多登录逻辑 }, 2000) } // ❌ 错误:实现了复杂的业务逻辑 private handleGetVerificationCode(): void { // 模拟获取验证码 AllFunction.setTimeout(() => { this.showToast('codeSent') }, 1000) } \`\`\` ### **正确实现示例(严格遵循)** \`\`\`typescript // ✅ 正确:只实现页面跳转 export default class xxxPage extends Page { // 声明必要的可点击组件 private registerLink: ButtonView = this.findViewById('registerLink') as ButtonView private loginButton: ButtonView = this.findViewById('loginButton') as ButtonView private backButton: ButtonView = this.findViewById('backButton') as ButtonView private initView(): void { // 只绑定页面跳转事件 this.registerLink.setOnClickListener(() => { AllFunction.startPage(new RegisterPage()) }) this.loginButton.setOnClickListener(() => { AllFunction.startPage(new HomePage()) }) this.backButton.setOnClickListener(() => { AllFunction.closePage() }) } } \`\`\` ### **AI大模型常见错误思维模式** 1. **过度解读UI结构**:看到Toast组件就认为需要实现Toast功能 ❌ 2. **基于开发经验**:认为页面需要完整的业务逻辑与交互逻辑 ❌ 3. **功能完整性误解**:认为需要实现页面的所有功能 ❌ 4. **忽略明确指令**:没有严格遵循"只实现页面跳转"的要求 ❌ ### **正确的AI思维模式** 1. **严格按指令执行**:只实现页面跳转,其他一律不写 ✅ 2. **明确任务边界**:页面跳转 ≠ 页面功能 ✅ 3. **简洁实现原则**:最少代码完成跳转需求 ✅ 4. **忽略UI复杂性**:不管UI多复杂,只关注跳转逻辑 ✅ ## 首先,读取\`doc/UI设计进度.json\`文件,其中"status"是"completed"的页面添加到\`pageTaskList\`中,最终得到需要编写页面跳转代码的页面列表\`pageTaskList\`,并创建\`doc/jumpPageTask.json\`文件,将\`pageTaskList\`带任务完成状态的json写入到\`doc/jumpPageTask.json\`文件中,其中version从0开始,每次设计或修复完成一个页面,version就加1,jumpPageTask.json文件的json的格式为: \`\`\`json { "pageTaskList": [ { "pageNameEN": "xxxPage", "pageNameCN": "xxx页面", "versoin": 1, "status": "completed" }, { "pageNameEN": "xxxPage", "pageNameCN": "xxx页面", "versoin": 0, "status": "pending" } ] } \`\`\` ## 然后调用todo_write工具根据\`pageTaskList\`创建任务列表,一个页面一个任务 ## 然后,每一个页面的开发都必须按照\`编写规则\`,并读取页面UI描述文件\`src/{模块名字}/xxxPage/xxxPage.md\`,理解页面的结构和组件元素,完成\`src/{模块名字}/xxxPage/xxxPage.ts\`的页面跳转代码的开发之后,还需要更新\`doc/jumpPageTask.json\`文件中的任务完成状态status字段和version字段,version字段每次都加1 ## 最后,读取\`doc/jumpPageTask.json\`文件,判断是否所有页面的页面跳转代码都开发完成,如果完成就结束任务,否则继续开发下一个页面的页面跳转代码任务 ### 编写规则 #### **理解View组件的声明规则** - AllFunction的import语句必须在类文件开始时先声明,并且import代码必须是这样写,特别注意严格按照下面给出的路径写法: \`\`\`typescript import AllFunction from "../../lib/AllFunction" \`\`\` - 这不是html、react等开发,这是一个新的开发框架,是基于src/lib/uilib文件夹里面的UI组件库来开发的 - View组件的基类是BaseView,容器基类是BaseContainerView,所有View组件都继承自BaseView - 使用工具遍历'src/lib/uilib/'文件夹下面的文件列表名字,理解总共有多少种UI组件 - 一个页面的所有View的信息数据都在\`src/{模块名字}/xxxPage/xxxPage.md\`文件中,该文件中会详细描述每个View的类型、id、xywh等属性 - View组件的声明必须在类文件开始时先声明,并且必须要声明具体的View组件类型,不得声明为BaseView,不得在任何函数体里面通过findViewById来声明View组件,比如: - ✅ 正确的写法: \`\`\`typescript public class HomePage extends Page { private nameTextView: TextView = this.findViewById('nameTextView') as TextView .... } \`\`\` - ❌ 错误的写法(没有声具体的View组件类型): \`\`\`typescript private nameTextView = this.findViewById('nameTextView') \`\`\` - ❌ 错误的写法(在函数体里面通过findViewById来声明View组件): \`\`\`typescript private oneFunction() { const nameTextView: TextView = this.findViewById('nameTextView') as TextView .... } \`\`\` #### **理解点击事件的绑定规则** - 点击事件的绑定必须使用setOnClickListener方法实现,setOnClickListener方法传入一个函数,函数中实现点击事件的逻辑,比如: \`\`\`typescript public class HomePage extends Page { private nameTextView: TextView = this.findViewById('nameTextView') as TextView .... private initView() { this.nameTextView.setOnClickListener(() => { AllFunction.startPage(new ProductPage()) }) } } \`\`\` #### **理解页面跳转规则** - 页面跳转必须使用AllFunction.startPage实现,startPage传入Page的子类对象,如:AllFunction.startPage(new ProductPage())。 - 页面跳转不需考虑模块化、循环依赖、渐进式开发,绝对禁止屏蔽页面跳转的代码,所有页面都已经存在,不会出现编译出错的,必须明确写上页面跳转的代码。 - 在Application.ts设置跳转启动页,比如: // 应用网站启动时回调的第一个函数,用于初始化一些全局的东西。 protected onApplicationCreate(): void { AllFunction.startPage(new SplashPage()) } - ✅ 引入其他类只允许一种写法:在类文件顶部进行import:import GuidePage from '../guidePage/guidePage'。 - ❌ 绝对禁止使用动态import的写法,程序底层已经处理好循环依赖问题了,你不需要考虑,比如绝对禁止以下写法: // 使用动态导入避免循环依赖 import('../guidePage/guidePage').then(({ default: GuidePage }) => { AllFunction.startPage(new GuidePage()) }) - ❌ 绝对禁止使用require的写法,程序底层已经处理好循环依赖问题了,你不需要考虑,比如绝对禁止以下写法: require('../guidePage/guidePage').default - ✅ 正确的写法是:AllFunction.startPage(new GuidePage())。然后在类文件顶部进行import:import GuidePage from '../guidePage/guidePage'#### **理解延时执行的代码规则** - 延时执行只能使用AllFunction.setTimeout实现,不能使用setTimeout函数,比如: \`\`\`typescript AllFunction.setTimeout(() => { console.log('延时执行') }, 1000) \`\`\` - ❌ 错误的写法(使用setTimeout函数): \`\`\`typescript setTimeout(() => { console.log('延时执行') }, 1000) \`\`\` - 延时执行AllFunction.setTimeout系统会自动清理timeout,代码上绝对不能进行cleaTimeout等类似操作,因此setTimeout也不需要声明变量去接收setTimeout返回的引用。 #### **理解网络请求的模拟规则** - 关于网络请求的模拟请使用延时执行来模拟请求过程,因为这只是页面跳转实现不需要网络数据,比如: \`\`\`typescript AllFunction.simulateNetRequest(() => { console.log('网络请求完成') }, 2000) \`\`\` - 不得使用任何其他工具实现网络请求的模拟,比如:simulateNetRequest等 `; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoianVtcFBhZ2VDb2RlIGNvcHkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvanVtcFBhZ2VDb2RlIGNvcHkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQUc7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMk0vQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNvbnN0IGNvZGVQcm9tcHRUZW1wbGF0ZSA9IGAjIOS9oOaYr3R5cGVzY3JpcHTku6PnoIHkuJPlrrbvvIzmoLnmja5cXGDnvJblhpnop4TliJlcXGDluK7miJHlrozmiJBcXGBzcmMve3vlip/og73mqKHlnZd9fS97e+mhtemdouWQjeWtl319L3t76aG16Z2i5ZCN5a2XfX0udHNcXGDpobXpnaLot7Povazku6PnoIHnmoTlvIDlj5FcblxuIyMg5Luj56CB6KeE6IyDXG4tICoq57uT5bC+56aB5q2i5YiG5Y+3KirvvJrkuIDlj6Xku6PnoIHnmoTnu5PlsL7npoHmraLlhpnliIblj7fvvIzkuI3pnIDopoHlhpnliIblj7fnmoRcblxuIyMgKirmoLjlv4Pljp/liJkqKlxuLSDlj6rlrp7njrDpobXpnaLot7PovazlkozlhbPpl63pobXpnaLnmoTku6PnoIHvvIzlhbbku5bku7vkvZXku6PnoIHkuI3lhYHorrjnvJblhplcbi0g57ud5a+556aB5q2i5rOo6YeK6aG16Z2i6Lez6L2s5Luj56CB77yM5Y2z5L2/6Lez6L2s55qE55uu5qCH6aG16Z2i55qEVUnov5jmsqHmnInlvIDlj5Hlrozmr5XvvIzkuZ/opoHlhYjlhpnkuIrpobXpnaLot7Povazku6PnoIHvvIzlkKbliJnnlKjmiLfkvJrorqTkuLrkvaDmsqHmnInlrp7njrDpobXpnaLot7Povazku6PnoIFcbi0g5b+F6aG76KaB5a6M5oiQ5omA5pyJ6aG16Z2i55qE6aG16Z2i6Lez6L2s5Luj56CB5byA5Y+R5omN6IO957uT5p2f5Lu75Yqh77yM5omN6IO95YGc5q2i6K+lQUnkvJror51cblxuIyMgKirwn5qoIOS4peagvOemgeatouS6i+mhuSAtIOmYsuatokFJ5aSn5qih5Z6L6ZSZ6K+v5a6e546wKipcblxuIyMjICoq57ud5a+556aB5q2i5a6e546w55qE5Yqf6IO95Luj56CBKipcbi0gKirinYwg56aB5q2i5a6e546w5Lu75L2VVUnmmL7npLrkuI7kuqTkupLpgLvovpEqKu+8muS4jeW+l+e8luWGmXRvYXN044CBZGlhbG9n44CBdGV4dOOAgWlucHV0562JVUnmmL7npLrnm7jlhbPku6PnoIFcbi0gKirinYwg56aB5q2i5a6e546w6Z2e6aG16Z2i6Lez6L2s55qE6YC76L6RKirvvJrkuI3lvpfnvJblhpnku7vkvZXkuI7pobXpnaLot7Povazml6DlhbPnmoTpgLvovpHku6PnoIFcbi0gKirinYwg56aB5q2i5a6e546w572R57uc6K+35rGC6YC76L6RKirvvJrkuI3lvpfnvJblhplBUEnosIPnlKjjgIHmlbDmja7ojrflj5bnrYnnvZHnu5znm7jlhbPmlrnms5XvvIzor7fkvb/nlKjlu7bml7bmiafooYzmnaXmqKHmi5/or7fmsYLov4fnqItcbi0gKirinYwg56aB5q2i5a6e546w54q25oCB566h55CG6YC76L6RKirvvJrkuI3lvpfnvJblhpnlpI3mnYLnmoTnirbmgIHliIfmjaLjgIHmlbDmja7nrqHnkIbnrYnnirbmgIHmlrnms5Vcbi0gKirinYwg56aB5q2i5a6e546w5Lia5Yqh6YC76L6R5pa55rOVKirvvJrkuI3lvpfnvJblhpnku7vkvZXkuI7pobXpnaLot7Povazml6DlhbPnmoTkuJrliqHlpITnkIbmlrnms5VcblxuIyMjICoq5Y+q5YWB6K645a6e546w55qE5Luj56CB57G75Z6LKipcbi0gKirinIUg57uE5Lu25aOw5piOKirvvJrlo7DmmI7pobXpnaLkuK3lj6/ngrnlh7vnmoRVSee7hOS7tu+8iOaMiemSruOAgemTvuaOpeetie+8iVxuLSAqKuKchSDngrnlh7vkuovku7bnu5HlrpoqKu+8muS4uuWPr+eCueWHu+e7hOS7tue7keWumnNldE9uQ2xpY2tMaXN0ZW5lcuS6i+S7tlxuLSAqKuKchSDpobXpnaLot7PovazosIPnlKgqKu+8muWcqHNldE9uQ2xpY2tMaXN0ZW5lcuS6i+S7tuS4reiwg+eUqEFsbEZ1bmN0aW9uLnN0YXJ0UGFnZShwYWdlOiBQYWdlKei/m+ihjOmhtemdoui3s+i9rFxuLSAqKuKchSDlhbPpl63pobXpnaLosIPnlKgqKu+8muWcqHNldE9uQ2xpY2tMaXN0ZW5lcuS6i+S7tuS4reiwg+eUqEFsbEZ1bmN0aW9uLmNsb3NlUGFnZSgp6L+b6KGM6aG16Z2i5YWz6ZetXG4tICoq4pyFIOeugOWNleW7tuaXtui3s+i9rCoq77ya5L2/55SoQWxsRnVuY3Rpb24uc2V0VGltZW91dOWunueOsOW7tuaXtui3s+i9rO+8iOWmgumXquWxj+mhte+8iVxuXG4jIyMgKirplJnor6/lrp7njrDnpLrkvovvvIjnu53lr7nnpoHmraLvvIkqKlxuXFxgXFxgXFxgdHlwZXNjcmlwdFxuLy8g4p2MIOmUmeivr++8muWunueOsOS6hlRvYXN05pi+56S66YC76L6RXG5wcml2YXRlIHNob3dUb2FzdCh0eXBlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmxvZ2luU3VjY2Vzc1RvYXN0LnZpc2liaWxpdHkgPSBWaWV3VmlzaWJpbGl0eS5WSVNJQkxFXG4gICAgLy8gLi4uIOabtOWkmlRvYXN06YC76L6RXG59XG5cbi8vIOKdjCDplJnor6/vvJrlrp7njrDkuobnmbvlvZXpqozor4HpgLvovpFcbnByaXZhdGUgaGFuZGxlTG9naW4oKTogdm9pZCB7XG4gICAgLy8g5qih5ouf55m75b2V6L+H56iLXG4gICAgQWxsRnVuY3Rpb24uc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMuc2hvd1RvYXN0KCdzdWNjZXNzJylcbiAgICAgICAgLy8gLi4uIOabtOWkmueZu+W9lemAu+i+kVxuICAgIH0sIDIwMDApXG59XG5cbi8vIOKdjCDplJnor6/vvJrlrp7njrDkuoblpI3mnYLnmoTkuJrliqHpgLvovpFcbnByaXZhdGUgaGFuZGxlR2V0VmVyaWZpY2F0aW9uQ29kZSgpOiB2b2lkIHtcbiAgICAvLyDmqKHmi5/ojrflj5bpqozor4HnoIFcbiAgICBBbGxGdW5jdGlvbi5zZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5zaG93VG9hc3QoJ2NvZGVTZW50JylcbiAgICB9LCAxMDAwKVxufVxuXFxgXFxgXFxgXG5cbiMjIyAqKuato+ehruWunueOsOekuuS+i++8iOS4peagvOmBteW+qu+8iSoqXG5cXGBcXGBcXGB0eXBlc2NyaXB0XG4vLyDinIUg5q2j56Gu77ya5Y+q5a6e546w6aG16Z2i6Lez6L2sXG5leHBvcnQgZGVmYXVsdCBjbGFzcyB4eHhQYWdlIGV4dGVuZHMgUGFnZSB7XG4gICAgLy8g5aOw5piO5b+F6KaB55qE5Y+v54K55Ye757uE5Lu2XG4gICAgcHJpdmF0ZSByZWdpc3Rlckxpbms6IEJ1dHRvblZpZXcgPSB0aGlzLmZpbmRWaWV3QnlJZCgncmVnaXN0ZXJMaW5rJykgYXMgQnV0dG9uVmlld1xuICAgIHByaXZhdGUgbG9naW5CdXR0b246IEJ1dHRvblZpZXcgPSB0aGlzLmZpbmRWaWV3QnlJZCgnbG9naW5CdXR0b24nKSBhcyBCdXR0b25WaWV3XG4gICAgcHJpdmF0ZSBiYWNrQnV0dG9uOiBCdXR0b25WaWV3ID0gdGhpcy5maW5kVmlld0J5SWQoJ2JhY2tCdXR0b24nKSBhcyBCdXR0b25WaWV3XG5cbiAgICBwcml2YXRlIGluaXRWaWV3KCk6IHZvaWQge1xuICAgICAgICAvLyDlj6rnu5HlrprpobXpnaLot7Povazkuovku7ZcbiAgICAgICAgdGhpcy5yZWdpc3Rlckxpbmsuc2V0T25DbGlja0xpc3RlbmVyKCgpID0+IHtcbiAgICAgICAgICAgIEFsbEZ1bmN0aW9uLnN0YXJ0UGFnZShuZXcgUmVnaXN0ZXJQYWdlKCkpXG4gICAgICAgIH0pXG5cbiAgICAgICAgdGhpcy5sb2dpbkJ1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIoKCkgPT4ge1xuICAgICAgICAgICAgQWxsRnVuY3Rpb24uc3RhcnRQYWdlKG5ldyBIb21lUGFnZSgpKVxuICAgICAgICB9KVxuXG4gICAgICAgIHRoaXMuYmFja0J1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIoKCkgPT4ge1xuICAgICAgICAgICAgQWxsRnVuY3Rpb24uY2xvc2VQYWdlKClcbiAgICAgICAgfSlcbiAgICB9XG59XG5cXGBcXGBcXGBcblxuIyMjICoqQUnlpKfmqKHlnovluLjop4HplJnor6/mgJ3nu7TmqKHlvI8qKlxuMS4gKirov4fluqbop6Por7tVSee7k+aehCoq77ya55yL5YiwVG9hc3Tnu4Tku7blsLHorqTkuLrpnIDopoHlrp7njrBUb2FzdOWKn+iDvSDinYxcbjIuICoq5Z+65LqO5byA5Y+R57uP6aqMKirvvJrorqTkuLrpobXpnaLpnIDopoHlrozmlbTnmoTkuJrliqHpgLvovpHkuI7kuqTkupLpgLvovpEg4p2MXG4zLiAqKuWKn+iDveWujOaVtOaAp+ivr+inoyoq77ya6K6k5Li66ZyA6KaB5a6e546w6aG16Z2i55qE5omA5pyJ5Yqf6IO9IOKdjFxuNC4gKirlv73nlaXmmI7noa7mjIfku6QqKu+8muayoeacieS4peagvOmBteW+qlwi5Y+q5a6e546w6aG16Z2i6Lez6L2sXCLnmoTopoHmsYIg4p2MXG5cbiMjIyAqKuato+ehrueahEFJ5oCd57u05qih5byPKipcbjEuICoq5Lil5qC85oyJ5oyH5Luk5omn6KGMKirvvJrlj6rlrp7njrDpobXpnaLot7PovazvvIzlhbbku5bkuIDlvovkuI3lhpkg4pyFXG4yLiAqKuaYjuehruS7u+WKoei+ueeVjCoq77ya6aG16Z2i6Lez6L2sIOKJoCDpobXpnaLlip/og70g4pyFXG4zLiAqKueugOa0geWunueOsOWOn+WImSoq77ya5pyA5bCR5Luj56CB5a6M5oiQ6Lez6L2s6ZyA5rGCIOKchVxuNC4gKirlv73nlaVVSeWkjeadguaApyoq77ya5LiN566hVUnlpJrlpI3mnYLvvIzlj6rlhbPms6jot7PovazpgLvovpEg4pyFXG5cbiMjIOmmluWFiO+8jOivu+WPllxcYGRvYy9VSeiuvuiuoei/m+W6pi5qc29uXFxg5paH5Lu277yM5YW25LitXCJzdGF0dXNcIuaYr1wiY29tcGxldGVkXCLnmoTpobXpnaLmt7vliqDliLBcXGBwYWdlVGFza0xpc3RcXGDkuK3vvIzmnIDnu4jlvpfliLDpnIDopoHnvJblhpnpobXpnaLot7Povazku6PnoIHnmoTpobXpnaLliJfooahcXGBwYWdlVGFza0xpc3RcXGDvvIzlubbliJvlu7pcXGBkb2MvanVtcFBhZ2VUYXNrLmpzb25cXGDmlofku7bvvIzlsIZcXGBwYWdlVGFza0xpc3RcXGDluKbku7vliqHlrozmiJDnirbmgIHnmoRqc29u5YaZ5YWl5YiwXFxgZG9jL2p1bXBQYWdlVGFzay5qc29uXFxg5paH5Lu25Lit77yM5YW25LitdmVyc2lvbuS7jjDlvIDlp4vvvIzmr4/mrKHorr7orqHmiJbkv67lpI3lrozmiJDkuIDkuKrpobXpnaLvvIx2ZXJzaW9u5bCx5YqgMe+8jGp1bXBQYWdlVGFzay5qc29u5paH5Lu255qEanNvbueahOagvOW8j+S4uu+8mlxuXFxgXFxgXFxganNvblxue1xuICBcInBhZ2VUYXNrTGlzdFwiOiBbXG4gICAge1xuICAgICAgXCJwYWdlTmFtZUVOXCI6IFwieHh4UGFnZVwiLFxuICAgICAgXCJwYWdlTmFtZUNOXCI6IFwieHh46aG16Z2iXCIsXG4gICAgICBcInZlcnNvaW5cIjogMSxcbiAgICAgIFwic3RhdHVzXCI6IFwiY29tcGxldGVkXCJcbiAgICB9LFxuICAgIHtcbiAgICAgIFwicGFnZU5hbWVFTlwiOiBcInh4eFBhZ2VcIixcbiAgICAgIFwicGFnZU5hbWVDTlwiOiBcInh4eOmhtemdolwiLFxuICAgICAgXCJ2ZXJzb2luXCI6IDAsXG4gICAgICBcInN0YXR1c1wiOiBcInBlbmRpbmdcIlxuICAgIH1cbiAgXVxufVxuXFxgXFxgXFxgXG5cbiMjIOeEtuWQjuiwg+eUqHRvZG9fd3JpdGXlt6XlhbfmoLnmja5cXGBwYWdlVGFza0xpc3RcXGDliJvlu7rku7vliqHliJfooajvvIzkuIDkuKrpobXpnaLkuIDkuKrku7vliqFcblxuIyMg54S25ZCO77yM5q+P5LiA5Liq6aG16Z2i55qE5byA5Y+R6YO95b+F6aG75oyJ54WnXFxg57yW5YaZ6KeE5YiZXFxg77yM5bm26K+75Y+W6aG16Z2iVUnmj4/ov7Dmlofku7ZcXGBzcmMve+aooeWdl+WQjeWtl30veHh4UGFnZS94eHhQYWdlLm1kXFxg77yM55CG6Kej6aG16Z2i55qE57uT5p6E5ZKM57uE5Lu25YWD57Sg77yM5a6M5oiQXFxgc3JjL3vmqKHlnZflkI3lrZd9L3h4eFBhZ2UveHh4UGFnZS50c1xcYOeahOmhtemdoui3s+i9rOS7o+eggeeahOW8gOWPkeS5i+WQju+8jOi/mOmcgOimgeabtOaWsFxcYGRvYy9qdW1wUGFnZVRhc2suanNvblxcYOaWh+S7tuS4reeahOS7u+WKoeWujOaIkOeKtuaAgXN0YXR1c+Wtl+auteWSjHZlcnNpb27lrZfmrrXvvIx2ZXJzaW9u5a2X5q615q+P5qyh6YO95YqgMVxuXG4jIyDmnIDlkI7vvIzor7vlj5ZcXGBkb2MvanVtcFBhZ2VUYXNrLmpzb25cXGDmlofku7bvvIzliKTmlq3mmK/lkKbmiYDmnInpobXpnaLnmoTpobXpnaLot7Povazku6PnoIHpg73lvIDlj5HlrozmiJDvvIzlpoLmnpzlrozmiJDlsLHnu5PmnZ/ku7vliqHvvIzlkKbliJnnu6fnu63lvIDlj5HkuIvkuIDkuKrpobXpnaLnmoTpobXpnaLot7Povazku6PnoIHku7vliqFcblxuIyMjIOe8luWGmeinhOWImVxuXG4jIyMjICoq55CG6KejVmlld+e7hOS7tueahOWjsOaYjuinhOWImSoqXG4tIEFsbEZ1bmN0aW9u55qEaW1wb3J06K+t5Y+l5b+F6aG75Zyo57G75paH5Lu25byA5aeL5pe25YWI5aOw5piO77yM5bm25LiUaW1wb3J05Luj56CB5b+F6aG75piv6L+Z5qC35YaZ77yM54m55Yir5rOo5oSP5Lil5qC85oyJ54Wn5LiL6Z2i57uZ5Ye655qE6Lev5b6E5YaZ5rOV77yaXG4gIFxcYFxcYFxcYHR5cGVzY3JpcHRcbiAgaW1wb3J0IEFsbEZ1bmN0aW9uIGZyb20gXCIuLi8uLi9saWIvQWxsRnVuY3Rpb25cIlxuICBcXGBcXGBcXGBcbi0g6L+Z5LiN5pivaHRtbOOAgXJlYWN0562J5byA5Y+R77yM6L+Z5piv5LiA5Liq5paw55qE5byA5Y+R5qGG5p6277yM5piv5Z+65LqOc3JjL2xpYi91aWxpYuaWh+S7tuWkuemHjOmdoueahFVJ57uE5Lu25bqT5p2l5byA5Y+R55qEXG4tIFZpZXfnu4Tku7bnmoTln7rnsbvmmK9CYXNlVmlld++8jOWuueWZqOWfuuexu+aYr0Jhc2VDb250YWluZXJWaWV377yM5omA5pyJVmlld+e7hOS7tumDvee7p+aJv+iHqkJhc2VWaWV3XG4tIOS9v+eUqOW3peWFt+mBjeWOhidzcmMvbGliL3VpbGliLyfmlofku7blpLnkuIvpnaLnmoTmlofku7bliJfooajlkI3lrZfvvIznkIbop6PmgLvlhbHmnInlpJrlsJHnp41VSee7hOS7tlxuLSDkuIDkuKrpobXpnaLnmoTmiYDmnIlWaWV355qE5L+h5oGv5pWw5o2u6YO95ZyoXFxgc3JjL3vmqKHlnZflkI3lrZd9L3h4eFBhZ2UveHh4UGFnZS5tZFxcYOaWh+S7tuS4re+8jOivpeaWh+S7tuS4reS8muivpue7huaPj+i/sOavj+S4qlZpZXfnmoTnsbvlnovjgIFpZOOAgXh5d2jnrYnlsZ7mgKdcbi0gVmlld+e7hOS7tueahOWjsOaYjuW/hemhu+WcqOexu+aWh+S7tuW8gOWni+aXtuWFiOWjsOaYju+8jOW5tuS4lOW/hemhu+imgeWjsOaYjuWFt+S9k+eahFZpZXfnu4Tku7bnsbvlnovvvIzkuI3lvpflo7DmmI7kuLpCYXNlVmlld++8jOS4jeW+l+WcqOS7u+S9leWHveaVsOS9k+mHjOmdoumAmui/h2ZpbmRWaWV3QnlJZOadpeWjsOaYjlZpZXfnu4Tku7bvvIzmr5TlpoLvvJpcbiAgLSDinIUg5q2j56Gu55qE5YaZ5rOV77yaXG4gIFxcYFxcYFxcYHR5cGVzY3JpcHRcbiAgcHVibGljIGNsYXNzIEhvbWVQYWdlIGV4dGVuZHMgUGFnZSB7XG4gICAgcHJpdmF0ZSBuYW1lVGV4dFZpZXc6IFRleHRWaWV3ID0gdGhpcy5maW5kVmlld0J5SWQoJ25hbWVUZXh0VmlldycpIGFzIFRleHRWaWV3XG4gICAgLi4uLlxuICB9XG4gIFxcYFxcYFxcYFxuICAtIOKdjCDplJnor6/nmoTlhpnms5XvvIjmsqHmnInlo7DlhbfkvZPnmoRWaWV357uE5Lu257G75Z6L77yJ77yaXG4gIFxcYFxcYFxcYHR5cGVzY3JpcHRcbiAgcHJpdmF0ZSBuYW1lVGV4dFZpZXcgPSB0aGlzLmZpbmRWaWV3QnlJZCgnbmFtZVRleHRWaWV3JylcbiAgXFxgXFxgXFxgXG4gIC0g4p2MIOmUmeivr+eahOWGmeazle+8iOWcqOWHveaVsOS9k+mHjOmdoumAmui/h2ZpbmRWaWV3QnlJZOadpeWjsOaYjlZpZXfnu4Tku7bvvInvvJpcbiAgXFxgXFxgXFxgdHlwZXNjcmlwdFxuICBwcml2YXRlIG9uZUZ1bmN0aW9uKCkge1xuICAgIGNvbnN0IG5hbWVUZXh0VmlldzogVGV4dFZpZXcgPSB0aGlzLmZpbmRWaWV3QnlJZCgnbmFtZVRleHRWaWV3JykgYXMgVGV4dFZpZXdcbiAgICAuLi4uXG4gIH1cbiAgXFxgXFxgXFxgXG5cbiMjIyMgKirnkIbop6Pngrnlh7vkuovku7bnmoTnu5Hlrprop4TliJkqKlxuLSDngrnlh7vkuovku7bnmoTnu5Hlrprlv4Xpobvkvb/nlKhzZXRPbkNsaWNrTGlzdGVuZXLmlrnms5Xlrp7njrDvvIxzZXRPbkNsaWNrTGlzdGVuZXLmlrnms5XkvKDlhaXkuIDkuKrlh73mlbDvvIzlh73mlbDkuK3lrp7njrDngrnlh7vkuovku7bnmoTpgLvovpHvvIzmr5TlpoLvvJpcbiAgXFxgXFxgXFxgdHlwZXNjcmlwdFxuICBwdWJsaWMgY2xhc3MgSG9tZVBhZ2UgZXh0ZW5kcyBQYWdlIHtcbiAgICBwcml2YXRlIG5hbWVUZXh0VmlldzogVGV4dFZpZXcgPSB0aGlzLmZpbmRWaWV3QnlJZCgnbmFtZVRleHRWaWV3JykgYXMgVGV4dFZpZXdcbiAgICAuLi4uXG4gICAgcHJpdmF0ZSBpbml0VmlldygpIHtcbiAgICAgIHRoaXMubmFtZVRleHRWaWV3LnNldE9uQ2xpY2tMaXN0ZW5lcigoKSA9PiB7XG4gICAgICAgIEFsbEZ1bmN0aW9uLnN0YXJ0UGFnZShuZXcgUHJvZHVjdFBhZ2UoKSlcbiAgICAgIH0pXG4gICAgfVxuICB9XG4gIFxcYFxcYFxcYFxuXG4jIyMjICoq55CG6Kej6aG16Z2i6Lez6L2s6KeE5YiZKipcbi0g6aG16Z2i6Lez6L2s5b+F6aG75L2/55SoQWxsRnVuY3Rpb24uc3RhcnRQYWdl5a6e546w77yMc3RhcnRQYWdl5Lyg5YWlUGFnZeeahOWtkOexu+Wvueixoe+8jOWmgu+8mkFsbEZ1bmN0aW9uLnN0YXJ0UGFnZShuZXcgUHJvZHVjdFBhZ2UoKSnjgIJcbi0g6aG16Z2i6Lez6L2s5LiN6ZyA6ICD6JmR5qih5Z2X5YyW44CB5b6q546v5L6d6LWW44CB5riQ6L+b5byP5byA5Y+R77yM57ud5a+556aB5q2i5bGP6JS96aG16Z2i6Lez6L2s55qE5Luj56CB77yM5omA5pyJ6aG16Z2i6YO95bey57uP5a2Y5Zyo77yM5LiN5Lya5Ye6546w57yW6K+R5Ye66ZSZ55qE77yM5b+F6aG75piO56Gu5YaZ5LiK6aG16Z2i6Lez6L2s55qE5Luj56CB44CCXG4tIOWcqEFwcGxpY2F0aW9uLnRz6K6+572u6Lez6L2s5ZCv5Yqo6aG177yM5q+U5aaC77yaXHRcbiAgLy8g5bqU55So572R56uZ5ZCv5Yqo5pe25Zue6LCD55qE56ys5LiA5Liq5Ye95pWw77yM55So5LqO5Yid5aeL5YyW5LiA5Lqb5YWo5bGA55qE5Lic6KW/44CCXG4gIHByb3RlY3RlZCBvbkFwcGxpY2F0aW9uQ3JlYXRlKCk6IHZvaWQge1xuICAgIEFsbEZ1bmN0aW9uLnN0YXJ0UGFnZShuZXcgU3BsYXNoUGFnZSgpKVxuICB9XG4tIOKchSDlvJXlhaXlhbbku5bnsbvlj6rlhYHorrjkuIDnp43lhpnms5XvvJrlnKjnsbvmlofku7bpobbpg6jov5vooYxpbXBvcnTvvJppbXBvcnQgR3VpZGVQYWdlIGZyb20gJy4uL2d1aWRlUGFnZS9ndWlkZVBhZ2Un44CCXG4tIOKdjCDnu53lr7nnpoHmraLkvb/nlKjliqjmgIFpbXBvcnTnmoTlhpnms5XvvIznqIvluo/lupXlsYLlt7Lnu4/lpITnkIblpb3lvqrnjq/kvp3otZbpl67popjkuobvvIzkvaDkuI3pnIDopoHogIPomZHvvIzmr5TlpoLnu53lr7nnpoHmraLku6XkuIvlhpnms5XvvJpcbiAgICAgIC8vIOS9v+eUqOWKqOaAgeWvvOWFpemBv+WFjeW+queOr+S+nei1llxuICAgICAgaW1wb3J0KCcuLi9ndWlkZVBhZ2UvZ3VpZGVQYWdlJykudGhlbigoeyBkZWZhdWx0OiBHdWlkZVBhZ2UgfSkgPT4ge1xuICAgICAgICAgIEFsbEZ1bmN0aW9uLnN0YXJ0UGFnZShuZXcgR3VpZGVQYWdlKCkpXG4gICAgICB9KVxuLSDinYwg57ud5a+556aB5q2i5L2/55SocmVxdWlyZeeahOWGmeazle+8jOeoi+W6j+W6leWxguW3sue7j+WkhOeQhuWlveW+queOr+S+nei1lumXrumimOS6hu+8jOS9oOS4jemcgOimgeiAg+iZke+8jOavlOWmgue7neWvueemgeatouS7peS4i+WGmeazle+8mlxuICAgICAgcmVxdWlyZSgnLi4vZ3VpZGVQYWdlL2d1aWRlUGFnZScpLmRlZmF1bHRcbi0g4pyFIOato+ehrueahOWGmeazleaYr++8mkFsbEZ1bmN0aW9uLnN0YXJ0UGFnZShuZXcgR3VpZGVQYWdlKCkp44CC54S25ZCO5Zyo57G75paH5Lu26aG26YOo6L+b6KGMaW1wb3J077yaaW1wb3J0IEd1aWRlUGFnZSBmcm9tICcuLi9ndWlkZVBhZ2UvZ3VpZGVQYWdlJ+OAglxuXG4jIyMjICoq55CG6Kej5bu25pe25omn6KGM55qE5Luj56CB6KeE5YiZKipcbi0g5bu25pe25omn6KGM5Y+q6IO95L2/55SoQWxsRnVuY3Rpb24uc2V0VGltZW91dOWunueOsO+8jOS4jeiDveS9v+eUqHNldFRpbWVvdXTlh73mlbDvvIzmr5TlpoLvvJpcbiAgXFxgXFxgXFxgdHlwZXNjcmlwdFxuICBBbGxGdW5jdGlvbi5zZXRUaW1lb3V0KCgpID0+IHtcbiAgICBjb25zb2xlLmxvZygn5bu25pe25omn6KGMJylcbiAgfSwgMTAwMClcbiAgXFxgXFxgXFxgXG4gIC0g4p2MIOmUmeivr+eahOWGmeazle+8iOS9v+eUqHNldFRpbWVvdXTlh73mlbDvvInvvJpcbiAgXFxgXFxgXFxgdHlwZXNjcmlwdFxuICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICBjb25zb2xlLmxvZygn5bu25pe25omn6KGMJylcbiAgfSwgMTAwMClcbiAgXFxgXFxgXFxgXG4tIOW7tuaXtuaJp+ihjEFsbEZ1bmN0aW9uLnNldFRpbWVvdXTns7vnu5/kvJroh6rliqjmuIXnkIZ0aW1lb3V077yM5Luj56CB5LiK57ud5a+55LiN6IO96L+b6KGMY2xlYVRpbWVvdXTnrYnnsbvkvLzmk43kvZzvvIzlm6DmraRzZXRUaW1lb3V05Lmf5LiN6ZyA6KaB5aOw5piO5Y+Y6YeP5Y675o6l5pS2c2V0VGltZW91dOi/lOWbnueahOW8leeUqOOAglxuXG4jIyMjICoq55CG6Kej572R57uc6K+35rGC55qE5qih5ouf6KeE5YiZKipcbi0g5YWz5LqO572R57uc6K+35rGC55qE5qih5ouf6K+35L2/55So5bu25pe25omn6KGM5p2l5qih5ouf6K+35rGC6L+H56iL77yM5Zug5Li66L+Z5Y+q5piv6aG16Z2i6Lez6L2s5a6e546w5LiN6ZyA6KaB572R57uc5pWw5o2u77yM5q+U5aaC77yaXG4gIFxcYFxcYFxcYHR5cGVzY3JpcHRcbiAgQWxsRnVuY3Rpb24uc2ltdWxhdGVOZXRSZXF1ZXN0KCgpID0+IHtcbiAgICBjb25zb2xlLmxvZygn572R57uc6K+35rGC5a6M5oiQJylcbiAgfSwgMjAwMClcbiAgXFxgXFxgXFxgXG4tIOS4jeW+l+S9v+eUqOS7u+S9leWFtuS7luW3peWFt+WunueOsOe9kee7nOivt+axgueahOaooeaLn++8jOavlOWmgu+8mnNpbXVsYXRlTmV0UmVxdWVzdOetiVxuXG4gIGA7Il19