UNPKG

dbweb-common

Version:

用`yarn add dbweb-common`安装,不要忘记修改`angular.json`里的 `architect\build\options\assets`,加上

392 lines 38.8 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { CdkDropList, CdkDropListGroup } from '@angular/cdk/drag-drop'; import { ViewportRuler } from '@angular/cdk/overlay'; import { HttpErrorResponse } from '@angular/common/http'; import { ChangeDetectorRef, Component, HostBinding, Input, ViewChild } from '@angular/core'; import { MatDialog, MatSnackBar } from '@angular/material'; import { IsDuplicatePKError } from 'dbweb-core'; import { ConfirmDialogComponent } from '../../../components/confirm-dialog/confirm-dialog.component'; import { Category } from '../../../services/eleview/types/category'; import { EditCategoryDialogComponent } from '../edit-category-dialog/edit-category-dialog.component'; import { EditLabelComponent } from '../edit-label/edit-label.component'; import { LabelManagerService } from '../service/label-manager.service'; /** * @record */ function Item() { } if (false) { /** @type {?} */ Item.prototype.CategoryID; /** @type {?} */ Item.prototype.ID; /** @type {?} */ Item.prototype.Name; } export class CategoryComponent { /** * @param {?} svr * @param {?} dialog * @param {?} snackBar * @param {?} viewportRuler * @param {?} cd */ constructor(svr, dialog, snackBar, viewportRuler, cd) { this.svr = svr; this.dialog = dialog; this.snackBar = snackBar; this.viewportRuler = viewportRuler; this.cd = cd; this.hostClass = true; this.source = null; this.dropListEnterPredicate = (/** * @param {?} drag * @param {?} drop * @return {?} */ (drag, drop) => { if (drop === this.placeholder) { return true; } if (drop !== this.activeContainer) { return false; } /** @type {?} */ const phElement = this.placeholder.element.nativeElement; /** @type {?} */ const sourceElement = drag.dropContainer.element.nativeElement; /** @type {?} */ const dropElement = drop.element.nativeElement; /** @type {?} */ const dragIndex = this.indexOfNum(dropElement.parentElement.children, this.source ? phElement : sourceElement); /** @type {?} */ const dropIndex = this.indexOfNum(dropElement.parentElement.children, dropElement); if (!this.source) { this.sourceIndex = dragIndex; this.source = drag.dropContainer; phElement.style.width = sourceElement.clientWidth + 'px'; phElement.style.height = sourceElement.clientHeight + 'px'; sourceElement.parentElement.removeChild(sourceElement); } this.targetIndex = dropIndex; this.target = drop; phElement.style.display = ''; dropElement.parentElement.insertBefore(phElement, dropIndex > dragIndex ? dropElement.nextSibling : dropElement); this.placeholder.enter(drag, drag.element.nativeElement.offsetLeft, drag.element.nativeElement.offsetTop); return false; // tslint:disable-next-line:semicolon }); } /** * @return {?} */ ngOnInit() { } /** * @return {?} */ ngAfterViewInit() { /** @type {?} */ const phElement = this.placeholder.element.nativeElement; phElement.style.display = 'none'; phElement.parentElement.removeChild(phElement); } /** * @return {?} */ add() { this.svr.editLabel.add(this.category.ID); this.dialog.open(EditLabelComponent, { width: '800px', height: '100%', minWidth: '800px', data: this.svr, position: { top: '0px', right: '0px' } }); } /** * @return {?} */ addCategoryClick() { /** @type {?} */ const dialogRef = this.dialog.open(EditCategoryDialogComponent, { width: '360px', height: '224px', data: { name: '新的类别', title: '增加新的类别' } }); dialogRef.afterClosed().subscribe((/** * @param {?} result * @return {?} */ (result) => { if (result) { this.svr .addCategory({ name: result.name, beforeAtID: this.category.ID }) .subscribe((/** * @return {?} */ () => { }), this.errProcess()); } })); } /** * @private * @return {?} */ errProcess() { return (/** * @param {?} err * @return {?} */ err => { if (err instanceof HttpErrorResponse) { /** @type {?} */ const derr = IsDuplicatePKError(err.error); if (derr.Yes) { this.snackBar.open('名称重复', '关闭', { duration: 5000 }); } else { this.snackBar.open(err.error, '关闭', { duration: 5000 }); } } else { this.snackBar.open(err, '关闭', { duration: 5000 }); } }); } /** * @return {?} */ editCategoryClick() { /** @type {?} */ const dialogRef = this.dialog.open(EditCategoryDialogComponent, { width: '360px', height: '224px', data: { name: this.category.Name, title: '修改类别' } }); dialogRef.afterClosed().subscribe((/** * @param {?} result * @return {?} */ (result) => { if (result) { this.svr .editCategory({ name: result.name, id: this.category.ID }) .subscribe((/** * @return {?} */ () => { }), this.errProcess()); } })); } /** * @return {?} */ up() { this.svr.setCategoryPosition(this.category, this.category.Position - 1); } /** * @return {?} */ down() { this.svr.setCategoryPosition(this.category, this.category.Position + 1); } /** * @return {?} */ delete() { /** @type {?} */ const dialogRef = this.dialog.open(ConfirmDialogComponent, { width: '360px', height: '224px', data: `确定要删除类别[${this.category.Name}]及其所有的标签吗?` }); dialogRef.afterClosed().subscribe((/** * @param {?} result * @return {?} */ (result) => { if (result) { this.svr.removeCategory(this.category.ID).subscribe((/** * @return {?} */ () => { }), this.errProcess()); } })); } /** * @param {?} e * @return {?} */ dragMoved(e) { /** @type {?} */ const point = this.getPointerPositionOnPage(e.event); this.listGroup._items.forEach((/** * @param {?} dropList * @return {?} */ dropList => { if (__isInsideDropListClientRect(dropList, point.x, point.y)) { this.activeContainer = dropList; return; } })); } /** * @param {?} event * @return {?} */ dropListDropped(event) { if (!this.target) { return; } /** @type {?} */ const phElement = this.placeholder.element.nativeElement; /** @type {?} */ const parent = phElement.parentElement; phElement.style.display = 'none'; parent.removeChild(phElement); parent.appendChild(phElement); parent.insertBefore(this.source.element.nativeElement, parent.children[this.sourceIndex]); this.target = null; this.source = null; if (this.sourceIndex !== this.targetIndex && this.category.Labels) { this.cd.detach(); // moveItemInArray(this.category.Labels, this.sourceIndex, this.targetIndex); this.svr.backface .setLabelPosition({ CategoryID: this.category.ID, ID: this.category.Labels[this.sourceIndex].ID, Position: this.targetIndex }) .subscribe((/** * @param {?} v * @return {?} */ v => { this.category.setLabelsPosition(v.map((/** * @param {?} vv * @return {?} */ vv => vv.ID))); this.cd.reattach(); }), this.errProcess()); } } /** * @param {?} event * @return {?} */ getPointerPositionOnPage(event) { // `touches` will be empty for start/end events so we have to fall back to `changedTouches`. /** @type {?} */ const point = __isTouchEvent(event) ? event.touches[0] || event.changedTouches[0] : event; /** @type {?} */ const scrollPosition = this.viewportRuler.getViewportScrollPosition(); return { x: point.pageX - scrollPosition.left, y: point.pageY - scrollPosition.top }; } /** * @param {?} collection * @param {?} node * @return {?} */ indexOfNum(collection, node) { return Array.prototype.indexOf.call(collection, node); } } CategoryComponent.decorators = [ { type: Component, args: [{ selector: 'common-label-category', template: "<div class=\"title\">\r\n\t<ng-content></ng-content>\r\n\t<span>\r\n\t\t<span class=\"title-name\">{{ category?.displayLabel() }}</span></span\r\n\t>\r\n\t<span>\r\n\t\t<button mat-icon-button (click)=\"editCategoryClick()\">\r\n\t\t\t<mat-icon class=\"\u7C7B\u522B\u529F\u80FD\u56FE\u6807\" svgIcon=\"outlined:edit\"></mat-icon>\r\n\t\t</button>\r\n\t\t<button mat-icon-button (click)=\"delete()\">\r\n\t\t\t<mat-icon class=\"\u7C7B\u522B\u529F\u80FD\u56FE\u6807\" svgIcon=\"outlined:delete\"></mat-icon>\r\n\t\t</button>\r\n\t\t<div class=\"\u5206\u5272\u7EBF\"></div>\r\n\t\t<button mat-icon-button (click)=\"up()\" *ngIf=\"category.Position > 1\">\r\n\t\t\t<mat-icon class=\"\u7C7B\u522B\u529F\u80FD\u56FE\u6807 \u7C7B\u522B\u529F\u80FD\u9AD8\u4EAE\u56FE\u6807\" svgIcon=\"arrow_upward\"></mat-icon>\r\n\t\t</button>\r\n\t\t<button mat-icon-button (click)=\"down()\" *ngIf=\"svr.categorys[svr.categorys.length - 1] !== category\">\r\n\t\t\t<mat-icon class=\"\u7C7B\u522B\u529F\u80FD\u56FE\u6807 \u7C7B\u522B\u529F\u80FD\u9AD8\u4EAE\u56FE\u6807\" svgIcon=\"arrow_downward\"></mat-icon>\r\n\t\t</button>\r\n\r\n\t\t<button mat-icon-button (click)=\"addCategoryClick()\">\r\n\t\t\t<mat-icon class=\"\u7C7B\u522B\u529F\u80FD\u56FE\u6807 \u7C7B\u522B\u529F\u80FD\u9AD8\u4EAE\u56FE\u6807\" svgIcon=\"outlined:add\"></mat-icon>\r\n\t\t</button>\r\n\t</span>\r\n</div>\r\n<div class=\"example-container\" cdkDropListGroup>\r\n\t<div\r\n\t\tcdkDropList\r\n\t\t[cdkDropListEnterPredicate]=\"dropListEnterPredicate\"\r\n\t\t(cdkDropListDropped)=\"dropListDropped($event)\"\r\n\t></div>\r\n\t<div\r\n\t\tcdkDropList\r\n\t\t*ngFor=\"let label of category?.Labels\"\r\n\t\t[cdkDropListEnterPredicate]=\"dropListEnterPredicate\"\r\n\t\t(cdkDropListDropped)=\"dropListDropped($event)\"\r\n\t>\r\n\t\t<common-label-for-edit\r\n\t\t\t[label]=\"label\"\r\n\t\t\t[categoryID]=\"category?.ID\"\r\n\t\t\tcdkDrag\r\n\t\t\tclass=\"example-box \u5355\u4E2A\u6807\u7B7E\"\r\n\t\t\t(cdkDragMoved)=\"dragMoved($event)\"\r\n\t\t>\r\n\t\t\t<mat-icon cdkDragHandle class=\"\u62D6\u52A8\u56FE\u6807\" svgIcon=\"drag_indicator\"> </mat-icon>\r\n\t\t</common-label-for-edit>\r\n\t</div>\r\n\t<span class=\"\u6807\u7B7E \u6DFB\u52A0\u6807\u7B7E\" (click)=\"add()\">\r\n\t\t<mat-icon class=\"\u6DFB\u52A0\u56FE\u6807\" svgIcon=\"add\"></mat-icon>\r\n\t</span>\r\n</div>\r\n", styles: ["@charset \"UTF-8\";:host:hover .title{padding-left:32px;box-sizing:border-box}:host:hover .title .title-name{font-size:14px;font-weight:700}:host:hover .title .\u5206\u5272\u7EBF,:host:hover .title .\u7C7B\u522B\u529F\u80FD\u56FE\u6807{display:inline-block}.title{height:64px;padding:16px 0 16px 8px;box-sizing:border-box;display:flex;justify-content:space-between;align-items:center}.title .title-name{font-size:12px}.title button{width:32px;height:32px;line-height:32px}.title .\u7C7B\u522B\u529F\u80FD\u56FE\u6807{width:24px;height:24px;line-height:24px;cursor:pointer;display:none}.title .\u5206\u5272\u7EBF{width:1px;height:24px;vertical-align:middle;display:none}.\u6807\u7B7E{font-size:14px;display:inline-block;margin:0 16px 8px 0;height:34px;padding:0 24px;border-radius:4px;line-height:34px;cursor:pointer;position:relative}.\u6807\u7B7E:hover .\u67E5\u770B\u6309\u94AE{display:block}.\u5355\u4E2A\u6807\u7B7E{height:34px;border-radius:4px;line-height:34px;margin:0 16px 16px 0;cursor:pointer}.\u5355\u4E2A\u6807\u7B7E .\u62D6\u52A8\u56FE\u6807{width:16px;height:16px;line-height:16px;position:absolute;left:0;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%);display:none}.\u5355\u4E2A\u6807\u7B7E:hover .\u62D6\u52A8\u56FE\u6807{display:block}.\u6DFB\u52A0\u6807\u7B7E{width:40px;padding:0 8px;text-align:center;vertical-align:top}.\u6DFB\u52A0\u56FE\u6807{padding:5px 0;width:24px;height:24px;line-height:24px}.\u67E5\u770B\u6309\u94AE{width:16px;height:16px;line-height:16px;position:absolute;right:0;top:0;display:none}.example-container{padding-left:24px;display:flex;flex-wrap:wrap}.example-box{min-width:50px;position:relative;z-index:1;box-shadow:none}.example-box:last-child{border:0}.cdk-drop-list{display:flex}.cdk-drag-preview{box-sizing:border-box;border-radius:4px}.cdk-drag-placeholder{opacity:.3}.cdk-drag-animating{transition:transform 250ms cubic-bezier(0,0,.2,1);transition:transform 250ms cubic-bezier(0,0,.2,1),-webkit-transform 250ms cubic-bezier(0,0,.2,1)}"] }] } ]; /** @nocollapse */ CategoryComponent.ctorParameters = () => [ { type: LabelManagerService }, { type: MatDialog }, { type: MatSnackBar }, { type: ViewportRuler }, { type: ChangeDetectorRef } ]; CategoryComponent.propDecorators = { category: [{ type: Input }], hostClass: [{ type: HostBinding, args: ['class.label-category',] }], listGroup: [{ type: ViewChild, args: [CdkDropListGroup, { static: true },] }], placeholder: [{ type: ViewChild, args: [CdkDropList, { static: true },] }] }; if (false) { /** @type {?} */ CategoryComponent.prototype.category; /** @type {?} */ CategoryComponent.prototype.hostClass; /** @type {?} */ CategoryComponent.prototype.listGroup; /** @type {?} */ CategoryComponent.prototype.placeholder; /** @type {?} */ CategoryComponent.prototype.target; /** @type {?} */ CategoryComponent.prototype.targetIndex; /** @type {?} */ CategoryComponent.prototype.source; /** @type {?} */ CategoryComponent.prototype.sourceIndex; /** @type {?} */ CategoryComponent.prototype.dragIndex; /** @type {?} */ CategoryComponent.prototype.activeContainer; /** @type {?} */ CategoryComponent.prototype.dropListEnterPredicate; /** @type {?} */ CategoryComponent.prototype.svr; /** @type {?} */ CategoryComponent.prototype.dialog; /** * @type {?} * @private */ CategoryComponent.prototype.snackBar; /** * @type {?} * @private */ CategoryComponent.prototype.viewportRuler; /** * @type {?} * @private */ CategoryComponent.prototype.cd; } /** * Determines whether an event is a touch event. * @param {?} event * @return {?} */ function __isTouchEvent(event) { return event.type.startsWith('touch'); } /** * @param {?} dropList * @param {?} x * @param {?} y * @return {?} */ function __isInsideDropListClientRect(dropList, x, y) { const { top, bottom, left, right } = dropList.element.nativeElement.getBoundingClientRect(); return y >= top && y <= bottom && x >= left && x <= right; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGFiZWwtY2F0ZWdvcnkuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vZGJ3ZWItY29tbW9uLyIsInNvdXJjZXMiOlsibGliL2NvbXBvbmVudHMvbGFiZWwtbWFuYWdlci9sYWJlbC1jYXRlZ29yeS9sYWJlbC1jYXRlZ29yeS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBcUMsV0FBVyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDMUcsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3pELE9BQU8sRUFBaUIsaUJBQWlCLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQVUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ILE9BQU8sRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDM0QsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ2hELE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDZEQUE2RCxDQUFDO0FBQ3JHLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUVwRSxPQUFPLEVBQWMsMkJBQTJCLEVBQUUsTUFBTSx3REFBd0QsQ0FBQztBQUNqSCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUN4RSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQzs7OztBQUN2RSxtQkFJQzs7O0lBSEEsMEJBQW1COztJQUNuQixrQkFBVzs7SUFDWCxvQkFBYTs7QUFPZCxNQUFNLE9BQU8saUJBQWlCOzs7Ozs7OztJQVc3QixZQUNRLEdBQXdCLEVBQ3hCLE1BQWlCLEVBQ2hCLFFBQXFCLEVBQ3JCLGFBQTRCLEVBQzVCLEVBQXFCO1FBSnRCLFFB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OztJQUh4QyxxQ0FBNEI7O0lBQzVCLHNDQUFzRDs7SUFDdEQsc0NBQXdGOztJQUN4Rix3Q0FBbUU7O0lBQ25FLG1DQUEyQjs7SUFDM0Isd0NBQTJCOztJQUMzQixtQ0FBa0M7O0lBQ2xDLHdDQUEyQjs7SUFDM0Isc0NBQXlCOztJQUN6Qiw0Q0FBb0M7O0lBK0lwQyxtREFtQ0U7O0lBaExELGdDQUErQjs7SUFDL0IsbUNBQXdCOzs7OztJQUN4QixxQ0FBNkI7Ozs7O0lBQzdCLDBDQUFvQzs7Ozs7SUFDcEMsK0JBQTZCOzs7Ozs7O0FBNkwvQixTQUFTLGNBQWMsQ0FBQyxLQUE4QjtJQUNyRCxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQ3ZDLENBQUM7Ozs7Ozs7QUFFRCxTQUFTLDRCQUE0QixDQUFDLFFBQXFCLEVBQUUsQ0FBUyxFQUFFLENBQVM7VUFDMUUsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxxQkFBcUIsRUFBRTtJQUMzRixPQUFPLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLE1BQU0sSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLENBQUM7QUFDM0QsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENka0RyYWcsIENka0RyYWdEcm9wLCBDZGtEcmFnTW92ZSwgQ2RrRHJvcExpc3QsIENka0Ryb3BMaXN0R3JvdXAgfSBmcm9tICdAYW5ndWxhci9jZGsvZHJhZy1kcm9wJztcclxuaW1wb3J0IHsgVmlld3BvcnRSdWxlciB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9vdmVybGF5JztcclxuaW1wb3J0IHsgSHR0cEVycm9yUmVzcG9uc2UgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XHJcbmltcG9ydCB7IEFmdGVyVmlld0luaXQsIENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIEhvc3RCaW5kaW5nLCBJbnB1dCwgT25Jbml0LCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgTWF0RGlhbG9nLCBNYXRTbmFja0JhciB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsJztcclxuaW1wb3J0IHsgSXNEdXBsaWNhdGVQS0Vycm9yIH0gZnJvbSAnZGJ3ZWItY29yZSc7XHJcbmltcG9ydCB7IENvbmZpcm1EaWFsb2dDb21wb25lbnQgfSBmcm9tICcuLi8uLi8uLi9jb21wb25lbnRzL2NvbmZpcm0tZGlhbG9nL2NvbmZpcm0tZGlhbG9nLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IENhdGVnb3J5IH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvZWxldmlldy90eXBlcy9jYXRlZ29yeSc7XHJcbmltcG9ydCB7IExhYmVsIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvZWxldmlldy90eXBlcy9sYWJlbCc7XHJcbmltcG9ydCB7IERpYWxvZ0RhdGEsIEVkaXRDYXRlZ29yeURpYWxvZ0NvbXBvbmVudCB9IGZyb20gJy4uL2VkaXQtY2F0ZWdvcnktZGlhbG9nL2VkaXQtY2F0ZWdvcnktZGlhbG9nLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IEVkaXRMYWJlbENvbXBvbmVudCB9IGZyb20gJy4uL2VkaXQtbGFiZWwvZWRpdC1sYWJlbC5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBMYWJlbE1hbmFnZXJTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZS9sYWJlbC1tYW5hZ2VyLnNlcnZpY2UnO1xyXG5pbnRlcmZhY2UgSXRlbSB7XHJcblx0Q2F0ZWdvcnlJRDogc3RyaW5nO1xyXG5cdElEOiBzdHJpbmc7XHJcblx0TmFtZTogc3RyaW5nO1xyXG59XHJcbkBDb21wb25lbnQoe1xyXG5cdHNlbGVjdG9yOiAnY29tbW9uLWxhYmVsLWNhdGVnb3J5JyxcclxuXHR0ZW1wbGF0ZVVybDogJy4vbGFiZWwtY2F0ZWdvcnkuY29tcG9uZW50Lmh0bWwnLFxyXG5cdHN0eWxlVXJsczogWycuL2xhYmVsLWNhdGVnb3J5LmNvbXBvbmVudC5zY3NzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIENhdGVnb3J5Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0IHtcclxuXHRASW5wdXQoKSBjYXRlZ29yeTogQ2F0ZWdvcnk7XHJcblx0QEhvc3RCaW5kaW5nKCdjbGFzcy5sYWJlbC1jYXRlZ29yeScpIGhvc3RDbGFzcyA9IHRydWU7XHJcblx0QFZpZXdDaGlsZChDZGtEcm9wTGlzdEdyb3VwLCB7IHN0YXRpYzogdHJ1ZSB9KSBsaXN0R3JvdXA6IENka0Ryb3BMaXN0R3JvdXA8Q2RrRHJvcExpc3Q+O1xyXG5cdEBWaWV3Q2hpbGQoQ2RrRHJvcExpc3QsIHsgc3RhdGljOiB0cnVlIH0pIHBsYWNlaG9sZGVyOiBDZGtEcm9wTGlzdDtcclxuXHRwdWJsaWMgdGFyZ2V0OiBDZGtEcm9wTGlzdDtcclxuXHRwdWJsaWMgdGFyZ2V0SW5kZXg6IG51bWJlcjtcclxuXHRwdWJsaWMgc291cmNlOiBDZGtEcm9wTGlzdCA9IG51bGw7XHJcblx0cHVibGljIHNvdXJjZUluZGV4OiBudW1iZXI7XHJcblx0cHVibGljIGRyYWdJbmRleDogbnVtYmVyO1xyXG5cdHB1YmxpYyBhY3RpdmVDb250YWluZXI6IENka0Ryb3BMaXN0O1xyXG5cdGNvbnN0cnVjdG9yKFxyXG5cdFx0cHVibGljIHN2cjogTGFiZWxNYW5hZ2VyU2VydmljZSxcclxuXHRcdHB1YmxpYyBkaWFsb2c6IE1hdERpYWxvZyxcclxuXHRcdHByaXZhdGUgc25hY2tCYXI6IE1hdFNuYWNrQmFyLFxyXG5cdFx0cHJpdmF0ZSB2aWV3cG9ydFJ1bGVyOiBWaWV3cG9ydFJ1bGVyLFxyXG5cdFx0cHJpdmF0ZSBjZDogQ2hhbmdlRGV0ZWN0b3JSZWZcclxuXHQpIHt9XHJcblx0bmdPbkluaXQoKSB7fVxyXG5cclxuXHRuZ0FmdGVyVmlld0luaXQoKSB7XHJcblx0XHRjb25zdCBwaEVsZW1lbnQgPSB0aGlzLnBsYWNlaG9sZGVyLmVsZW1lbnQubmF0aXZlRWxlbWVudDtcclxuXHJcblx0XHRwaEVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdub25lJztcclxuXHRcdHBoRWxlbWVudC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKHBoRWxlbWVudCk7XHJcblx0fVxyXG5cdGFkZCgpOiB2b2lkIHtcclxuXHRcdHRoaXMuc3ZyLmVkaXRMYWJlbC5hZGQodGhpcy5jYXRlZ29yeS5JRCk7XHJcblx0XHR0aGlzLmRpYWxvZy5vcGVuKEVkaXRMYWJlbENvbXBvbmVudCwge1xyXG5cdFx0XHR3aWR0aDogJzgwMHB4JyxcclxuXHRcdFx0aGVpZ2h0OiAnMTAwJScsXHJcblx0XHRcdG1pbldpZHRoOiAnODAwcHgnLFxyXG5cdFx0XHRkYXRhOiB0aGlzLnN2cixcclxuXHRcdFx0cG9zaXRpb246IHtcclxuXHRcdFx0XHR0b3A6ICcwcHgnLFxyXG5cdFx0XHRcdHJpZ2h0OiAnMHB4J1xyXG5cdFx0XHR9XHJcblx0XHR9KTtcclxuXHR9XHJcblx0YWRkQ2F0ZWdvcnlDbGljaygpOiB2b2lkIHtcclxuXHRcdGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4oRWRpdENhdGVnb3J5RGlhbG9nQ29tcG9uZW50LCB7XHJcblx0XHRcdHdpZHRoOiAnMzYwcHgnLFxyXG5cdFx0XHRoZWlnaHQ6ICcyMjRweCcsXHJcblx0XHRcdGRhdGE6IHtcclxuXHRcdFx0XHRuYW1lOiAn5paw55qE57G75YirJyxcclxuXHRcdFx0XHR0aXRsZTogJ+WinuWKoOaWsOeahOexu+WIqydcclxuXHRcdFx0fVxyXG5cdFx0fSk7XHJcblxyXG5cdFx0ZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKChyZXN1bHQ6IERpYWxvZ0RhdGEpID0+IHtcclxuXHRcdFx0aWYgKHJlc3VsdCkge1xyXG5cdFx0XHRcdHRoaXMuc3ZyXHJcblx0XHRcdFx0XHQuYWRkQ2F0ZWdvcnkoeyBuYW1lOiByZXN1bHQubmFtZSwgYmVmb3JlQXRJRDogdGhpcy5jYXRlZ29yeS5JRCB9KVxyXG5cdFx0XHRcdFx0LnN1YnNjcmliZSgoKSA9PiB7fSwgdGhpcy5lcnJQcm9jZXNzKCkpO1xyXG5cdFx0XHR9XHJcblx0XHR9KTtcclxuXHR9XHJcblx0cHJpdmF0ZSBlcnJQcm9jZXNzKCk6IChlcnJvcjogYW55KSA9PiB2b2lkIHtcclxuXHRcdHJldHVybiBlcnIgPT4ge1xyXG5cdFx0XHRpZiAoZXJyIGluc3RhbmNlb2YgSHR0cEVycm9yUmVzcG9uc2UpIHtcclxuXHRcdFx0XHRjb25zdCBkZXJyID0gSXNEdXBsaWNhdGVQS0Vycm9yKGVyci5lcnJvcik7XHJcblx0XHRcdFx0aWYgKGRlcnIuWWVzKSB7XHJcblx0XHRcdFx0XHR0aGlzLnNuYWNrQmFyLm9wZW4oJ+WQjeensOmHjeWkjScsICflhbPpl60nLCB7IGR1cmF0aW9uOiA1MDAwIH0pO1xyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHR0aGlzLnNuYWNrQmFyLm9wZW4oZXJyLmVycm9yLCAn5YWz6ZetJywgeyBkdXJhdGlvbjogNTAwMCB9KTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0dGhpcy5zbmFja0Jhci5vcGVuKGVyciwgJ+WFs+mXrScsIHsgZHVyYXRpb246IDUwMDAgfSk7XHJcblx0XHRcdH1cclxuXHRcdH07XHJcblx0fVxyXG5cclxuXHRlZGl0Q2F0ZWdvcnlDbGljaygpOiB2b2lkIHtcclxuXHRcdGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4oRWRpdENhdGVnb3J5RGlhbG9nQ29tcG9uZW50LCB7XHJcblx0XHRcdHdpZHRoOiAnMzYwcHgnLFxyXG5cdFx0XHRoZWlnaHQ6ICcyMjRweCcsXHJcblx0XHRcdGRhdGE6IHtcclxuXHRcdFx0XHRuYW1lOiB0aGlzLmNhdGVnb3J5Lk5hbWUsXHJcblx0XHRcdFx0dGl0bGU6ICfkv67mlLnnsbvliKsnXHJcblx0XHRcdH1cclxuXHRcdH0pO1xyXG5cclxuXHRcdGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZSgocmVzdWx0OiBEaWFsb2dEYXRhKSA9PiB7XHJcblx0XHRcdGlmIChyZXN1bHQpIHtcclxuXHRcdFx0XHR0aGlzLnN2clxyXG5cdFx0XHRcdFx0LmVkaXRDYXRlZ29yeSh7IG5hbWU6IHJlc3VsdC5uYW1lLCBpZDogdGhpcy5jYXRlZ29yeS5JRCB9KVxyXG5cdFx0XHRcdFx0LnN1YnNjcmliZSgoKSA9PiB7fSwgdGhpcy5lcnJQcm9jZXNzKCkpO1xyXG5cdFx0XHR9XHJcblx0XHR9KTtcclxuXHR9XHJcblx0dXAoKSB7XHJcblx0XHR0aGlzLnN2ci5zZXRDYXRlZ29yeVBvc2l0aW9uKHRoaXMuY2F0ZWdvcnksIHRoaXMuY2F0ZWdvcnkuUG9zaXRpb24gLSAxKTtcclxuXHR9XHJcblx0ZG93bigpIHtcclxuXHRcdHRoaXMuc3ZyLnNldENhdGVnb3J5UG9zaXRpb24odGhpcy5jYXRlZ29yeSwgdGhpcy5jYXRlZ29yeS5Qb3NpdGlvbiArIDEpO1xyXG5cdH1cclxuXHRkZWxldGUoKSB7XHJcblx0XHRjb25zdCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKENvbmZpcm1EaWFsb2dDb21wb25lbnQsIHtcclxuXHRcdFx0d2lkdGg6ICczNjBweCcsXHJcblx0XHRcdGhlaWdodDogJzIyNHB4JyxcclxuXHRcdFx0ZGF0YTogYOehruWumuimgeWIoOmZpOexu+WIq1ske3RoaXMuY2F0ZWdvcnkuTmFtZX1d5Y+K5YW25omA5pyJ55qE5qCH562+5ZCX77yfYFxyXG5cdFx0fSk7XHJcblxyXG5cdFx0ZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKChyZXN1bHQ6IGJvb2xlYW4pID0+IHtcclxuXHRcdFx0aWYgKHJlc3VsdCkge1xyXG5cdFx0XHRcdHRoaXMuc3ZyLnJlbW92ZUNhdGVnb3J5KHRoaXMuY2F0ZWdvcnkuSUQpLnN1YnNjcmliZSgoKSA9PiB7fSwgdGhpcy5lcnJQcm9jZXNzKCkpO1xyXG5cdFx0XHR9XHJcblx0XHR9KTtcclxuXHR9XHJcblx0ZHJhZ01vdmVkKGU6IENka0RyYWdNb3ZlKSB7XHJcblx0XHRjb25zdCBwb2ludCA9IHRoaXMuZ2V0UG9pbnRlclBvc2l0aW9uT25QYWdlKGUuZXZlbnQpO1xyXG5cclxuXHRcdHRoaXMubGlzdEdyb3VwLl9pdGVtcy5mb3JFYWNoKGRyb3BMaXN0ID0+IHtcclxuXHRcdFx0aWYgKF9faXNJbnNpZGVEcm9wTGlzdENsaWVudFJlY3QoZHJvcExpc3QsIHBvaW50LngsIHBvaW50LnkpKSB7XHJcblx0XHRcdFx0dGhpcy5hY3RpdmVDb250YWluZXIgPSBkcm9wTGlzdDtcclxuXHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdH1cclxuXHRcdH0pO1xyXG5cdH1cclxuXHJcblx0ZHJvcExpc3REcm9wcGVkKGV2ZW50OiBDZGtEcmFnRHJvcDxMYWJlbFtdPikge1xyXG5cdFx0aWYgKCF0aGlzLnRhcmdldCkge1xyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgcGhFbGVtZW50ID0gdGhpcy5wbGFjZWhvbGRlci5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQ7XHJcblx0XHRjb25zdCBwYXJlbnQgPSBwaEVsZW1lbnQucGFyZW50RWxlbWVudDtcclxuXHJcblx0XHRwaEVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdub25lJztcclxuXHJcblx0XHRwYXJlbnQucmVtb3ZlQ2hpbGQocGhFbGVtZW50KTtcclxuXHRcdHBhcmVudC5hcHBlbmRDaGlsZChwaEVsZW1lbnQpO1xyXG5cdFx0cGFyZW50Lmluc2VydEJlZm9yZSh0aGlzLnNvdXJjZS5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQsIHBhcmVudC5jaGlsZHJlblt0aGlzLnNvdXJjZUluZGV4XSk7XHJcblxyXG5cdFx0dGhpcy50YXJnZXQgPSBudWxsO1xyXG5cdFx0dGhpcy5zb3VyY2UgPSBudWxsO1xyXG5cclxuXHRcdGlmICh0aGlzLnNvdXJjZUluZGV4ICE9PSB0aGlzLnRhcmdldEluZGV4ICYmIHRoaXMuY2F0ZWdvcnkuTGFiZWxzKSB7XHJcblx0XHRcdHRoaXMuY2QuZGV0YWNoKCk7XHJcblx0XHRcdC8vIG1vdmVJdGVtSW5BcnJheSh0aGlzLmNhdGVnb3J5LkxhYmVscywgdGhpcy5zb3VyY2VJbmRleCwgdGhpcy50YXJnZXRJbmRleCk7XHJcblx0XHRcdHRoaXMuc3ZyLmJhY2tmYWNlXHJcblx0XHRcdFx0LnNldExhYmVsUG9zaXRpb24oe1xyXG5cdFx0XHRcdFx0Q2F0ZWdvcnlJRDogdGhpcy5jYXRlZ29yeS5JRCxcclxuXHRcdFx0XHRcdElEOiB0aGlzLmNhdGVnb3J5LkxhYmVsc1t0aGlzLnNvdXJjZUluZGV4XS5JRCxcclxuXHRcdFx0XHRcdFBvc2l0aW9uOiB0aGlzLnRhcmdldEluZGV4XHJcblx0XHRcdFx0fSlcclxuXHRcdFx0XHQuc3Vic2NyaWJlKHYgPT4ge1xyXG5cdFx0XHRcdFx0dGhpcy5jYXRlZ29yeS5zZXRMYWJlbHNQb3NpdGlvbih2Lm1hcCh2diA9PiB2di5JRCkpO1xyXG5cdFx0XHRcdFx0dGhpcy5jZC5yZWF0dGFjaCgpO1xyXG5cdFx0XHRcdH0sIHRoaXMuZXJyUHJvY2VzcygpKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdGRyb3BMaXN0RW50ZXJQcmVkaWNhdGUgPSAoZHJhZzogQ2RrRHJhZywgZHJvcDogQ2RrRHJvcExpc3QpID0+IHtcclxuXHRcdGlmIChkcm9wID09PSB0aGlzLnBsYWNlaG9sZGVyKSB7XHJcblx0XHRcdHJldHVybiB0cnVlO1xyXG5cdFx0fVxyXG5cdFx0aWYgKGRyb3AgIT09IHRoaXMuYWN0aXZlQ29udGFpbmVyKSB7XHJcblx0XHRcdHJldHVybiBmYWxzZTtcclxuXHRcdH1cclxuXHRcdGNvbnN0IHBoRWxlbWVudCA9IHRoaXMucGxhY2Vob2xkZXIuZWxlbWVudC5uYXRpdmVFbGVtZW50O1xyXG5cdFx0Y29uc3Qgc291cmNlRWxlbWVudCA9IGRyYWcuZHJvcENvbnRhaW5lci5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQ7XHJcblx0XHRjb25zdCBkcm9wRWxlbWVudCA9IGRyb3AuZWxlbWVudC5uYXRpdmVFbGVtZW50O1xyXG5cdFx0Y29uc3QgZHJhZ0luZGV4ID0gdGhpcy5pbmRleE9mTnVtKGRyb3BFbGVtZW50LnBhcmVudEVsZW1lbnQuY2hpbGRyZW4sIHRoaXMuc291cmNlID8gcGhFbGVtZW50IDogc291cmNlRWxlbWVudCk7XHJcblx0XHRjb25zdCBkcm9wSW5kZXggPSB0aGlzLmluZGV4T2ZOdW0oZHJvcEVsZW1lbnQucGFyZW50RWxlbWVudC5jaGlsZHJlbiwgZHJvcEVsZW1lbnQpO1xyXG5cclxuXHRcdGlmICghdGhpcy5zb3VyY2UpIHtcclxuXHRcdFx0dGhpcy5zb3VyY2VJbmRleCA9IGRyYWdJbmRleDtcclxuXHRcdFx0dGhpcy5zb3VyY2UgPSBkcmFnLmRyb3BDb250YWluZXI7XHJcblxyXG5cdFx0XHRwaEVsZW1lbnQuc3R5bGUud2lkdGggPSBzb3VyY2VFbGVtZW50LmNsaWVudFdpZHRoICsgJ3B4JztcclxuXHRcdFx0cGhFbGVtZW50LnN0eWxlLmhlaWdodCA9IHNvdXJjZUVsZW1lbnQuY2xpZW50SGVpZ2h0ICsgJ3B4JztcclxuXHJcblx0XHRcdHNvdXJjZUVsZW1lbnQucGFyZW50RWxlbWVudC5yZW1vdmVDaGlsZChzb3VyY2VFbGVtZW50KTtcclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLnRhcmdldEluZGV4ID0gZHJvcEluZGV4O1xyXG5cdFx0dGhpcy50YXJnZXQgPSBkcm9wO1xyXG5cclxuXHRcdHBoRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJyc7XHJcblx0XHRkcm9wRWxlbWVudC5wYXJlbnRFbGVtZW50Lmluc2VydEJlZm9yZShcclxuXHRcdFx0cGhFbGVtZW50LFxyXG5cdFx0XHRkcm9wSW5kZXggPiBkcmFnSW5kZXggPyBkcm9wRWxlbWVudC5uZXh0U2libGluZyA6IGRyb3BFbGVtZW50XHJcblx0XHQpO1xyXG5cclxuXHRcdHRoaXMucGxhY2Vob2xkZXIuZW50ZXIoZHJhZywgZHJhZy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQub2Zmc2V0TGVmdCwgZHJhZy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQub2Zmc2V0VG9wKTtcclxuXHRcdHJldHVybiBmYWxzZTtcclxuXHRcdC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpzZW1pY29sb25cclxuXHR9O1xyXG5cclxuXHRnZXRQb2ludGVyUG9zaXRpb25PblBhZ2UoZXZlbnQ6IE1vdXNlRXZlbnQgfCBUb3VjaEV2ZW50KSB7XHJcblx0XHQvLyBgdG91Y2hlc2Agd2lsbCBiZSBlbXB0eSBmb3Igc3RhcnQvZW5kIGV2ZW50cyBzbyB3ZSBoYXZlIHRvIGZhbGwgYmFjayB0byBgY2hhbmdlZFRvdWNoZXNgLlxyXG5cdFx0Y29uc3QgcG9pbnQgPSBfX2lzVG91Y2hFdmVudChldmVudCkgPyBldmVudC50b3VjaGVzWzBdIHx8IGV2ZW50LmNoYW5nZWRUb3VjaGVzWzBdIDogZXZlbnQ7XHJcblx0XHRjb25zdCBzY3JvbGxQb3NpdGlvbiA9IHRoaXMudmlld3BvcnRSdWxlci5nZXRWaWV3cG9ydFNjcm9sbFBvc2l0aW9uKCk7XHJcblxyXG5cdFx0cmV0dXJuIHtcclxuXHRcdFx0eDogcG9pbnQucGFnZVggLSBzY3JvbGxQb3NpdGlvbi5sZWZ0LFxyXG5cdFx0XHR5OiBwb2ludC5wYWdlWSAtIHNjcm9sbFBvc2l0aW9uLnRvcFxyXG5cdFx0fTtcclxuXHR9XHJcblx0aW5kZXhPZk51bShjb2xsZWN0aW9uLCBub2RlKSB7XHJcblx0XHRyZXR1cm4gQXJyYXkucHJvdG90eXBlLmluZGV4T2YuY2FsbChjb2xsZWN0aW9uLCBub2RlKTtcclxuXHR9XHJcbn1cclxuLyoqIERldGVybWluZXMgd2hldGhlciBhbiBldmVudCBpcyBhIHRvdWNoIGV2ZW50LiAqL1xyXG5mdW5jdGlvbiBfX2lzVG91Y2hFdmVudChldmVudDogTW91c2VFdmVudCB8IFRvdWNoRXZlbnQpOiBldmVudCBpcyBUb3VjaEV2ZW50IHtcclxuXHRyZXR1cm4gZXZlbnQudHlwZS5zdGFydHNXaXRoKCd0b3VjaCcpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBfX2lzSW5zaWRlRHJvcExpc3RDbGllbnRSZWN0KGRyb3BMaXN0OiBDZGtEcm9wTGlzdCwgeDogbnVtYmVyLCB5OiBudW1iZXIpIHtcclxuXHRjb25zdCB7IHRvcCwgYm90dG9tLCBsZWZ0LCByaWdodCB9ID0gZHJvcExpc3QuZWxlbWVudC5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG5cdHJldHVybiB5ID49IHRvcCAmJiB5IDw9IGJvdHRvbSAmJiB4ID49IGxlZnQgJiYgeCA8PSByaWdodDtcclxufVxyXG4iXX0=