ng-devui
Version:
DevUI components based on Angular
187 lines • 32.3 kB
JavaScript
import { ChangeDetectorRef, Component, forwardRef, Input, TemplateRef } from '@angular/core';
import { NG_VALUE_ACCESSOR } from '@angular/forms';
import * as i0 from "@angular/core";
import * as i1 from "@angular/common";
export class RateComponent {
/**
* @deprecated
* 用readonly替代
*/
set read(value) {
this.readonly = value;
}
/**
* @deprecated
* 用color替代
*/
set type(value) {
this.color = `var(--devui-${value})`;
}
constructor(cdr) {
this.cdr = cdr;
this.readonly = false;
this.count = 5;
this.color = '';
/**
* @deprecated
* 用character替代
*/
this.icon = '';
this.character = '';
this.allowHalf = false;
this.allowClear = false;
this.totalLevel_array = [];
this.width = '';
}
ngOnInit() {
for (let i = 0; i < this.count; i++) {
this.totalLevel_array.push({ width: '0' });
}
}
get isCharacterTemplate() {
return this.character instanceof TemplateRef;
}
get characterTemplate() {
return this.character;
}
// 只读模式配置
setStaticRating() {
const half_star = this.chooseValue < 0 ? this.chooseValue + 1 : this.chooseValue % 1;
const int_current_level = Math.floor(this.chooseValue);
this.setChange(0, int_current_level + 1, '100%');
if (half_star > 0) {
this.totalLevel_array[int_current_level + 1].width = `${half_star * 100}%`;
this.setChange(int_current_level + 2, this.count, '0');
}
else {
this.setChange(int_current_level + 1, this.count, '0');
}
}
// 动态模式配置
setDynamicRating() {
const halfStar = this.chooseValue % 1;
const wholeStar = Math.floor(this.chooseValue);
this.setChange(0, wholeStar + 1, '100%');
if (this.allowHalf && halfStar) {
this.setChange(wholeStar + 1, wholeStar + 2, '50%');
this.setChange(wholeStar + 2, this.count, '0');
}
else if (this.allowClear && this.chooseValue === -1) {
this.setChange(0, this.count, '0');
}
else {
this.setChange(wholeStar + 1, this.count, '0');
}
}
hoverToggle(event, index, reset = false) {
if (this.readonly) {
return;
}
if (reset) {
// chooseValue从index取值故比真实值小1
if (this.chooseValue >= -0.5) {
this.setDynamicRating();
}
else {
this.setChange(0, this.count, '0');
}
}
else {
this.setChange(0, index, '100%');
if (this.allowHalf && event.offsetX * 2 <= event.target.clientWidth) {
this.setChange(index, index + 1, '50%');
}
else {
this.setChange(index, index + 1, '100%');
}
this.setChange(index + 1, this.count, '0');
}
}
// 根据mouseMove,mouseLeave,select等操作,改变颜色与是否选中
setChange(start, end, width) {
for (let i = start; i < end; i++) {
this.totalLevel_array[i].width = width;
}
}
selectValue(event, index) {
if (this.readonly) {
return;
}
this.setChange(0, index, '100%');
const prevValue = this.chooseValue;
if (this.allowHalf && event.offsetX * 2 <= event.target.clientWidth) {
this.chooseValue = index - 0.5;
}
else {
this.chooseValue = index;
}
if (this.allowClear && this.chooseValue === prevValue) {
this.chooseValue = -1;
this.setChange(0, this.count, '0');
this.onChange(0);
}
else {
if (this.allowHalf && event.offsetX * 2 <= event.target.clientWidth) {
this.setChange(index, index + 1, '50%');
}
else {
this.setChange(index, index + 1, '100%');
}
this.setChange(index + 1, this.count, '0');
this.onChange(this.chooseValue + 1);
}
this.onTouched();
}
registerOnChange(fn) {
this.onChange = fn;
}
registerOnTouched(fn) {
this.onTouched = fn;
}
writeValue(value) {
this.chooseValue = value - 1;
if (this.readonly) {
this.setStaticRating();
}
else {
this.setDynamicRating();
}
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: RateComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: RateComponent, selector: "d-rate", inputs: { read: "read", readonly: "readonly", count: "count", color: "color", icon: "icon", character: "character", type: "type", allowHalf: "allowHalf", allowClear: "allowClear" }, providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => RateComponent),
multi: true,
},
], ngImport: i0, template: "<div class=\"devui-star-container\" (mouseleave)=\"hoverToggle($event, chooseValue, true)\">\n <div\n *ngFor=\"let item of totalLevel_array; let i = index\"\n class=\"devui-star-align devui-pointer\"\n [ngClass]=\"{ 'devui-only-read': readonly }\"\n (mouseover)=\"hoverToggle($event, i)\"\n (click)=\"selectValue($event, i)\"\n >\n <span class=\"devui-star-color {{ icon }}\">\n <ng-container *ngIf=\"!isCharacterTemplate\">{{ character }}</ng-container>\n <ng-container *ngIf=\"isCharacterTemplate\">\n <ng-container *ngTemplateOutlet=\"characterTemplate\"></ng-container>\n </ng-container>\n <svg\n *ngIf=\"!icon && !character\"\n width=\"16px\"\n height=\"16px\"\n viewBox=\"0 0 16 16\"\n version=\"1.1\"\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n >\n <g stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\">\n <g fill=\"#E3E5E9\" id=\"Mask\">\n <polygon\n points=\"8 12.7603585 3.67376208 14.3147912 3.81523437 9.71994835 1 6.0857977 5.41367261 4.80046131 8 1 10.5863274 4.80046131 15 6.0857977 12.1847656 9.71994835 12.3262379 14.3147912\"\n ></polygon>\n </g>\n </g>\n </svg>\n </span>\n <span class=\"devui-star-color-active devui-active-star {{ icon }}\" [style.color]=\"color\" [style.width]=\"item.width\">\n <ng-container *ngIf=\"!isCharacterTemplate\">{{ character }}</ng-container>\n <ng-container *ngIf=\"isCharacterTemplate\">\n <ng-container *ngTemplateOutlet=\"characterTemplate\"></ng-container>\n </ng-container>\n <svg\n *ngIf=\"!icon && !character\"\n width=\"16px\"\n height=\"16px\"\n viewBox=\"0 0 16 16\"\n version=\"1.1\"\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n >\n <g stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\">\n <g [style.fill]=\"color\" id=\"Mask\">\n <polygon\n points=\"8 12.7603585 3.67376208 14.3147912 3.81523437 9.71994835 1 6.0857977 5.41367261 4.80046131 8 1 10.5863274 4.80046131 15 6.0857977 12.1847656 9.71994835 12.3262379 14.3147912\"\n ></polygon>\n </g>\n </g>\n </svg>\n </span>\n </div>\n <div style=\"clear: both\"></div>\n</div>\n", styles: [".devui-font-size-base{font-size:var(--devui-font-size, 12px)}.devui-font-base{font-size:var(--devui-font-size, 12px);font-weight:var(--devui-font-content-weight, normal);line-height:var(--devui-line-height-base, 1.5)}.devui-font-size-modal-title{font-size:var(--devui-font-size-modal-title, 18px)}.devui-font-modal-title{font-size:var(--devui-font-size-modal-title, 18px);font-weight:var(--devui-font-title-weight, bold);line-height:var(--devui-line-height-base, 1.5)}.devui-font-size-page-title{font-size:var(--devui-font-size-page-title, 16px)}.devui-font-page-title{font-size:var(--devui-font-size-page-title, 16px);font-weight:var(--devui-font-title-weight, bold);line-height:var(--devui-line-height-base, 1.5)}.devui-font-size-secondary-title{font-size:var(--devui-font-size-card-title, 14px)}.devui-font-secondary-title{font-size:var(--devui-font-size-card-title, 14px);font-weight:var(--devui-font-title-weight, bold);line-height:var(--devui-line-height-base, 1.5)}.devui-star-align{float:left;font-size:var(--devui-font-size-icon, 16px);margin-right:5px;position:relative;line-height:1}.devui-pointer{cursor:pointer}.devui-star-container{display:inline-block}.devui-star-color-active{color:var(--devui-brand, #0a59f7);line-height:1.5}.devui-star-color-active svg g{fill:var(--devui-brand, #0a59f7)}.devui-active-star{position:absolute;top:0;left:0;overflow:hidden}.devui-star-color{color:var(--devui-shape-icon-fill, #c2c2c2);line-height:1.5}.devui-star-color svg g{fill:var(--devui-shape-icon-fill, #c2c2c2)}.devui-only-read{cursor:not-allowed}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }] }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: RateComponent, decorators: [{
type: Component,
args: [{ selector: 'd-rate', providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => RateComponent),
multi: true,
},
], preserveWhitespaces: false, template: "<div class=\"devui-star-container\" (mouseleave)=\"hoverToggle($event, chooseValue, true)\">\n <div\n *ngFor=\"let item of totalLevel_array; let i = index\"\n class=\"devui-star-align devui-pointer\"\n [ngClass]=\"{ 'devui-only-read': readonly }\"\n (mouseover)=\"hoverToggle($event, i)\"\n (click)=\"selectValue($event, i)\"\n >\n <span class=\"devui-star-color {{ icon }}\">\n <ng-container *ngIf=\"!isCharacterTemplate\">{{ character }}</ng-container>\n <ng-container *ngIf=\"isCharacterTemplate\">\n <ng-container *ngTemplateOutlet=\"characterTemplate\"></ng-container>\n </ng-container>\n <svg\n *ngIf=\"!icon && !character\"\n width=\"16px\"\n height=\"16px\"\n viewBox=\"0 0 16 16\"\n version=\"1.1\"\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n >\n <g stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\">\n <g fill=\"#E3E5E9\" id=\"Mask\">\n <polygon\n points=\"8 12.7603585 3.67376208 14.3147912 3.81523437 9.71994835 1 6.0857977 5.41367261 4.80046131 8 1 10.5863274 4.80046131 15 6.0857977 12.1847656 9.71994835 12.3262379 14.3147912\"\n ></polygon>\n </g>\n </g>\n </svg>\n </span>\n <span class=\"devui-star-color-active devui-active-star {{ icon }}\" [style.color]=\"color\" [style.width]=\"item.width\">\n <ng-container *ngIf=\"!isCharacterTemplate\">{{ character }}</ng-container>\n <ng-container *ngIf=\"isCharacterTemplate\">\n <ng-container *ngTemplateOutlet=\"characterTemplate\"></ng-container>\n </ng-container>\n <svg\n *ngIf=\"!icon && !character\"\n width=\"16px\"\n height=\"16px\"\n viewBox=\"0 0 16 16\"\n version=\"1.1\"\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n >\n <g stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\">\n <g [style.fill]=\"color\" id=\"Mask\">\n <polygon\n points=\"8 12.7603585 3.67376208 14.3147912 3.81523437 9.71994835 1 6.0857977 5.41367261 4.80046131 8 1 10.5863274 4.80046131 15 6.0857977 12.1847656 9.71994835 12.3262379 14.3147912\"\n ></polygon>\n </g>\n </g>\n </svg>\n </span>\n </div>\n <div style=\"clear: both\"></div>\n</div>\n", styles: [".devui-font-size-base{font-size:var(--devui-font-size, 12px)}.devui-font-base{font-size:var(--devui-font-size, 12px);font-weight:var(--devui-font-content-weight, normal);line-height:var(--devui-line-height-base, 1.5)}.devui-font-size-modal-title{font-size:var(--devui-font-size-modal-title, 18px)}.devui-font-modal-title{font-size:var(--devui-font-size-modal-title, 18px);font-weight:var(--devui-font-title-weight, bold);line-height:var(--devui-line-height-base, 1.5)}.devui-font-size-page-title{font-size:var(--devui-font-size-page-title, 16px)}.devui-font-page-title{font-size:var(--devui-font-size-page-title, 16px);font-weight:var(--devui-font-title-weight, bold);line-height:var(--devui-line-height-base, 1.5)}.devui-font-size-secondary-title{font-size:var(--devui-font-size-card-title, 14px)}.devui-font-secondary-title{font-size:var(--devui-font-size-card-title, 14px);font-weight:var(--devui-font-title-weight, bold);line-height:var(--devui-line-height-base, 1.5)}.devui-star-align{float:left;font-size:var(--devui-font-size-icon, 16px);margin-right:5px;position:relative;line-height:1}.devui-pointer{cursor:pointer}.devui-star-container{display:inline-block}.devui-star-color-active{color:var(--devui-brand, #0a59f7);line-height:1.5}.devui-star-color-active svg g{fill:var(--devui-brand, #0a59f7)}.devui-active-star{position:absolute;top:0;left:0;overflow:hidden}.devui-star-color{color:var(--devui-shape-icon-fill, #c2c2c2);line-height:1.5}.devui-star-color svg g{fill:var(--devui-shape-icon-fill, #c2c2c2)}.devui-only-read{cursor:not-allowed}\n"] }]
}], ctorParameters: () => [{ type: i0.ChangeDetectorRef }], propDecorators: { read: [{
type: Input
}], readonly: [{
type: Input
}], count: [{
type: Input
}], color: [{
type: Input
}], icon: [{
type: Input
}], character: [{
type: Input
}], type: [{
type: Input
}], allowHalf: [{
type: Input
}], allowClear: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmF0ZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9kZXZ1aS9yYXRlL3JhdGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vZGV2dWkvcmF0ZS9yYXRlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBVSxXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDckcsT0FBTyxFQUF3QixpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7QUFlekUsTUFBTSxPQUFPLGFBQWE7SUFDeEI7OztPQUdHO0lBQ0gsSUFBYSxJQUFJLENBQUMsS0FBSztRQUNyQixJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQztJQUN4QixDQUFDO0lBV0Q7OztPQUdHO0lBQ0gsSUFBYSxJQUFJLENBQUMsS0FBSztRQUNyQixJQUFJLENBQUMsS0FBSyxHQUFHLGVBQWUsS0FBSyxHQUFHLENBQUM7SUFDdkMsQ0FBQztJQVNELFlBQW9CLEdBQXNCO1FBQXRCLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBekJqQyxhQUFRLEdBQUcsS0FBSyxDQUFDO1FBRWpCLFVBQUssR0FBRyxDQUFDLENBQUM7UUFDVixVQUFLLEdBQUcsRUFBRSxDQUFDO1FBQ3BCOzs7V0FHRztRQUNNLFNBQUksR0FBRyxFQUFFLENBQUM7UUFDVixjQUFTLEdBQThCLEVBQUUsQ0FBQztRQVExQyxjQUFTLEdBQUcsS0FBSyxDQUFDO1FBQ2xCLGVBQVUsR0FBRyxLQUFLLENBQUM7UUFDNUIscUJBQWdCLEdBQUcsRUFBRSxDQUFDO1FBRXRCLFVBQUssR0FBRyxFQUFFLENBQUM7SUFJa0MsQ0FBQztJQUU5QyxRQUFRO1FBQ04sS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FB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O3NCQUFsQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgZm9yd2FyZFJlZiwgSW5wdXQsIE9uSW5pdCwgVGVtcGxhdGVSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdkLXJhdGUnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9yYXRlLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9yYXRlLmNvbXBvbmVudC5zY3NzJ10sXHJcbiAgcHJvdmlkZXJzOiBbXHJcbiAgICB7XHJcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxyXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBSYXRlQ29tcG9uZW50KSxcclxuICAgICAgbXVsdGk6IHRydWUsXHJcbiAgICB9LFxyXG4gIF0sXHJcbiAgcHJlc2VydmVXaGl0ZXNwYWNlczogZmFsc2UsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBSYXRlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBDb250cm9sVmFsdWVBY2Nlc3NvciB7XHJcbiAgLyoqXHJcbiAgICogQGRlcHJlY2F0ZWRcclxuICAgKiDnlKhyZWFkb25seeabv+S7o1xyXG4gICAqL1xyXG4gIEBJbnB1dCgpIHNldCByZWFkKHZhbHVlKSB7XHJcbiAgICB0aGlzLnJlYWRvbmx5ID0gdmFsdWU7XHJcbiAgfVxyXG4gIEBJbnB1dCgpIHJlYWRvbmx5ID0gZmFsc2U7XHJcblxyXG4gIEBJbnB1dCgpIGNvdW50ID0gNTtcclxuICBASW5wdXQoKSBjb2xvciA9ICcnO1xyXG4gIC8qKlxyXG4gICAqIEBkZXByZWNhdGVkXHJcbiAgICog55SoY2hhcmFjdGVy5pu/5LujXHJcbiAgICovXHJcbiAgQElucHV0KCkgaWNvbiA9ICcnO1xyXG4gIEBJbnB1dCgpIGNoYXJhY3Rlcjogc3RyaW5nIHwgVGVtcGxhdGVSZWY8YW55PiA9ICcnO1xyXG4gIC8qKlxyXG4gICAqIEBkZXByZWNhdGVkXHJcbiAgICog55SoY29sb3Lmm7/ku6NcclxuICAgKi9cclxuICBASW5wdXQoKSBzZXQgdHlwZSh2YWx1ZSkge1xyXG4gICAgdGhpcy5jb2xvciA9IGB2YXIoLS1kZXZ1aS0ke3ZhbHVlfSlgO1xyXG4gIH1cclxuICBASW5wdXQoKSBhbGxvd0hhbGYgPSBmYWxzZTtcclxuICBASW5wdXQoKSBhbGxvd0NsZWFyID0gZmFsc2U7XHJcbiAgdG90YWxMZXZlbF9hcnJheSA9IFtdO1xyXG4gIGNob29zZVZhbHVlOiBudW1iZXI7XHJcbiAgd2lkdGggPSAnJztcclxuICBvbkNoYW5nZTogKHZhbHVlOiBudW1iZXIpID0+IHZvaWQ7XHJcbiAgb25Ub3VjaGVkOiAoKSA9PiB2b2lkO1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYpIHt9XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmNvdW50OyBpKyspIHtcclxuICAgICAgdGhpcy50b3RhbExldmVsX2FycmF5LnB1c2goeyB3aWR0aDogJzAnIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0IGlzQ2hhcmFjdGVyVGVtcGxhdGUoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5jaGFyYWN0ZXIgaW5zdGFuY2VvZiBUZW1wbGF0ZVJlZjtcclxuICB9XHJcblxyXG4gIGdldCBjaGFyYWN0ZXJUZW1wbGF0ZSgpOiBUZW1wbGF0ZVJlZjxhbnk+IHtcclxuICAgIHJldHVybiB0aGlzLmNoYXJhY3RlciBhcyBUZW1wbGF0ZVJlZjxhbnk+O1xyXG4gIH1cclxuXHJcbiAgLy8g5Y+q6K+75qih5byP6YWN572uXHJcbiAgc2V0U3RhdGljUmF0aW5nKCkge1xyXG4gICAgY29uc3QgaGFsZl9zdGFyID0gdGhpcy5jaG9vc2VWYWx1ZSA8IDAgPyB0aGlzLmNob29zZVZhbHVlICsgMSA6IHRoaXMuY2hvb3NlVmFsdWUgJSAxO1xyXG4gICAgY29uc3QgaW50X2N1cnJlbnRfbGV2ZWwgPSBNYXRoLmZsb29yKHRoaXMuY2hvb3NlVmFsdWUpO1xyXG4gICAgdGhpcy5zZXRDaGFuZ2UoMCwgaW50X2N1cnJlbnRfbGV2ZWwgKyAxLCAnMTAwJScpO1xyXG4gICAgaWYgKGhhbGZfc3RhciA+IDApIHtcclxuICAgICAgdGhpcy50b3RhbExldmVsX2FycmF5W2ludF9jdXJyZW50X2xldmVsICsgMV0ud2lkdGggPSBgJHtoYWxmX3N0YXIgKiAxMDB9JWA7XHJcbiAgICAgIHRoaXMuc2V0Q2hhbmdlKGludF9jdXJyZW50X2xldmVsICsgMiwgdGhpcy5jb3VudCwgJzAnKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuc2V0Q2hhbmdlKGludF9jdXJyZW50X2xldmVsICsgMSwgdGhpcy5jb3VudCwgJzAnKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIOWKqOaAgeaooeW8j+mFjee9rlxyXG4gIHNldER5bmFtaWNSYXRpbmcoKSB7XHJcbiAgICBjb25zdCBoYWxmU3RhciA9IHRoaXMuY2hvb3NlVmFsdWUgJSAxO1xyXG4gICAgY29uc3Qgd2hvbGVTdGFyID0gTWF0aC5mbG9vcih0aGlzLmNob29zZVZhbHVlKTtcclxuICAgIHRoaXMuc2V0Q2hhbmdlKDAsIHdob2xlU3RhciArIDEsICcxMDAlJyk7XHJcbiAgICBpZiAodGhpcy5hbGxvd0hhbGYgJiYgaGFsZlN0YXIpIHtcclxuICAgICAgdGhpcy5zZXRDaGFuZ2Uod2hvbGVTdGFyICsgMSwgd2hvbGVTdGFyICsgMiwgJzUwJScpO1xyXG4gICAgICB0aGlzLnNldENoYW5nZSh3aG9sZVN0YXIgKyAyLCB0aGlzLmNvdW50LCAnMCcpO1xyXG4gICAgfSBlbHNlIGlmICh0aGlzLmFsbG93Q2xlYXIgJiYgdGhpcy5jaG9vc2VWYWx1ZSA9PT0gLTEpIHtcclxuICAgICAgdGhpcy5zZXRDaGFuZ2UoMCwgdGhpcy5jb3VudCwgJzAnKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuc2V0Q2hhbmdlKHdob2xlU3RhciArIDEsIHRoaXMuY291bnQsICcwJyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBob3ZlclRvZ2dsZShldmVudCwgaW5kZXg/OiBudW1iZXIsIHJlc2V0ID0gZmFsc2UpIHtcclxuICAgIGlmICh0aGlzLnJlYWRvbmx5KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGlmIChyZXNldCkge1xyXG4gICAgICAvLyBjaG9vc2VWYWx1ZeS7jmluZGV45Y+W5YC85pWF5q+U55yf5a6e5YC85bCPMVxyXG4gICAgICBpZiAodGhpcy5jaG9vc2VWYWx1ZSA+PSAtMC41KSB7XHJcbiAgICAgICAgdGhpcy5zZXREeW5hbWljUmF0aW5nKCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5zZXRDaGFuZ2UoMCwgdGhpcy5jb3VudCwgJzAnKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5zZXRDaGFuZ2UoMCwgaW5kZXgsICcxMDAlJyk7XHJcbiAgICAgIGlmICh0aGlzLmFsbG93SGFsZiAmJiBldmVudC5vZmZzZXRYICogMiA8PSBldmVudC50YXJnZXQuY2xpZW50V2lkdGgpIHtcclxuICAgICAgICB0aGlzLnNldENoYW5nZShpbmRleCwgaW5kZXggKyAxLCAnNTAlJyk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5zZXRDaGFuZ2UoaW5kZXgsIGluZGV4ICsgMSwgJzEwMCUnKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLnNldENoYW5nZShpbmRleCArIDEsIHRoaXMuY291bnQsICcwJyk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIC8vIOagueaNrm1vdXNlTW92Ze+8jG1vdXNlTGVhdmUsc2VsZWN0562J5pON5L2c77yM5pS55Y+Y6aKc6Imy5LiO5piv5ZCm6YCJ5LitXHJcbiAgc2V0Q2hhbmdlKHN0YXJ0LCBlbmQsIHdpZHRoKSB7XHJcbiAgICBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKykge1xyXG4gICAgICB0aGlzLnRvdGFsTGV2ZWxfYXJyYXlbaV0ud2lkdGggPSB3aWR0aDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHNlbGVjdFZhbHVlKGV2ZW50LCBpbmRleCkge1xyXG4gICAgaWYgKHRoaXMucmVhZG9ubHkpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5zZXRDaGFuZ2UoMCwgaW5kZXgsICcxMDAlJyk7XHJcbiAgICBjb25zdCBwcmV2VmFsdWUgPSB0aGlzLmNob29zZVZhbHVlO1xyXG5cclxuICAgIGlmICh0aGlzLmFsbG93SGFsZiAmJiBldmVudC5vZmZzZXRYICogMiA8PSBldmVudC50YXJnZXQuY2xpZW50V2lkdGgpIHtcclxuICAgICAgdGhpcy5jaG9vc2VWYWx1ZSA9IGluZGV4IC0gMC41O1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5jaG9vc2VWYWx1ZSA9IGluZGV4O1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmFsbG93Q2xlYXIgJiYgdGhpcy5jaG9vc2VWYWx1ZSA9PT0gcHJldlZhbHVlKSB7XHJcbiAgICAgIHRoaXMuY2hvb3NlVmFsdWUgPSAtMTtcclxuICAgICAgdGhpcy5zZXRDaGFuZ2UoMCwgdGhpcy5jb3VudCwgJzAnKTtcclxuICAgICAgdGhpcy5vbkNoYW5nZSgwKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGlmICh0aGlzLmFsbG93SGFsZiAmJiBldmVudC5vZmZzZXRYICogMiA8PSBldmVudC50YXJnZXQuY2xpZW50V2lkdGgpIHtcclxuICAgICAgICB0aGlzLnNldENoYW5nZShpbmRleCwgaW5kZXggKyAxLCAnNTAlJyk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5zZXRDaGFuZ2UoaW5kZXgsIGluZGV4ICsgMSwgJzEwMCUnKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLnNldENoYW5nZShpbmRleCArIDEsIHRoaXMuY291bnQsICcwJyk7XHJcbiAgICAgIHRoaXMub25DaGFuZ2UodGhpcy5jaG9vc2VWYWx1ZSArIDEpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMub25Ub3VjaGVkKCk7XHJcbiAgfVxyXG5cclxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiAoXzogbnVtYmVyKSA9PiB2b2lkKTogdm9pZCB7XHJcbiAgICB0aGlzLm9uQ2hhbmdlID0gZm47XHJcbiAgfVxyXG5cclxuICByZWdpc3Rlck9uVG91Y2hlZChmbjogKCkgPT4gdm9pZCk6IHZvaWQge1xyXG4gICAgdGhpcy5vblRvdWNoZWQgPSBmbjtcclxuICB9XHJcblxyXG4gIHdyaXRlVmFsdWUodmFsdWU6IG51bWJlciB8IG51bGwpOiB2b2lkIHtcclxuICAgIHRoaXMuY2hvb3NlVmFsdWUgPSB2YWx1ZSAtIDE7XHJcbiAgICBpZiAodGhpcy5yZWFkb25seSkge1xyXG4gICAgICB0aGlzLnNldFN0YXRpY1JhdGluZygpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5zZXREeW5hbWljUmF0aW5nKCk7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiIsIjxkaXYgY2xhc3M9XCJkZXZ1aS1zdGFyLWNvbnRhaW5lclwiIChtb3VzZWxlYXZlKT1cImhvdmVyVG9nZ2xlKCRldmVudCwgY2hvb3NlVmFsdWUsIHRydWUpXCI+XG4gIDxkaXZcbiAgICAqbmdGb3I9XCJsZXQgaXRlbSBvZiB0b3RhbExldmVsX2FycmF5OyBsZXQgaSA9IGluZGV4XCJcbiAgICBjbGFzcz1cImRldnVpLXN0YXItYWxpZ24gZGV2dWktcG9pbnRlclwiXG4gICAgW25nQ2xhc3NdPVwieyAnZGV2dWktb25seS1yZWFkJzogcmVhZG9ubHkgfVwiXG4gICAgKG1vdXNlb3Zlcik9XCJob3ZlclRvZ2dsZSgkZXZlbnQsIGkpXCJcbiAgICAoY2xpY2spPVwic2VsZWN0VmFsdWUoJGV2ZW50LCBpKVwiXG4gID5cbiAgICA8c3BhbiBjbGFzcz1cImRldnVpLXN0YXItY29sb3Ige3sgaWNvbiB9fVwiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFpc0NoYXJhY3RlclRlbXBsYXRlXCI+e3sgY2hhcmFjdGVyIH19PC9uZy1jb250YWluZXI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNDaGFyYWN0ZXJUZW1wbGF0ZVwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY2hhcmFjdGVyVGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPHN2Z1xuICAgICAgICAqbmdJZj1cIiFpY29uICYmICFjaGFyYWN0ZXJcIlxuICAgICAgICB3aWR0aD1cIjE2cHhcIlxuICAgICAgICBoZWlnaHQ9XCIxNnB4XCJcbiAgICAgICAgdmlld0JveD1cIjAgMCAxNiAxNlwiXG4gICAgICAgIHZlcnNpb249XCIxLjFcIlxuICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcbiAgICAgICAgeG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCJcbiAgICAgID5cbiAgICAgICAgPGcgc3Ryb2tlPVwibm9uZVwiIHN0cm9rZS13aWR0aD1cIjFcIiBmaWxsPVwibm9uZVwiIGZpbGwtcnVsZT1cImV2ZW5vZGRcIj5cbiAgICAgICAgICA8ZyBmaWxsPVwiI0UzRTVFOVwiIGlkPVwiTWFza1wiPlxuICAgICAgICAgICAgPHBvbHlnb25cbiAgICAgICAgICAgICAgcG9pbnRzPVwiOCAxMi43NjAzNTg1IDMuNjczNzYyMDggMTQuMzE0NzkxMiAzLjgxNTIzNDM3IDkuNzE5OTQ4MzUgMSA2LjA4NTc5NzcgNS40MTM2NzI2MSA0LjgwMDQ2MTMxIDggMSAxMC41ODYzMjc0IDQuODAwNDYxMzEgMTUgNi4wODU3OTc3IDEyLjE4NDc2NTYgOS43MTk5NDgzNSAxMi4zMjYyMzc5IDE0LjMxNDc5MTJcIlxuICAgICAgICAgICAgPjwvcG9seWdvbj5cbiAgICAgICAgICA8L2c+XG4gICAgICAgIDwvZz5cbiAgICAgIDwvc3ZnPlxuICAgIDwvc3Bhbj5cbiAgICA8c3BhbiBjbGFzcz1cImRldnVpLXN0YXItY29sb3ItYWN0aXZlIGRldnVpLWFjdGl2ZS1zdGFyIHt7IGljb24gfX1cIiBbc3R5bGUuY29sb3JdPVwiY29sb3JcIiBbc3R5bGUud2lkdGhdPVwiaXRlbS53aWR0aFwiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFpc0NoYXJhY3RlclRlbXBsYXRlXCI+e3sgY2hhcmFjdGVyIH19PC9uZy1jb250YWluZXI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNDaGFyYWN0ZXJUZW1wbGF0ZVwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY2hhcmFjdGVyVGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPHN2Z1xuICAgICAgICAqbmdJZj1cIiFpY29uICYmICFjaGFyYWN0ZXJcIlxuICAgICAgICB3aWR0aD1cIjE2cHhcIlxuICAgICAgICBoZWlnaHQ9XCIxNnB4XCJcbiAgICAgICAgdmlld0JveD1cIjAgMCAxNiAxNlwiXG4gICAgICAgIHZlcnNpb249XCIxLjFcIlxuICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcbiAgICAgICAgeG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCJcbiAgICAgID5cbiAgICAgICAgPGcgc3Ryb2tlPVwibm9uZVwiIHN0cm9rZS13aWR0aD1cIjFcIiBmaWxsPVwibm9uZVwiIGZpbGwtcnVsZT1cImV2ZW5vZGRcIj5cbiAgICAgICAgICA8ZyBbc3R5bGUuZmlsbF09XCJjb2xvclwiIGlkPVwiTWFza1wiPlxuICAgICAgICAgICAgPHBvbHlnb25cbiAgICAgICAgICAgICAgcG9pbnRzPVwiOCAxMi43NjAzNTg1IDMuNjczNzYyMDggMTQuMzE0NzkxMiAzLjgxNTIzNDM3IDkuNzE5OTQ4MzUgMSA2LjA4NTc5NzcgNS40MTM2NzI2MSA0LjgwMDQ2MTMxIDggMSAxMC41ODYzMjc0IDQuODAwNDYxMzEgMTUgNi4wODU3OTc3IDEyLjE4NDc2NTYgOS43MTk5NDgzNSAxMi4zMjYyMzc5IDE0LjMxNDc5MTJcIlxuICAgICAgICAgICAgPjwvcG9seWdvbj5cbiAgICAgICAgICA8L2c+XG4gICAgICAgIDwvZz5cbiAgICAgIDwvc3ZnPlxuICAgIDwvc3Bhbj5cbiAgPC9kaXY+XG4gIDxkaXYgc3R5bGU9XCJjbGVhcjogYm90aFwiPjwvZGl2PlxuPC9kaXY+XG4iXX0=