UNPKG

ng-yunzai-mobile

Version:

1. 适配yunzai_uni_app_x

656 lines 58.3 kB
/** * @fileoverview added by tsickle * Generated from: select-contacts/yz-select-contacts/yz-select-contacts.component.ts * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Component, Inject } from '@angular/core'; import { ModalService } from "ng-zorro-antd-mobile"; import { ComponentOption } from "./dept.interface"; import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; import { YzSelectContactsService } from './yz-select-contacts.service'; export class YzSelectContactsComponent { /** * @param {?} dialogRef * @param {?} _modal * @param {?} yzContactsService * @param {?} data */ constructor(dialogRef, _modal, yzContactsService, data) { this.dialogRef = dialogRef; this._modal = _modal; this.yzContactsService = yzContactsService; this.data = data; this.modalRefCpt = []; this.subscribed = []; this.dtPullToRefreshStyle = { height: window.innerHeight - 44 - 51 + 'px' }; // 总部门数据 this.deptNodes = []; // 页面展示的部门数据 this.deptList = []; // 面包屑 this.deptBarList = []; // 页面加载中 this.pageLoading = false; // 人员列表参数 this.baseUserParams = { total: 0, pageSize: 20, pageNum: 1, deptId: null, realName: null, userTypes: null }; // 人员数据 this.baseUserList = []; // 是否全选人员 this.allUserCheck = false; // 已选择的联系人 this.selectedContacts = []; // 年级数据 this.gradeList = []; this.gradeParams = []; } /** * @return {?} */ ngOnInit() { if (this.data.onlyStudent === true) { this.baseUserParams.userTypes = '2,3'; this.dtPullToRefreshStyle = { height: window.innerHeight - 44 - 51 - 44 + 'px' }; this.initDeptOnlyStu(); this.queryGrade(); } else { this.baseUserParams.userTypes = this.data.userTypes; this.dtPullToRefreshStyle = { height: window.innerHeight - 44 - 51 + 'px' }; this.initDept(); } } // 查询部门树 /** * @return {?} */ initDept() { this.deptList = []; this.deptNodes = []; this.pageLoading = true; /** @type {?} */ const $temp = this.yzContactsService.getDeptTree(this.data.includeClass, this.data.includeHisClass).subscribe((/** * @param {?} dept * @return {?} */ (dept) => { this.pageLoading = false; this.deptNodes = dept; this.deptList = JSON.parse(JSON.stringify(this.deptNodes)); this.queryDefaultContact(); this.blDeptTree(this.deptList); this.blDeptTree(this.deptNodes); this.subscribed.push($temp); }), (/** * @return {?} */ () => { this.pageLoading = false; })); } // 查询部门->只选学生 /** * @return {?} */ initDeptOnlyStu() { this.deptList = []; this.deptNodes = []; this.pageLoading = true; /** @type {?} */ let gradeId = null; if (this.gradeParams.length > 0) { gradeId = this.gradeParams[0].value; } /** @type {?} */ const $temp = this.yzContactsService.getDeptTreeOnlyStu(gradeId, this.data.includeClass, this.data.includeHisClass).subscribe((/** * @param {?} dept * @return {?} */ (dept) => { this.pageLoading = false; this.deptNodes = dept; this.deptList = JSON.parse(JSON.stringify(this.deptNodes)); this.queryDefaultContact(); this.blDeptTree(this.deptList); this.blDeptTree(this.deptNodes); this.subscribed.push($temp); }), (/** * @return {?} */ () => { this.pageLoading = false; })); } // 查询年级 /** * @return {?} */ queryGrade() { this.gradeList = []; this.pageLoading = true; /** @type {?} */ const $temp = this.yzContactsService.getGrade().subscribe((/** * @param {?} data * @return {?} */ (data) => { this.pageLoading = false; this.gradeList = []; data.forEach((/** * @param {?} item * @return {?} */ (item) => { if (item.enable !== 0 && item.enable !== null) { this.gradeList.push({ value: item.openId, label: item.name }); } })); this.gradeList.unshift({ value: null, label: '全部' }); this.subscribed.push($temp); }), (/** * @return {?} */ () => { this.pageLoading = false; this.gradeList.unshift({ value: null, label: '全部' }); })); } // 遍历部门树,确定叶子节点 /** * @param {?} tree * @return {?} */ blDeptTree(tree) { if (tree && tree.length && tree.length > 0) { tree.forEach((/** * @param {?} item * @return {?} */ (item) => { item.expanded = true; if (item.children === null || item.children.length === 0) { item['isLeaf'] = true; } else { item['isLeaf'] = false; } this.blDeptTree(item.children); })); } } // 查询默认已被选择人员的信息 /** * @return {?} */ queryDefaultContact() { if (this.data.defaultContacts && this.data.defaultContacts.length > 0) { /** @type {?} */ const userIdsArray = []; this.data.defaultContacts.forEach((/** * @param {?} item * @return {?} */ (item) => { if (item.userId) { userIdsArray.push(item.userId); } })); this.pageLoading = true; /** @type {?} */ const $temp = this.yzContactsService.getUserByUserIds(userIdsArray).subscribe((/** * @param {?} data * @return {?} */ (data) => { this.pageLoading = false; this.selectedContacts = data; this.queryBaseUser(); this.subscribed.push($temp); }), (/** * @return {?} */ () => { this.pageLoading = false; })); } else { this.queryBaseUser(); } } // 查询人员列表 /** * @return {?} */ queryBaseUser() { this.pageLoading = true; /** @type {?} */ const $temp = this.yzContactsService.getBaseUser(this.baseUserParams.pageNum, this.baseUserParams.pageSize, this.baseUserParams.realName, this.baseUserParams.deptId, this.baseUserParams.userTypes).subscribe((/** * @param {?} data * @return {?} */ (data) => { this.pageLoading = false; this.baseUserParams.total = data.total; this.baseUserList.push(...data.list); this.baseUserList.forEach((/** * @param {?} item * @return {?} */ (item) => { item['checked'] = false; item['disabled'] = false; if (!item.dept) { item.dept = { deptName: '暂无部门' }; } if (!item.realName) { item.realName = '暂无姓名'; } if (!item.userCode) { item.realName = '暂无学/工号'; } if (!item.roles) { item.roles = []; item.rolesData = '暂无角色'; } else { /** @type {?} */ const roleArray = []; item.roles.forEach((/** * @param {?} value * @return {?} */ (value) => { roleArray.push(value.roleName); })); item.rolesData = roleArray.toString(); } this.selectedContacts.forEach((/** * @param {?} value * @return {?} */ (value) => { if (value.userId === item.userId) { item['checked'] = true; } })); })); this.isMaxCount(); this.subscribed.push($temp); }), (/** * @return {?} */ () => { this.pageLoading = false; })); } // 刷新回调函数 /** * @return {?} */ pullToRefresh() { if (this.baseUserList.length < this.baseUserParams.total) { this.baseUserParams.pageNum++; this.queryBaseUser(); } } // 根据用户姓名即时搜索人员 /** * @return {?} */ queryUserByRealName() { this.baseUserParams.pageNum = 1; this.baseUserList = []; this.queryBaseUser(); } // 取消——根据用户姓名即时搜索人员 /** * @return {?} */ cancelQueUserByRealName() { this.baseUserParams.realName = null; this.baseUserParams.pageNum = 1; this.baseUserList = []; this.queryBaseUser(); } // 查询全部人员 /** * @return {?} */ viewAllList() { this.deptList = JSON.parse(JSON.stringify(this.deptNodes)); this.deptBarList = []; this.baseUserParams.deptId = ''; this.baseUserParams.pageNum = 1; this.baseUserList = []; this.queryBaseUser(); } // 顶部面包屑查看部门详细 /** * @param {?} item * @param {?} index * @return {?} */ deptBarviewList(item, index) { if (index != this.deptBarList.length - 1) { this.deptList = item.children; this.deptBarList.length = index + 1; this.baseUserParams.deptId = item.key; this.baseUserParams.pageNum = 1; this.baseUserList = []; this.queryBaseUser(); } } // 查看子部门 -> 查询当前部门人员 /** * @param {?} item * @return {?} */ viewDeptChildrenList(item) { if (item.isLeaf) { // 是叶子节点,无子部门 this.deptList = []; } else { this.deptList = item.children; } this.deptBarList.push(item); this.baseUserParams.deptId = item.key; this.baseUserParams.pageNum = 1; this.baseUserList = []; this.queryBaseUser(); } // 人员选择变化的回调 /** * @param {?} $event * @return {?} */ userCheckedChange($event) { if ($event.checked) { // 选中 this.allUserCheck = this.baseUserList.every((/** * @param {?} item * @return {?} */ (item) => { return item.checked === true; })); } else { // 取消 // 取消 /** @type {?} */ let itemIndex = 0; this.selectedContacts.forEach((/** * @param {?} value * @param {?} index * @return {?} */ (value, index) => { if (value.userId === $event.value) { itemIndex = index; } })); this.deleteContact($event.value, itemIndex); } this.addBaseUser(); } // 将人员列表中选中项添加至已选择的人员列表中 /** * @return {?} */ addBaseUser() { this.baseUserList.forEach((/** * @param {?} item * @return {?} */ (item) => { /** @type {?} */ const hasThisMen = this.selectedContacts.some((/** * @param {?} value * @return {?} */ (value) => { return value.userId === item.userId; })); if (item.checked && !hasThisMen) { this.selectedContacts.push(item); } })); this.isMaxCount(); } // 人数选择达到最大值 /** * @return {?} */ isMaxCount() { if (this.data.count > 0 && this.selectedContacts.length >= this.data.count) { this.selectedContacts.length = this.data.count; this.baseUserList.forEach((/** * @param {?} item * @return {?} */ (item) => { /** @type {?} */ const hasThisUser = this.selectedContacts.some((/** * @param {?} value * @return {?} */ (value) => { return item.userId === value.userId; })); if (!hasThisUser) { item.checked = false; item.disabled = true; } })); } else { this.baseUserList.forEach((/** * @param {?} item * @return {?} */ (item) => { item.disabled = false; })); } if (this.baseUserList.length == 0) { this.allUserCheck = false; } else { this.allUserCheck = this.baseUserList.every((/** * @param {?} item * @return {?} */ (item) => { return item.checked === true; })); } } // 删除联系人 /** * @param {?} id * @param {?} index * @return {?} */ deleteContact(id, index) { this.selectedContacts.splice(index, 1); this.baseUserList.forEach((/** * @param {?} item * @return {?} */ (item) => { if (item.userId === id) { item.checked = false; } })); if (this.baseUserList.length == 0) { this.allUserCheck = false; } else { this.allUserCheck = this.baseUserList.every((/** * @param {?} item * @return {?} */ (item) => { return item.checked === true; })); } } // 全选 /** * @return {?} */ allSelect() { this.allUserCheck = true; this.baseUserList.forEach((/** * @param {?} item * @return {?} */ (item) => { item.checked = true; })); this.addBaseUser(); } // 取消全选 /** * @return {?} */ cancelAllSelect() { this.allUserCheck = false; this.baseUserList.forEach((/** * @param {?} item * @return {?} */ (item) => { /** @type {?} */ let itemIndex = 0; this.selectedContacts.forEach((/** * @param {?} value * @param {?} index * @return {?} */ (value, index) => { if (value.userId === item.userId) { itemIndex = index; } })); this.deleteContact(item.userId, itemIndex); })); } // 切换年级 /** * @param {?} $event * @return {?} */ onChangeGrade($event) { if ($event && $event.length && $event.length > 0) { this.gradeParams = $event; } else { this.gradeParams = [{ value: null, label: '全部' }]; } this.deptBarList = []; this.baseUserParams.deptId = ''; this.baseUserParams.pageNum = 1; this.baseUserList = []; this.initDeptOnlyStu(); } // 点“完成”按钮,完成人员选择 /** * @return {?} */ confirmSelect() { this.dialogRef.close(this.selectedContacts); } /** * @return {?} */ ngOnDestroy() { this.subscribed.forEach((/** * @param {?} sub * @return {?} */ (sub) => { sub.unsubscribe(); })); this.modalRefCpt.forEach((/** * @param {?} ref * @return {?} */ (ref) => { ref.destroy(); })); } } YzSelectContactsComponent.decorators = [ { type: Component, args: [{ selector: 'yz-select-contacts', template: "<yz-loading-mask *ngIf=\"pageLoading\"></yz-loading-mask>\r\n<div class=\"yz-select-contacts\">\r\n <div class=\"yz-select-contacts-search\">\r\n <SearchBar [placeholder]=\"'\u8BF7\u8F93\u5165\u59D3\u540D\u2026\u2026'\"\r\n [(ngModel)]=\"baseUserParams.realName\"\r\n (onSubmit)=\"queryUserByRealName()\"\r\n (onCancel)=\"cancelQueUserByRealName()\"\r\n (onClear)=\"cancelQueUserByRealName()\"></SearchBar>\r\n </div>\r\n <div class=\"yz-select-contacts-grade\" *ngIf=\"data.onlyStudent\">\r\n <List [className]=\"'yz-select-contact-list'\">\r\n <ListItem\r\n Picker\r\n [extra]=\"gradeParams.length>0?gradeParams[0].label:'\u8BF7\u9009\u62E9\u5E74\u7EA7\u2026\u2026'\"\r\n [arrow]=\"'horizontal'\"\r\n [data]=\"gradeList\"\r\n [(ngModel)]=\"gradeParams\"\r\n (ngModelChange)=\"onChangeGrade($event)\">\r\n \u5E74\u7EA7\uFF1A\r\n </ListItem>\r\n </List>\r\n </div>\r\n\r\n\r\n <PullToRefresh [ngStyle]=\"dtPullToRefreshStyle\"\r\n [direction]=\"'up'\"\r\n (onRefresh)=\"pullToRefresh()\"\r\n >\r\n <div class=\"yz-select-contact-dept-bar\">\r\n <a (click)=\"viewAllList()\">\u5168\u90E8</a>\r\n <ng-container *ngFor=\"let item of deptBarList;let i=index;\">\r\n <a (click)=\"deptBarviewList(item, i)\">>{{item?.title}}</a>\r\n </ng-container>\r\n </div>\r\n\r\n <!--\u90E8\u95E8-->\r\n <List [className]=\"'yz-select-contact-list'\" *ngIf=\"deptList.length>0\">\r\n <ListItem multipleLine [arrow]=\"'horizontal'\"\r\n [thumb]=\"'./assets/imgs/icon_dept.png'\"\r\n *ngFor=\"let item of deptList\"\r\n (onClick)=\"viewDeptChildrenList(item)\">\r\n {{item?.title || '--'}}\r\n </ListItem>\r\n </List>\r\n\r\n <!--\u4EBA\u5458-->\r\n <List [className]=\"'contact-list'\" *ngIf=\"baseUserList.length>0\">\r\n <CheckboxItem\r\n *ngFor=\"let item of baseUserList\"\r\n [name]=\"item.realName\"\r\n [value]=\"item.userId\"\r\n [(ngModel)]=\"item.checked\"\r\n [disabled]=\"item.disabled\"\r\n (onChange)=\"userCheckedChange($event)\"\r\n >\r\n {{ item.realName }}<small *ngIf=\"item?.userCode\">({{item.userCode}})</small>\r\n </CheckboxItem>\r\n </List>\r\n </PullToRefresh>\r\n\r\n\r\n <div class=\"yz-select-contacts-btn\">\r\n <div class=\"count-box\">\u5DF2\u9009\u62E9\uFF1A{{selectedContacts.length}} \u4EBA</div>\r\n <div Button [type]=\"'primary'\" [size]=\"'small'\" [inline]=\"true\" (onClick)=\"confirmSelect()\">\u5B8C\u6210</div>\r\n <div Button [type]=\"'ghost'\" [size]=\"'small'\" [inline]=\"true\" *ngIf=\"!allUserCheck\" (onClick)=\"allSelect()\">\u5168\u9009</div>\r\n <div Button [type]=\"'ghost'\" [size]=\"'small'\" [inline]=\"true\" *ngIf=\"allUserCheck\" (onClick)=\"cancelAllSelect()\">\r\n \u53D6\u6D88\u5168\u9009\r\n </div>\r\n </div>\r\n\r\n</div>\r\n", styles: ["::ng-deep .yz-select-contact-list .am-list-item .am-list-line .am-list-content{font-size:15px}::ng-deep .yz-select-contact-list .am-list-item img{width:34px;height:34px}.yz-select-contact-dept-bar{background:#efeff4;padding:9px 8px}.yz-select-contact-dept-bar a{display:inline-block;color:#1e90ff;margin-bottom:3px;letter-spacing:2px}.yz-select-contact-dept-bar a:last-child{color:#444}::ng-deep .yz-select-contacts-search{width:100%;background:#fff}::ng-deep .yz-select-contacts-search .am-search{background:#fff}::ng-deep .yz-select-contacts-search .am-search-input{background-color:#efeff4}::ng-deep .yz-select-contacts-btn{background:#fff;border-top:1px solid #d9d9d9;position:fixed;bottom:0;left:0;width:100%;padding:10px 0;z-index:5}::ng-deep .yz-select-contacts-btn .am-button-small{display:block;float:right;margin-right:10px}::ng-deep .yz-select-contacts-btn .count-box{display:block;float:left;line-height:30px;margin-left:10px;max-width:calc(100% - 150px);text-overflow:ellipsis;white-space:nowrap;overflow:hidden}::ng-deep .yz-select-contacts-panel{position:fixed!important;top:0;left:0;z-index:10;width:100%;height:100%;background:#fff;max-width:unset!important}::ng-deep .yz-select-contacts-panel .mat-dialog-container{padding:0;border-radius:0;transform:none!important}"] }] } ]; /** @nocollapse */ YzSelectContactsComponent.ctorParameters = () => [ { type: MatDialogRef }, { type: ModalService }, { type: YzSelectContactsService }, { type: ComponentOption, decorators: [{ type: Inject, args: [MAT_DIALOG_DATA,] }] } ]; if (false) { /** @type {?} */ YzSelectContactsComponent.prototype.modalRefCpt; /** @type {?} */ YzSelectContactsComponent.prototype.subscribed; /** @type {?} */ YzSelectContactsComponent.prototype.dtPullToRefreshStyle; /** @type {?} */ YzSelectContactsComponent.prototype.deptNodes; /** @type {?} */ YzSelectContactsComponent.prototype.deptList; /** @type {?} */ YzSelectContactsComponent.prototype.deptBarList; /** @type {?} */ YzSelectContactsComponent.prototype.pageLoading; /** @type {?} */ YzSelectContactsComponent.prototype.baseUserParams; /** @type {?} */ YzSelectContactsComponent.prototype.baseUserList; /** @type {?} */ YzSelectContactsComponent.prototype.allUserCheck; /** @type {?} */ YzSelectContactsComponent.prototype.selectedContacts; /** @type {?} */ YzSelectContactsComponent.prototype.gradeList; /** @type {?} */ YzSelectContactsComponent.prototype.gradeParams; /** @type {?} */ YzSelectContactsComponent.prototype.dialogRef; /** * @type {?} * @private */ YzSelectContactsComponent.prototype._modal; /** * @type {?} * @private */ YzSelectContactsComponent.prototype.yzContactsService; /** @type {?} */ YzSelectContactsComponent.prototype.data; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoieXotc2VsZWN0LWNvbnRhY3RzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25nLXl1bnphaS1tb2JpbGUvIiwic291cmNlcyI6WyJzZWxlY3QtY29udGFjdHMveXotc2VsZWN0LWNvbnRhY3RzL3l6LXNlbGVjdC1jb250YWN0cy5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQUMsU0FBUyxFQUFFLE1BQU0sRUFBb0IsTUFBTSxlQUFlLENBQUM7QUFDbkUsT0FBTyxFQUFXLFlBQVksRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBRTVELE9BQU8sRUFBb0IsZUFBZSxFQUFnQixNQUFNLGtCQUFrQixDQUFDO0FBQ25GLE9BQU8sRUFBQyxlQUFlLEVBQUUsWUFBWSxFQUFDLE1BQU0sMEJBQTBCLENBQUM7QUFDdkUsT0FBTyxFQUFDLHVCQUF1QixFQUFDLE1BQU0sOEJBQThCLENBQUM7QUFPckUsTUFBTSxPQUFPLHlCQUF5Qjs7Ozs7OztJQXlDcEMsWUFDUyxTQUFrRCxFQUNqRCxNQUFvQixFQUNwQixpQkFBMEMsRUFDbEIsSUFBcUI7UUFIOUMsY0FBUyxHQUFULFNBQVMsQ0FBeUM7UUFDakQsV0FBTSxHQUFOLE1BQU0sQ0FBYztRQUNwQixzQkFBaUIsR0FBakIsaUJBQWlCLENBQXlCO1FBQ2xCLFNBQUksR0FBSixJQUFJLENBQWlCO1FBM0N2RCxnQkFBVyxHQUFvQixFQUFFLENBQUM7UUFDbEMsZUFBVSxHQUF3QixFQUFFLENBQUM7UUFDckMseUJBQW9CLEdBQUcsRUFBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLFdBQVcsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLElBQUksRUFBQyxDQUFDOztRQUdyRSxjQUFTLEdBQXlCLEVBQUUsQ0FBQzs7UUFHckMsYUFBUSxHQUF5QixFQUFFLENBQUM7O1FBR3BDLGdCQUFXLEdBQXlCLEVBQUUsQ0FBQzs7UUFHdkMsZ0JBQVcsR0FBWSxLQUFLLENBQUM7O1FBRzdCLG1CQUFjLEdBQUc7WUFDZixLQUFLLEVBQUUsQ0FBQztZQUNSLFFBQVEsRUFBRSxFQUFFO1lBQ1osT0FBTyxFQUFFLENBQUM7WUFDVixNQUFNLEVBQUUsSUFBSTtZQUNaLFFBQVEsRUFBRSxJQUFJO1lBQ2QsU0FBUyxFQUFFLElBQUk7U0FDaEIsQ0FBQzs7UUFHRixpQkFBWSxHQUE2QixFQUFFLENBQUM7O1FBRzVDLGlCQUFZLEdBQVksS0FBSyxDQUFDOztRQUc5QixxQkFBZ0IsR0FBNkIsRUFBRSxDQUFDOztRQUdoRCxjQUFTLEdBQTRDLEVBQUUsQ0FBQztRQUN4RCxnQkFBVyxHQUE0QyxFQUFFLENBQUM7SUFPdkQsQ0FBQzs7OztJQUVKLFFBQVE7UUFDTixJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxLQUFLLElBQUksRUFBRTtZQUNsQyxJQUFJLENBQUMsY0FBYyxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7WUFDdEMsSUFBSSxDQUFDLG9CQUFvQixHQUFHLEVBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxXQUFXLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsSUFBSSxFQUFDLENBQUM7WUFDL0UsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztTQUNuQjthQUFNO1lBQ0wsSUFBSSxDQUFDLGNBQWMsQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUM7WUFDcEQsSUFBSSxDQUFDLG9CQUFvQixHQUFHLEVBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxXQUFXLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLEVBQUMsQ0FBQztZQUMxRSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7U0FDakI7SUFDSCxDQUFDOzs7OztJQUdELFFBQVE7UUFDTixJQUFJLENBQUMsUUFBUSxHQUFHLEVBQUUsQ0FBQztRQUNuQixJQUFJLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQztRQUNwQixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQzs7Y0FDbEIsS0FBSyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxTQUFTOzs7O1FBQUMsQ0FBQyxJQUEwQixFQUFFLEVBQUU7WUFDM0ksSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7WUFDekIsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7WUFDdEIsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7WUFFM0QsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7WUFFM0IsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDL0IsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDaEMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDOUIsQ0FBQzs7O1FBQUUsR0FBRyxFQUFFO1lBQ04sSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7UUFDM0IsQ0FBQyxFQUFDO0lBQ0osQ0FBQzs7Ozs7SUFHRCxlQUFlO1FBQ2IsSUFBSSxDQUFDLFFBQVEsR0FBRyxFQUFFLENBQUM7UUFDbkIsSUFBSSxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUM7UUFDcEIsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7O1lBQ3BCLE9BQU8sR0FBRyxJQUFJO1FBQ2xCLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQy9CLE9BQU8sR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztTQUNyQzs7Y0FFSyxLQUFLLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGtCQUFrQixDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLFNBQVM7Ozs7UUFBQyxDQUFDLElBQTBCLEVBQUUsRUFBRTtZQUMzSixJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztZQUV6QixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztZQUN0QixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztZQUMzRCxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztZQUUzQixJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUMvQixJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUVoQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM5QixDQUFDOzs7UUFBRSxHQUFHLEVBQUU7WUFDTixJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztRQUMzQixDQUFDLEVBQUM7SUFDSixDQUFDOzs7OztJQUdELFVBQVU7UUFDUixJQUFJLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQztRQUNwQixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQzs7Y0FDbEIsS0FBSyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxTQUFTOzs7O1FBQUMsQ0FBQyxJQUFnQixFQUFFLEVBQUU7WUFDN0UsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7WUFDekIsSUFBSSxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUM7WUFDcEIsSUFBSSxDQUFDLE9BQU87Ozs7WUFBQyxDQUFDLElBQUksRUFBRSxFQUFFO2dCQUNwQixJQUFHLElBQUksQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssSUFBSSxFQUFDO29CQUMzQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQzt3QkFDbEIsS0FBSyxFQUFFLElBQUksQ0FBQyxNQUFNO3dCQUNsQixLQUFLLEVBQUUsSUFBSSxDQUFDLElBQUk7cUJBQ2pCLENBQUMsQ0FBQTtpQkFDSDtZQUNILENBQUMsRUFBQyxDQUFDO1lBRUgsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUM7Z0JBQ3JCLEtBQUssRUFBRSxJQUFJO2dCQUNYLEtBQUssRUFBRSxJQUFJO2FBQ1osQ0FBQyxDQUFDO1lBRUgsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDOUIsQ0FBQzs7O1FBQUUsR0FBRyxFQUFFO1lBQ04sSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7WUFDekIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUM7Z0JBQ3JCLEtBQUssRUFBRSxJQUFJO2dCQUNYLEtBQUssRUFBRSxJQUFJO2FBQ1osQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxFQUFDO0lBQ0osQ0FBQzs7Ozs7O0lBSUQsVUFBVSxDQUFDLElBQUk7UUFDYixJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQzFDLElBQUksQ0FBQyxPQUFPOzs7O1lBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtnQkFDcEIsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7Z0JBQ3JCLElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxJQUFJLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO29CQUN4RCxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsSUFBSSxDQUFDO2lCQUN2QjtxQkFBTTtvQkFDTCxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsS0FBSyxDQUFDO2lCQUN4QjtnQkFFRCxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUNqQyxDQUFDLEVBQUMsQ0FBQTtTQUNIO0lBQ0gsQ0FBQzs7Ozs7SUFHRCxtQkFBbUI7UUFDakIsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFOztrQkFDL0QsWUFBWSxHQUFlLEVBQUU7WUFDbkMsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTzs7OztZQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7Z0JBQ3pDLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRTtvQkFDZixZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztpQkFDaEM7WUFDSCxDQUFDLEVBQUMsQ0FBQztZQUNILElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDOztrQkFDbEIsS0FBSyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLENBQUMsQ0FBQyxTQUFTOzs7O1lBQUMsQ0FBQyxJQUE4QixFQUFFLEVBQUU7Z0JBQy9HLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDO2dCQUN6QixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO2dCQUM3QixJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7Z0JBQ3JCLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzlCLENBQUM7OztZQUFFLEdBQUcsRUFBRTtnQkFDTixJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztZQUMzQixDQUFDLEVBQUM7U0FDSDthQUFNO1lBQ0wsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1NBQ3RCO0lBQ0gsQ0FBQzs7Ozs7SUFHRCxhQUFhO1FBQ1gsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7O2NBQ2xCLEtBQUssR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsV0FBVyxDQUM5QyxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFDM0IsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQzVCLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUM1QixJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFDMUIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQzlCLENBQUMsU0FBUzs7OztRQUFDLENBQUMsSUFBUyxFQUFFLEVBQUU7WUFDeEIsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7WUFDekIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztZQUN2QyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNyQyxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU87Ozs7WUFBQyxDQUFDLElBQUksRUFBRSxFQUFFO2dCQUNqQyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsS0FBSyxDQUFDO2dCQUN4QixJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsS0FBSyxDQUFDO2dCQUN6QixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRTtvQkFDZCxJQUFJLENBQUMsSUFBSSxHQUFHLEVBQUMsUUFBUSxFQUFFLE1BQU0sRUFBQyxDQUFBO2lCQUMvQjtnQkFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRTtvQkFDbEIsSUFBSSxDQUFDLFFBQVEsR0FBRyxNQUFNLENBQUM7aUJBQ3hCO2dCQUNELElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFO29CQUNsQixJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQTtpQkFDekI7Z0JBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUU7b0JBQ2YsSUFBSSxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUM7b0JBQ2hCLElBQUksQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDO2lCQUN6QjtxQkFBTTs7MEJBQ0MsU0FBUyxHQUFHLEVBQUU7b0JBQ3BCLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTzs7OztvQkFBQyxDQUFDLEtBQUssRUFBRSxFQUFFO3dCQUMzQixTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztvQkFDakMsQ0FBQyxFQUFDLENBQUM7b0JBQ0gsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUMsUUFBUSxFQUFFLENBQUM7aUJBQ3ZDO2dCQUNELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPOzs7O2dCQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7b0JBQ3RDLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxJQUFJLENBQUMsTUFBTSxFQUFFO3dCQUNoQyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsSUFBSSxDQUFDO3FCQUN4QjtnQkFDSCxDQUFDLEVBQUMsQ0FBQztZQUNMLENBQUMsRUFBQyxDQUFDO1lBQ0gsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBRWxCLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzlCLENBQUM7OztRQUFFLEdBQUcsRUFBRTtZQUNOLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDO1FBQzNCLENBQUMsRUFBQztJQUNKLENBQUM7Ozs7O0lBR0QsYUFBYTtRQUNYLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLEVBQUU7WUFDeEQsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUM5QixJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7U0FDdEI7SUFDSCxDQUFDOzs7OztJQUdELG1CQUFtQjtRQUNqQixJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUM7UUFDaEMsSUFBSSxDQUFDLFlBQVksR0FBRyxFQUFFLENBQUM7UUFDdkIsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQ3ZCLENBQUM7Ozs7O0lBR0QsdUJBQXVCO1FBQ3JCLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztRQUNwQyxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUM7UUFDaEMsSUFBSSxDQUFDLFlBQVksR0FBRyxFQUFFLENBQUM7UUFDdkIsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQ3ZCLENBQUM7Ozs7O0lBSUQsV0FBVztRQUNULElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO1FBQzNELElBQUksQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFDO1FBRXRCLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxHQUFHLEVBQUUsQ0FBQztRQUNoQyxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUM7UUFDaEMsSUFBSSxDQUFDLFlBQVksR0FBRyxFQUFFLENBQUM7UUFDdkIsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQ3ZCLENBQUM7Ozs7Ozs7SUFHRCxlQUFlLENBQUMsSUFBUyxFQUFFLEtBQWE7UUFDdEMsSUFBSSxLQUFLLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQ3hDLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztZQUM5QixJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sR0FBRyxLQUFLLEdBQUcsQ0FBQyxDQUFDO1lBRXBDLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUM7WUFDdEMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDO1lBQ2hDLElBQUksQ0FBQyxZQUFZLEdBQUcsRUFBRSxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztTQUN0QjtJQUNILENBQUM7Ozs7OztJQUdELG9CQUFvQixDQUFDLElBQUk7UUFDdkIsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLEVBQUUsYUFBYTtZQUM5QixJQUFJLENBQUMsUUFBUSxHQUFHLEVBQUUsQ0FBQztTQUNwQjthQUFNO1lBQ0wsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO1NBQy9CO1FBRUQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFNUIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQztRQUN0QyxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUM7UUFDaEMsSUFBSSxDQUFDLFlBQVksR0FBRyxFQUFFLENBQUM7UUFDdkIsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQ3ZCLENBQUM7Ozs7OztJQUdELGlCQUFpQixDQUFDLE1BQU07UUFDdEIsSUFBSSxNQUFNLENBQUMsT0FBTyxFQUFFLEVBQUUsS0FBSztZQUN6QixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSzs7OztZQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7Z0JBQ25ELE9BQU8sSUFBSSxDQUFDLE9BQU8sS0FBSyxJQUFJLENBQUM7WUFDL0IsQ0FBQyxFQUFDLENBQUM7U0FFSjthQUFNLEVBQUUsS0FBSzs7O2dCQUNSLFNBQVMsR0FBRyxDQUFDO1lBQ2pCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPOzs7OztZQUFDLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxFQUFFO2dCQUM3QyxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssTUFBTSxDQUFDLEtBQUssRUFBRTtvQkFDakMsU0FBUyxHQUFHLEtBQUssQ0FBQztpQkFDbkI7WUFDSCxDQUFDLEVBQUMsQ0FBQztZQUNILElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxTQUFTLENBQUMsQ0FBQztTQUM3QztRQUVELElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUNyQixDQUFDOzs7OztJQUdELFdBQVc7UUFDVCxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU87Ozs7UUFBQyxDQUFDLElBQUksRUFBRSxFQUFFOztrQkFDM0IsVUFBVSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJOzs7O1lBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtnQkFDdEQsT0FBTyxLQUFLLENBQUMsTUFBTSxLQUFLLElBQUksQ0FBQyxNQUFNLENBQUE7WUFDckMsQ0FBQyxFQUFDO1lBQ0YsSUFBSSxJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsVUFBVSxFQUFFO2dCQUMvQixJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO2FBQ2xDO1FBQ0gsQ0FBQyxFQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDcEIsQ0FBQzs7Ozs7SUFHRCxVQUFVO1FBQ1IsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRTtZQUMxRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDO1lBQy9DLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTzs7OztZQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7O3NCQUMzQixXQUFXLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUk7Ozs7Z0JBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtvQkFDdkQsT0FBTyxJQUFJLENBQUMsTUFBTSxLQUFLLEtBQUssQ0FBQyxNQUFNLENBQUE7Z0JBQ3JDLENBQUMsRUFBQztnQkFFRixJQUFJLENBQUMsV0FBVyxFQUFFO29CQUNoQixJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztvQkFDckIsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7aUJBQ3RCO1lBQ0gsQ0FBQyxFQUFDLENBQUE7U0FDSDthQUFNO1lBQ0wsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPOzs7O1lBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtnQkFDakMsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7WUFDeEIsQ0FBQyxFQUFDLENBQUE7U0FDSDtRQUVELElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLElBQUksQ0FBQyxFQUFFO1lBQ2pDLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO1NBQzNCO2FBQU07WUFDTCxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSzs7OztZQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7Z0JBQ25ELE9BQU8sSUFBSSxDQUFDLE9BQU8sS0FBSyxJQUFJLENBQUM7WUFDL0IsQ0FBQyxFQUFDLENBQUM7U0FDSjtJQUNILENBQUM7Ozs7Ozs7SUFHRCxhQUFhLENBQUMsRUFBRSxFQUFFLEtBQUs7UUFDckIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDdkMsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPOzs7O1FBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUNqQyxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssRUFBRSxFQUFFO2dCQUN0QixJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQzthQUN0QjtRQUNILENBQUMsRUFBQyxDQUFDO1FBQ0gsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sSUFBSSxDQUFDLEVBQUU7WUFDakMsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUM7U0FDM0I7YUFBTTtZQUNMLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLOzs7O1lBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtnQkFDbkQsT0FBTyxJQUFJLENBQUMsT0FBTyxLQUFLLElBQUksQ0FBQztZQUMvQixDQUFDLEVBQUMsQ0FBQztTQUNKO0lBQ0gsQ0FBQzs7Ozs7SUFJRCxTQUFTO1FBQ1AsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7UUFDekIsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPOzs7O1FBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUNqQyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztRQUN0QixDQUFDLEVBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUNyQixDQUFDOzs7OztJQUdELGVBQWU7UUFDYixJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQztRQUMxQixJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU87Ozs7UUFBQyxDQUFDLElBQUksRUFBRSxFQUFFOztnQkFDN0IsU0FBUyxHQUFHLENBQUM7WUFDakIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU87Ozs7O1lBQUMsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLEVBQUU7Z0JBQzdDLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxJQUFJLENBQUMsTUFBTSxFQUFFO29CQUNoQyxTQUFTLEdBQUcsS0FBSyxDQUFDO2lCQUNuQjtZQUNILENBQUMsRUFBQyxDQUFDO1lBQ0gsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQzdDLENBQUMsRUFBQyxDQUFBO0lBQ0osQ0FBQzs7Ozs7O0lBR0QsYUFBYSxDQUFDLE1BQU07UUFDbEIsSUFBSSxNQUFNLElBQUksTUFBTSxDQUFDLE1BQU0sSUFBSSxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUNoRCxJQUFJLENBQUMsV0FBVyxHQUFHLE1BQU0sQ0FBQztTQUMzQjthQUFNO1lBQ0wsSUFBSSxDQUFDLFdBQVcsR0FBRyxDQUFDO29CQUNsQixLQUFLLEVBQUUsSUFBSTtvQkFDWCxLQUFLLEVBQUUsSUFBSTtpQkFDWixDQUFDLENBQUM7U0FDSjtRQUVELElBQUksQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFDO1FBQ3RCLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxHQUFHLEVBQUUsQ0FBQztRQUNoQyxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUM7UUFDaEMsSUFBSSxDQUFDLFlBQVksR0FBRyxFQUFFLENBQUM7UUFFdkIsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBRXpCLENBQUM7Ozs7O0lBR0QsYUFBYTtRQUNYLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBQzlDLENBQUM7Ozs7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPOzs7O1FBQUMsQ0FBQyxHQUFpQixFQUFFLEVBQUU7WUFDNUMsR0FBRyxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3BCLENBQUMsRUFBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPOzs7O1FBQUMsQ0FBQyxHQUFhLEVBQUUsRUFBRTtZQUN6QyxHQUFHLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDaEIsQ0FBQyxFQUFDLENBQUM7SUFDTCxDQUFDOzs7WUFqYkYsU0FBUyxTQUFDO2dCQUNULFFBQVEsRUFBRSxvQkFBb0I7Z0JBQzlCLGsrRkFBa0Q7O2FBRW5EOzs7O1lBUHdCLFlBQVk7WUFIbkIsWUFBWTtZQUl0Qix1QkFBdUI7WUFGSixlQUFlLHVCQXNEckMsTUFBTSxTQUFDLGVBQWU7Ozs7SUEzQ3pCLGdEQUFrQzs7SUFDbEMsK0NBQXFDOztJQUNyQyx5REFBcUU7O0lBR3JFLDhDQUFxQzs7SUFHckMsNkNBQW9DOztJQUdwQyxnREFBdUM7O0lBR3ZDLGdEQUE2Qjs7SUFHN0IsbURBT0U7O0lBR0YsaURBQTRDOztJQUc1QyxpREFBOEI7O0lBRzlCLHFEQUFnRDs7SUFHaEQsOENBQXdEOztJQUN4RCxnREFBMEQ7O0lBR3hELDhDQUF5RDs7Ozs7SUFDekQsMkNBQTRCOzs7OztJQUM1QixzREFBa0Q7O0lBQ2xELHlDQUFxRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Q29tcG9uZW50LCBJbmplY3QsIE9uRGVzdHJveSwgT25Jbml0fSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHtNb2RhbFJlZiwgTW9kYWxTZXJ2aWNlfSBmcm9tIFwibmctem9ycm8tYW50ZC1tb2JpbGVcIjtcclxuaW1wb3J0IHtTdWJzY3JpcHRpb259IGZyb20gXCJyeGpzXCI7XHJcbmltcG9ydCB7QmFzZVVzZXJJbnRlcmZhY2UsIENvbXBvbmVudE9wdGlvbiwgRGVwdEludGVyZmFjZX0gZnJvbSBcIi4vZGVwdC5pbnRlcmZhY2VcIjtcclxuaW1wb3J0IHtNQVRfRElBTE9HX0RBVEEsIE1hdERpYWxvZ1JlZn0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcclxuaW1wb3J0IHtZelNlbGVjdENvbnRhY3RzU2VydmljZX0gZnJvbSAnLi95ei1zZWxlY3QtY29udGFjdHMuc2VydmljZSc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ3l6LXNlbGVjdC1jb250YWN0cycsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3l6LXNlbGVjdC1jb250YWN0cy5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4veXotc2VsZWN0LWNvbnRhY3RzLmNvbXBvbmVudC5sZXNzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIFl6U2VsZWN0Q29udGFjdHNDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XHJcblxyXG4gIG1vZGFsUmVmQ3B0OiBBcnJheTxNb2RhbFJlZj4gPSBbXTtcclxuICBzdWJzY3JpYmVkOiBBcnJheTxTdWJzY3JpcHRpb24+ID0gW107XHJcbiAgZHRQdWxsVG9SZWZyZXNoU3R5bGUgPSB7aGVpZ2h0OiB3aW5kb3cuaW5uZXJIZWlnaHQgLSA0NCAtIDUxICsgJ3B4J307XHJcblxyXG4gIC8vIOaAu+mDqOmXqOaVsOaNrlxyXG4gIGRlcHROb2RlczogQXJyYXk8RGVwdEludGVyZmFjZT4gPSBbXTtcclxuXHJcbiAgLy8g6aG16Z2i5bGV56S655qE6YOo6Zeo5pWw5o2uXHJcbiAgZGVwdExpc3Q6IEFycmF5PERlcHRJbnRlcmZhY2U+ID0gW107XHJcblxyXG4gIC8vIOmdouWMheWxkVxyXG4gIGRlcHRCYXJMaXN0OiBBcnJheTxEZXB0SW50ZXJmYWNlPiA9IFtdO1xyXG5cclxuICAvLyDpobXpnaLliqDovb3kuK1cclxuICBwYWdlTG9hZGluZzogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAvLyDkurrlkZjliJfooajlj4LmlbBcclxuICBiYXNlVXNlclBhcmFtcyA9IHtcclxuICAgIHRvdGFsOiAwLFxyXG4gICAgcGFnZVNpemU6IDIwLFxyXG4gICAgcGFnZU51bTogMSxcclxuICAgIGRlcHRJZDogbnVsbCxcclxuICAgIHJlYWxOYW1lOiBudWxsLFxyXG4gICAgdXNlclR5cGVzOiBudWxsXHJcbiAgfTtcclxuXHJcbiAgLy8g5Lq65ZGY5pWw5o2uXHJcbiAgYmFzZVVzZXJMaXN0OiBBcnJheTxCYXNlVXNlckludGVyZmFjZT4gPSBbXTtcclxuXHJcbiAgLy8g5piv5ZCm5YWo6YCJ5Lq65ZGYXHJcbiAgYWxsVXNlckNoZWNrOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIC8vIOW3sumAieaLqeeahOiBlOezu+S6ulxyXG4gIHNlbGVjdGVkQ29udGFjdHM6IEFycmF5PEJhc2VVc2VySW50ZXJmYWNlPiA9IFtdO1xyXG5cclxuICAvLyDlubTnuqfmlbDmja5cclxuICBncmFkZUxpc3Q6IEFycmF5PHsgdmFsdWU6IHN0cmluZywgbGFiZWw6IHN0cmluZyB9PiA9IFtdO1xyXG4gIGdyYWRlUGFyYW1zOiBBcnJheTx7IHZhbHVlOiBzdHJpbmcsIGxhYmVsOiBzdHJpbmcgfT4gPSBbXTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwdWJsaWMgZGlhbG9nUmVmOiBNYXREaWFsb2dSZWY8WXpTZWxlY3RDb250YWN0c0NvbXBvbmVudD4sXHJcbiAgICBwcml2YXRlIF9tb2RhbDogTW9kYWxTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSB5ekNvbnRhY3RzU2VydmljZTogWXpTZWxlY3RDb250YWN0c1NlcnZpY2UsXHJcbiAgICBASW5qZWN0KE1BVF9ESUFMT0dfREFUQSkgcHVibGljIGRhdGE6IENvbXBvbmVudE9wdGlvblxyXG4gICkge31cclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICBpZiAodGhpcy5kYXRhLm9ubHlTdHVkZW50ID09PSB0cnVlKSB7XHJcbiAgICAgIHRoaXMuYmFzZVVzZXJQYXJhbXMudXNlclR5cGVzID0gJzIsMyc7XHJcbiAgICAgIHRoaXMuZHRQdWxsVG9SZWZyZXNoU3R5bGUgPSB7aGVpZ2h0OiB3aW5kb3cuaW5uZXJIZWlnaHQgLSA0NCAtIDUxIC0gNDQgKyAncHgnfTtcclxuICAgICAgdGhpcy5pbml0RGVwdE9ubHlTdHUoKTtcclxuICAgICAgdGhpcy5xdWVyeUdyYWRlKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmJhc2VVc2VyUGFyYW1zLnVzZXJUeXBlcyA9IHRoaXMuZGF0YS51c2VyVHlwZXM7XHJcbiAgICAgIHRoaXMuZHRQdWxsVG9SZWZyZXNoU3R5bGUgPSB7aGVpZ2h0OiB3aW5kb3cuaW5uZXJIZWlnaHQgLSA0NCAtIDUxICsgJ3B4J307XHJcbiAgICAgIHRoaXMuaW5pdERlcHQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIOafpeivoumDqOmXqOagkVxyXG4gIGluaXREZXB0KCkge1xyXG4gICAgdGhpcy5kZXB0TGlzdCA9IFtdO1xyXG4gICAgdGhpcy5kZXB0Tm9kZXMgPSBbXTtcclxuICAgIHRoaXMucGFnZUxvYWRpbmcgPSB0cnVlO1xyXG4gICAgY29uc3QgJHRlbXAgPSB0aGlzLnl6Q29udGFjdHNTZXJ2aWNlLmdldERlcHRUcmVlKHRoaXMuZGF0YS5pbmNsdWRlQ2xhc3MsIHRoaXMuZGF0YS5pbmNsdWRlSGlzQ2xhc3MpLnN1YnNjcmliZSgoZGVwdDogQXJyYXk8RGVwdEludGVyZmFjZT4pID0+IHtcclxuICAgICAgdGhpcy5wYWdlTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICB0aGlzLmRlcHROb2RlcyA9IGRlcHQ7XHJcbiAgICAgIHRoaXMuZGVwdExpc3QgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMuZGVwdE5vZGVzKSk7XHJcblxyXG4gICAgICB0aGlzLnF1ZXJ5RGVmYXVsdENvbnRhY3QoKTtcclxuXHJcbiAgICAgIHRoaXMuYmxEZXB0VHJlZSh0aGlzLmRlcHRMaXN0KTtcclxuICAgICAgdGhpcy5ibERlcHRUcmVlKHRoaXMuZGVwdE5vZGVzKTtcclxuICAgICAgdGhpcy5zdWJzY3JpYmVkLnB1c2goJHRlbXApO1xyXG4gICAgfSwgKCkgPT4ge1xyXG4gICAgICB0aGlzLnBhZ2VMb2FkaW5nID0gZmFsc2U7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8vIOafpeivoumDqOmXqC0+5Y+q6YCJ5a2m55SfXHJcbiAgaW5pdERlcHRPbmx5U3R1KCk6IHZvaWQge1xyXG4gICAgdGhpcy5kZXB0TGlzdCA9IFtdO1xyXG4gICAgdGhpcy5kZXB0Tm9kZXMgPSBbXTtcclxuICAgIHRoaXMucGFnZUxvYWRpbmcgPSB0cnVlO1xyXG4gICAgbGV0IGdyYWRlSWQgPSBudWxsO1xyXG4gICAgaWYgKHRoaXMuZ3JhZGVQYXJhbXMubGVuZ3RoID4gMCkge1xyXG4gICAgICBncmFkZUlkID0gdGhpcy5ncmFkZVBhcmFtc1swXS52YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCAkdGVtcCA9IHRoaXMueXpDb250YWN0c1NlcnZpY2UuZ2V0RGVwdFRyZWVPbmx5U3R1KGdyYWRlSWQsIHRoaXMuZGF0YS5pbmNsdWRlQ2xhc3MsIHRoaXMuZGF0YS5pbmNsdWRlSGlzQ2xhc3MpLnN1YnNjcmliZSgoZGVwdDogQXJyYXk8RGVwdEludGVyZmFjZT4pID0+IHtcclxuICAgICAgdGhpcy5wYWdlTG9hZGluZyA9IGZhbHNlO1xyXG5cclxuICAgICAgdGhpcy5kZXB0Tm9kZXMgPSBkZXB0O1xyXG4gICAgICB0aGlzLmRlcHRMaXN0ID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzLmRlcHROb2RlcykpO1xyXG4gICAgICB0aGlzLnF1ZXJ5RGVmYXVsdENvbnRhY3QoKTtcclxuXHJcbiAgICAgIHRoaXMuYmxEZXB0VHJlZSh0aGlzLmRlcHRMaXN0KTtcclxuICAgICAgdGhpcy5ibERlcHRUcmVlKHRoaXMuZGVwdE5vZGVzKTtcclxuXHJcbiAgICAgIHRoaXMuc3Vic2NyaWJlZC5wdXNoKCR0ZW1wKTtcclxuICAgIH0sICgpID0+IHtcclxuICAgICAgdGhpcy5wYWdlTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvLyDmn6Xor6LlubTnuqdcclxuICBxdWVyeUdyYWRlKCkge1xyXG4gICAgdGhpcy5ncmFkZUxpc3QgPSBbXTtcclxuICAgIHRoaXMucGFnZUxvYWRpbmcgPSB0cnVlO1xyXG4gICAgY29uc3QgJHRlbXAgPSB0aGlzLnl6Q29udGFjdHNTZXJ2aWNlLmdldEdyYWRlKCkuc3Vic2NyaWJlKChkYXRhOiBBcnJheTxhbnk+KSA9PiB7XHJcbiAgICAgIHRoaXMucGFnZUxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgdGhpcy5ncmFkZUxpc3QgPSBbXTtcclxuICAgICAgZGF0YS5mb3JFYWNoKChpdGVtKSA9PiB7XHJcbiAgICAgICAgaWYoaXRlbS5lbmFibGUgIT09IDAgJiYgaXRlbS5lbmFibGUgIT09IG51bGwpe1xyXG4gICAgICAgICAgdGhpcy5ncmFkZUxpc3QucHVzaCh7XHJcbiAgICAgICAgICAgIHZhbHVlOiBpdGVtLm9wZW5JZCxcclxuICAgICAgICAgICAgbGFiZWw6IGl0ZW0ubmFtZVxyXG4gICAgICAgICAgfSlcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgdGhpcy5ncmFkZUxpc3QudW5zaGlmdCh7XHJcbiAgICAgICAgdmFsdWU6IG51bGwsXHJcbiAgICAgICAgbGFiZWw6ICflhajpg6gnXHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgdGhpcy5zdWJzY3JpYmVkLnB1c2goJHRlbXApO1xyXG4gICAgfSwgKCkgPT4ge1xyXG4gICAgICB0aGlzLnBhZ2VMb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuZ3JhZGVMaXN0LnVuc2hpZnQoe1xyXG4gICAgICAgIHZhbHVlOiBudWxsLFxyXG4gICAgICAgIGxhYmVsOiAn5YWo6YOoJ1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vIOmBjeWOhumDqOmXqOagke+8jOehruWumuWPtuWtkOiKgueCuVxyXG4gIGJsRGVwdFRyZWUodHJlZSkge1xyXG4gICAgaWYgKHRyZWUgJiYgdHJlZS5sZW5ndGggJiYgdHJlZS5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHRyZWUuZm9yRWFjaCgoaXRlbSkgPT4ge1xyXG4gICAgICAgIGl0ZW0uZXhwYW5kZWQgPSB0cnVlO1xyXG4gICAgICAgIGlmIChpdGVtLmNoaWxkcmVuID09PSBudWxsIHx8IGl0ZW0uY2hpbGRyZW4ubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICBpdGVtWydpc0xlYWYnXSA9IHRydWU7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGl0ZW1bJ2lzTGVhZiddID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmJsRGVwdFRyZWUoaXRlbS5jaGlsZHJlbik7XHJcbiAgICAgIH0pXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyDmn6Xor6Lpu5jorqTlt7LooqvpgInmi6nkurrlkZjnmoTkv6Hmga9cclxuICBxdWVyeURlZmF1bHRDb250YWN0KCkge1xyXG4gICAgaWYgKHRoaXMuZGF0YS5kZWZhdWx0Q29udGFjdHMgJiYgdGhpcy5kYXRhLmRlZmF1bHRDb250YWN0cy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIGNvbnN0IHVzZXJJZHNBcnJheTogQXJyYXk8YW55PiA9IFtdO1xyXG4gICAgICB0aGlzLmRhdGEuZGVmYXVsdENvbnRhY3RzLmZvckVhY2goKGl0ZW0pID0+IHtcclxuICAgICAgICBpZiAoaXRlbS51c2VySWQpIHtcclxuICAgICAgICAgIHVzZXJJZHNBcnJheS5wdXNoKGl0ZW0udXNlcklkKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgICB0aGlzLnBhZ2VMb2FkaW5nID0gdHJ1ZTtcclxuICAgICAgY29uc3QgJHRlbXAgPSB0aGlzLnl6Q29udGFjdHNTZXJ2aWNlLmdldFVzZXJCeVVzZXJJZHModXNlcklkc0FycmF5KS5zdWJzY3JpYmUoKGRhdGE6IEFycmF5PEJhc2VVc2VySW50ZXJmYWNlPikgPT4ge1xyXG4gICAgICAgIHRoaXMucGFnZUxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkQ29udGFjdHMgPSBkYXRhO1xyXG4gICAgICAgIHRoaXMucXVlcnlCYXNlVXNlcigpO1xyXG4gICAgICAgIHRoaXMuc3Vic2NyaWJlZC5wdXNoKCR0ZW1wKTtcclxuICAgICAgfSwgKCkgPT4ge1xyXG4gICAgICAgIHRoaXMucGFnZUxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgfSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnF1ZXJ5QmFzZVVzZXIoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIOafpeivouS6uuWRmOWIl+ihqFxyXG4gIHF1ZXJ5QmFzZVVzZXIoKSB7XHJcbiAgICB0aGlzLnBhZ2VMb2FkaW5nID0gdHJ1ZTtcclxuICAgIGNvbnN0ICR0ZW1wID0gdGhpcy55ekNvbnRhY3RzU2VydmljZS5nZXRCYXNlVXNlcihcclxuICAgICAgdGhpcy5iYXNlVXNlclBhcmFtcy5wYWdlTnVtLFxyXG4gICAgICB0aGlzLmJhc2VVc2VyUGFyYW1zLnBhZ2VTaXplLFxyXG4gICAgICB0aGlzLmJhc2VVc2VyUGFyYW1zLnJlYWxOYW1lLFxyXG4gICAgICB0aGlzLmJhc2VVc2VyUGFyYW1zLmRlcHRJZCxcclxuICAgICAgdGhpcy5iYXNlVXNlclBhcmFtcy51c2VyVHlwZXNcclxuICAgICkuc3Vic2NyaWJlKChkYXRhOiBhbnkpID0+IHtcclxuICAgICAgdGhpcy5wYWdlTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICB0aGlzLmJhc2VVc2VyUGFyYW1zLnRvdGFsID0gZGF0YS50b3RhbDtcclxuICAgICAgdGhpcy5iYXNlVXNlckxpc3QucHVzaCguLi5kYXRhLmxpc3QpO1xyXG4gICAgICB0aGlzLmJhc2VVc2VyTGlzdC5mb3JFYWNoKChpdGVtKSA9PiB7XHJcbiAgICAgICAgaXRlbVsnY2hlY2tlZCddID0gZmFsc2U7XHJcbiAgICAgICAgaXRlbVsnZGlzYWJsZWQnXSA9IGZhbHNlO1xyXG4gICAgICAgIGlmICghaXRlbS5kZXB0KSB7XHJcbiAgICAgICAgICBpdGVtLmRlcHQgPSB7ZGVwdE5hbWU6ICfmmoLml6Dpg6jpl6gnfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWl0ZW0ucmVhbE5hbWUpIHtcclxuICAgICAgICAgIGl0ZW0ucmVhbE5hbWUgPSAn5pqC5peg5aeT5ZCNJztcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFpdGVtLnVzZXJDb2RlKSB7XHJcbiAgICAgICAgICBpdGVtLnJlYWxOYW1lID0gJ+aaguaXoOWtpi/lt6Xlj7cnXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghaXRlbS5yb2xlcykge1xyXG4gICAgICAgICAgaXRlbS5yb2xlcyA9IFtdO1xyXG4gICAgICAgICAgaXRlbS5yb2xlc0RhdGEgPSAn5pqC5peg6KeS6ImyJztcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgY29uc3Qgcm9sZUFycmF5ID0gW107XHJcbiAgICAgICAgICBpdGVtLnJvbGVzLmZvckVhY2goKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgICAgIHJvbGVBcnJheS5wdXNoKHZhbHVlLnJvbGVOYW1lKTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgaXRlbS5yb2xlc0RhdGEgPSByb2xlQXJyYXkudG9TdHJpbmcoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZENvbnRhY3RzLm