bytefun-ai-mcp
Version:
ByteFun AI MCP服务 - 打通产品设计、UI设计、代码开发的服务平台,支持设计稿转代码和跨平台原生代码开发
205 lines (180 loc) • 24.7 kB
JavaScript
export const codePromptTemplate = `
- **结尾禁止分号**:一句代码的结尾禁止写分号,不需要写分号的
- 只实现页面跳转和关闭页面的代码,其他任何代码不允许编写
- 绝对禁止注释页面跳转代码,即使跳转的目标页面的UI还没有开发完毕,也要先写上页面跳转代码,否则用户会认为你没有实现页面跳转代码
- 必须要完成所有页面的页面跳转代码开发才能结束任务,才能停止该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()
})
}
}
\`\`\`
1. **过度解读UI结构**:看到Toast组件就认为需要实现Toast功能 ❌
2. **基于开发经验**:认为页面需要完整的业务逻辑与交互逻辑 ❌
3. **功能完整性误解**:认为需要实现页面的所有功能 ❌
4. **忽略明确指令**:没有严格遵循"只实现页面跳转"的要求 ❌
1. **严格按指令执行**:只实现页面跳转,其他一律不写 ✅
2. **明确任务边界**:页面跳转 ≠ 页面功能 ✅
3. **简洁实现原则**:最少代码完成跳转需求 ✅
4. **忽略UI复杂性**:不管UI多复杂,只关注跳转逻辑 ✅
\`\`\`json
{
"pageTaskList": [
{
"pageNameEN": "xxxPage",
"pageNameCN": "xxx页面",
"versoin": 1,
"status": "completed"
},
{
"pageNameEN": "xxxPage",
"pageNameCN": "xxx页面",
"versoin": 0,
"status": "pending"
}
]
}
\`\`\`
- 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