ng-zorro-antd-mobile
Version:
An enterprise-class mobile UI components based on Ant Design and Angular
288 lines • 42 kB
JavaScript
import { Component, ViewEncapsulation, Input, Output, forwardRef, ElementRef, EventEmitter, ViewChild } from '@angular/core';
import { trigger, state, animate, transition, style } from '@angular/animations';
import { LocaleProviderService } from 'ng-zorro-antd-mobile/locale-provider';
import { Subject } from 'rxjs';
import { takeUntil } from 'rxjs/operators';
import { NG_VALUE_ACCESSOR } from '@angular/forms';
import * as i0 from "@angular/core";
import * as i1 from "ng-zorro-antd-mobile/locale-provider";
import * as i2 from "@angular/common";
import * as i3 from "@angular/forms";
export class SearchBarComponent {
set defaultValue(value) {
this._defaultValue = value;
this._value = value;
this.inputElementRef.nativeElement.value = this._value;
}
get value() {
return this._value;
}
set value(v) {
this._value = v || '';
this.inputElementRef.nativeElement.value = this._value;
this.setClass();
}
get placeholder() {
return this._placeholder;
}
set placeholder(value) {
this._placeholder = value;
}
get showCancelButton() {
return this._showCancelButton;
}
set showCancelButton(value) {
this._showCancelButton = value;
this.setClass();
}
get cancelText() {
return this._cancelText;
}
set cancelText(value) {
if (value !== undefined) {
this._cancelText = value;
this._isCustomText = true;
}
}
get disabled() {
return this._disabled;
}
set disabled(value) {
this._disabled = value;
}
get maxLength() {
return this._maxLength;
}
set maxLength(value) {
this._maxLength = value;
}
set setFocus(value) {
if (value) {
if (value.focusValue) {
this._focus = true;
this.inputElementRef.nativeElement.focus();
this._blurFromOnClear = true;
this.onSearchbarFocus();
}
else {
this._blurFromOnClear = false;
this.onSearchbarBlur();
}
}
}
constructor(_elementRef, _localeProvider) {
this._elementRef = _elementRef;
this._localeProvider = _localeProvider;
this.prefixCls = 'am-search';
this.cancelCls = {
[`${this.prefixCls}-cancel`]: true
};
this.isComposing = false;
this._defaultValue = '';
this._value = '';
this._placeholder = '';
this._showCancelButton = false;
this._disabled = false;
this._focus = false;
this._isSubmit = false;
this._isCustomText = false;
this._isClearClicking = false;
this._blurFromOnClear = false;
this.locale = {};
this._unsubscribe$ = new Subject();
this.onSubmit = new EventEmitter();
this.onChange = new EventEmitter();
this.onFocus = new EventEmitter();
this.onBlur = new EventEmitter();
this.onCancel = new EventEmitter();
this.onClear = new EventEmitter();
this.onChangeFn = () => { };
this.onTouchFn = () => { };
}
setClass() {
this.wrapCls = {
[`${this.prefixCls}`]: true,
[`${this.prefixCls}-start`]: !!(this._focus || (this._value && this._value.length > 0)) && !this._disabled
};
this.cancelCls = {
[`${this.prefixCls}-cancel`]: true,
[`${this.prefixCls}-cancel-show`]: this._showCancelButton || this._focus || (this._value && this._value.length > 0),
[`${this.prefixCls}-cancel-anim`]: this._focus
};
this.clearCls = {
[`${this.prefixCls}-clear`]: this._value && this._value.length > 0,
[`${this.prefixCls}-clear-show`]: this._value && this._value.length > 0 && !this._isSubmit,
[`${this.prefixCls}-clear-active`]: this._isClearClicking
};
}
setStyle() {
if (this._inputContainerRef.className.indexOf(`${this.prefixCls}-start`) > -1) {
const realWidth = this._syntheticPhContainerRef.getBoundingClientRect().width;
this._syntheticPhRef.style.width = Math.ceil(realWidth) + 'px';
if (!this._showCancelButton) {
this._rightBtnRef.style.marginRight = '0';
}
}
else {
this._syntheticPhRef.style.width = '100%';
if (!this._showCancelButton) {
this._rightBtnInitMarginLeft = window.getComputedStyle(this._rightBtnRef)['margin-left'];
const btnMarginRight = this._rightBtnRef.offsetWidth + parseInt(this._rightBtnInitMarginLeft, 10);
this._rightBtnRef.style.marginRight = '-' + btnMarginRight + 'px';
}
}
}
onSearchbarBlur() {
const self = this;
setTimeout(() => {
if (!self._blurFromOnClear && self._value === '' && self._focus) {
self._focus = false;
self._value = '';
self.onBlur.emit();
self.setClass();
}
self._blurFromOnClear = false;
}, 50);
}
onSearchbarFocus() {
this._focus = true;
this._isSubmit = false;
this.onFocus.emit();
this.setClass();
}
onSearchbarChange(e) {
this._focus = true;
this._value = e;
this.onChange.emit(e);
this.onChangeFn(e);
this.setClass();
}
onSearchSubmit(e) {
e.preventDefault();
this._value = e.target[0].value;
this._isSubmit = true;
this.onSubmit.emit(this._value);
this.setClass();
this._blurFromOnClear = true;
this.inputElementRef.nativeElement.blur();
}
onSearchbarCancel() {
this._focus = false;
this._value = '';
this.onCancel.emit();
this.setClass();
}
onSearchbarClear() {
this._blurFromOnClear = true;
this._isClearClicking = true;
this.onSearchbarChange('');
this.inputElementRef.nativeElement.focus();
this.onClear.emit(this._value);
this.setClass();
setTimeout(() => {
this._value = '';
this._isClearClicking = false;
this._blurFromOnClear = false;
this.setClass();
}, 100);
this.onSearchbarFocus();
}
onSetCompositionState(isComposing) {
this.isComposing = isComposing;
}
writeValue(value) {
this._value = value || '';
this.inputElementRef.nativeElement.value = this._value;
this.setClass();
}
registerOnChange(fn) {
this.onChangeFn = fn;
}
registerOnTouched(fn) {
this.onTouchFn = fn;
}
ngOnInit() {
this.setClass();
this._localeProvider.localeChange.pipe(takeUntil(this._unsubscribe$)).subscribe(_ => {
this.locale = this._localeProvider.getLocaleSubObj('SearchBar');
this._cancelText = this._isCustomText ? this._cancelText : this.locale.cancelText;
});
}
ngAfterViewInit() {
this._syntheticPhContainerRef = this._elementRef.nativeElement.getElementsByClassName(`${this.prefixCls}-synthetic-ph-container`)[0];
this._syntheticPhRef = this._elementRef.nativeElement.getElementsByClassName(`${this.prefixCls}-synthetic-ph`)[0];
this._rightBtnRef = this._elementRef.nativeElement.getElementsByClassName('cancel')[0];
this._inputContainerRef = this._elementRef.nativeElement.getElementsByClassName(`${this.prefixCls}`)[0];
}
ngAfterViewChecked() {
this.setStyle();
}
ngOnDestroy() {
this._unsubscribe$.next();
this._unsubscribe$.complete();
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.8", ngImport: i0, type: SearchBarComponent, deps: [{ token: i0.ElementRef }, { token: i1.LocaleProviderService }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.0.8", type: SearchBarComponent, selector: "SearchBar, nzm-search-bar", inputs: { defaultValue: "defaultValue", value: "value", placeholder: "placeholder", showCancelButton: "showCancelButton", cancelText: "cancelText", disabled: "disabled", maxLength: "maxLength", setFocus: "setFocus" }, outputs: { onSubmit: "onSubmit", onChange: "onChange", onFocus: "onFocus", onBlur: "onBlur", onCancel: "onCancel", onClear: "onClear" }, providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => SearchBarComponent),
multi: true
}
], viewQueries: [{ propertyName: "inputElementRef", first: true, predicate: ["search"], descendants: true, static: true }], ngImport: i0, template: "<form name=\"myForm\" class=\"{{ prefixCls }}\" [ngClass]=\"wrapCls\" action=\"#\" (submit)=\"onSearchSubmit($event)\">\n <div class=\"{{ prefixCls }}-input\">\n <div\n class=\"{{ prefixCls }}-synthetic-ph\"\n style=\"box-sizing:unset\"\n [@cancelButtonState]=\"showCancelButton ? 'visible' : 'hidden'\"\n >\n <span class=\"{{ prefixCls }}-synthetic-ph-container\">\n <i class=\"{{ prefixCls }}-synthetic-ph-icon\"></i>\n <span\n class=\"{{ prefixCls }}-synthetic-ph-placeholder\"\n [ngStyle]=\"{ visibility: placeholder && !isComposing && !value ? 'visible' : 'hidden' }\"\n >\n {{ placeholder }}\n </span>\n </span>\n </div>\n <input\n #search\n class=\"{{ prefixCls }}-value\"\n style=\"outline:none;\"\n [name]=\"'search'\"\n [type]=\"'search'\"\n [disabled]=\"disabled\"\n [maxlength]=\"maxLength\"\n [placeholder]=\"placeholder\"\n [ngModel]=\"value\"\n (blur)=\"onSearchbarBlur()\"\n (focus)=\"onSearchbarFocus()\"\n (ngModelChange)=\"onSearchbarChange($event)\"\n (compositionstart)=\"onSetCompositionState(true)\"\n (compositionend)=\"onSetCompositionState(false)\"\n />\n <a [ngClass]=\"clearCls\" style=\"box-sizing: content-box;transition: 0s\" (click)=\"onSearchbarClear()\"></a>\n </div>\n <div class=\"cancel\" [ngClass]=\"cancelCls\" (click)=\"onSearchbarCancel()\">\n {{ cancelText }}\n </div>\n</form>\n", dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i3.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i3.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }], animations: [
trigger('cancelButtonState', [
state('visible', style({ width: '*' })),
state('hidden', style({ width: '100%' })),
transition('visible =>hidden', [animate(300, style({ width: '100%' }))]),
transition('hidden => visible', [animate(300, style({ width: '*' }))])
])
], encapsulation: i0.ViewEncapsulation.None }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.8", ngImport: i0, type: SearchBarComponent, decorators: [{
type: Component,
args: [{ selector: 'SearchBar, nzm-search-bar', encapsulation: ViewEncapsulation.None, providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => SearchBarComponent),
multi: true
}
], animations: [
trigger('cancelButtonState', [
state('visible', style({ width: '*' })),
state('hidden', style({ width: '100%' })),
transition('visible =>hidden', [animate(300, style({ width: '100%' }))]),
transition('hidden => visible', [animate(300, style({ width: '*' }))])
])
], template: "<form name=\"myForm\" class=\"{{ prefixCls }}\" [ngClass]=\"wrapCls\" action=\"#\" (submit)=\"onSearchSubmit($event)\">\n <div class=\"{{ prefixCls }}-input\">\n <div\n class=\"{{ prefixCls }}-synthetic-ph\"\n style=\"box-sizing:unset\"\n [@cancelButtonState]=\"showCancelButton ? 'visible' : 'hidden'\"\n >\n <span class=\"{{ prefixCls }}-synthetic-ph-container\">\n <i class=\"{{ prefixCls }}-synthetic-ph-icon\"></i>\n <span\n class=\"{{ prefixCls }}-synthetic-ph-placeholder\"\n [ngStyle]=\"{ visibility: placeholder && !isComposing && !value ? 'visible' : 'hidden' }\"\n >\n {{ placeholder }}\n </span>\n </span>\n </div>\n <input\n #search\n class=\"{{ prefixCls }}-value\"\n style=\"outline:none;\"\n [name]=\"'search'\"\n [type]=\"'search'\"\n [disabled]=\"disabled\"\n [maxlength]=\"maxLength\"\n [placeholder]=\"placeholder\"\n [ngModel]=\"value\"\n (blur)=\"onSearchbarBlur()\"\n (focus)=\"onSearchbarFocus()\"\n (ngModelChange)=\"onSearchbarChange($event)\"\n (compositionstart)=\"onSetCompositionState(true)\"\n (compositionend)=\"onSetCompositionState(false)\"\n />\n <a [ngClass]=\"clearCls\" style=\"box-sizing: content-box;transition: 0s\" (click)=\"onSearchbarClear()\"></a>\n </div>\n <div class=\"cancel\" [ngClass]=\"cancelCls\" (click)=\"onSearchbarCancel()\">\n {{ cancelText }}\n </div>\n</form>\n" }]
}], ctorParameters: () => [{ type: i0.ElementRef }, { type: i1.LocaleProviderService }], propDecorators: { inputElementRef: [{
type: ViewChild,
args: ['search', { static: true }]
}], defaultValue: [{
type: Input
}], value: [{
type: Input
}], placeholder: [{
type: Input
}], showCancelButton: [{
type: Input
}], cancelText: [{
type: Input
}], disabled: [{
type: Input
}], maxLength: [{
type: Input
}], setFocus: [{
type: Input
}], onSubmit: [{
type: Output
}], onChange: [{
type: Output
}], onFocus: [{
type: Output
}], onBlur: [{
type: Output
}], onCancel: [{
type: Output
}], onClear: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VhcmNoLWJhci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9jb21wb25lbnRzL3NlYXJjaC1iYXIvc2VhcmNoLWJhci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi9jb21wb25lbnRzL3NlYXJjaC1iYXIvc2VhcmNoLWJhci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUlULGlCQUFpQixFQUNqQixLQUFLLEVBQ0wsTUFBTSxFQUNOLFVBQVUsRUFDVixVQUFVLEVBQ1YsWUFBWSxFQUVaLFNBQVMsRUFDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ2pGLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQzdFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxpQkFBaUIsRUFBd0IsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7QUFzQnpFLE1BQU0sT0FBTyxrQkFBa0I7SUFnQzdCLElBQ0ksWUFBWSxDQUFDLEtBQWE7UUFDNUIsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUM7UUFDM0IsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7UUFDcEIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxhQUFhLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7SUFDekQsQ0FBQztJQUNELElBQ0ksS0FBSztRQUNQLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUNyQixDQUFDO0lBQ0QsSUFBSSxLQUFLLENBQUMsQ0FBUztRQUNqQixJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMs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QUN2RSxDQUFDO3FCQUNIO21IQWdDRCxlQUFlO3NCQURkLFNBQVM7dUJBQUMsUUFBUSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFJakMsWUFBWTtzQkFEZixLQUFLO2dCQU9GLEtBQUs7c0JBRFIsS0FBSztnQkFVRixXQUFXO3NCQURkLEtBQUs7Z0JBUUYsZ0JBQWdCO3NCQURuQixLQUFLO2dCQVNGLFVBQVU7c0JBRGIsS0FBSztnQkFXRixRQUFRO3NCQURYLEtBQUs7Z0JBUUYsU0FBUztzQkFEWixLQUFLO2dCQVFGLFFBQVE7c0JBRFgsS0FBSztnQkFlTixRQUFRO3NCQURQLE1BQU07Z0JBR1AsUUFBUTtzQkFEUCxNQUFNO2dCQUdQLE9BQU87c0JBRE4sTUFBTTtnQkFHUCxNQUFNO3NCQURMLE1BQU07Z0JBR1AsUUFBUTtzQkFEUCxNQUFNO2dCQUdQLE9BQU87c0JBRE4sTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgT25Jbml0LFxuICBBZnRlclZpZXdJbml0LFxuICBBZnRlclZpZXdDaGVja2VkLFxuICBWaWV3RW5jYXBzdWxhdGlvbixcbiAgSW5wdXQsXG4gIE91dHB1dCxcbiAgZm9yd2FyZFJlZixcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBPbkRlc3Ryb3ksXG4gIFZpZXdDaGlsZFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHRyaWdnZXIsIHN0YXRlLCBhbmltYXRlLCB0cmFuc2l0aW9uLCBzdHlsZSB9IGZyb20gJ0Bhbmd1bGFyL2FuaW1hdGlvbnMnO1xuaW1wb3J0IHsgTG9jYWxlUHJvdmlkZXJTZXJ2aWNlIH0gZnJvbSAnbmctem9ycm8tYW50ZC1tb2JpbGUvbG9jYWxlLXByb3ZpZGVyJztcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IE5HX1ZBTFVFX0FDQ0VTU09SLCBDb250cm9sVmFsdWVBY2Nlc3NvciB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnU2VhcmNoQmFyLCBuem0tc2VhcmNoLWJhcicsXG4gIHRlbXBsYXRlVXJsOiAnLi9zZWFyY2gtYmFyLmNvbXBvbmVudC5odG1sJyxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgcHJvdmlkZXJzOiBbXG4gICAge1xuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBTZWFyY2hCYXJDb21wb25lbnQpLFxuICAgICAgbXVsdGk6IHRydWVcbiAgICB9XG4gIF0sXG4gIGFuaW1hdGlvbnM6IFtcbiAgICB0cmlnZ2VyKCdjYW5jZWxCdXR0b25TdGF0ZScsIFtcbiAgICAgIHN0YXRlKCd2aXNpYmxlJywgc3R5bGUoeyB3aWR0aDogJyonIH0pKSxcbiAgICAgIHN0YXRlKCdoaWRkZW4nLCBzdHlsZSh7IHdpZHRoOiAnMTAwJScgfSkpLFxuICAgICAgdHJhbnNpdGlvbigndmlzaWJsZSA9PmhpZGRlbicsIFthbmltYXRlKDMwMCwgc3R5bGUoeyB3aWR0aDogJzEwMCUnIH0pKV0pLFxuICAgICAgdHJhbnNpdGlvbignaGlkZGVuID0+IHZpc2libGUnLCBbYW5pbWF0ZSgzMDAsIHN0eWxlKHsgd2lkdGg6ICcqJyB9KSldKVxuICAgIF0pXG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgU2VhcmNoQmFyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0LCBBZnRlclZpZXdDaGVja2VkLCBPbkRlc3Ryb3ksIENvbnRyb2xWYWx1ZUFjY2Vzc29yIHtcbiAgcHJlZml4Q2xzOiBzdHJpbmcgPSAnYW0tc2VhcmNoJztcbiAgY2xlYXJDbHM6IG9iamVjdDtcbiAgd3JhcENsczogb2JqZWN0O1xuICBjYW5jZWxDbHM6IG9iamVjdCA9IHtcbiAgICBbYCR7dGhpcy5wcmVmaXhDbHN9LWNhbmNlbGBdOiB0cnVlXG4gIH07XG4gIGlzQ29tcG9zaW5nID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSBfZGVmYXVsdFZhbHVlOiBzdHJpbmcgPSAnJztcbiAgcHJpdmF0ZSBfdmFsdWU6IHN0cmluZyA9ICcnO1xuICBwcml2YXRlIF9wbGFjZWhvbGRlcjogc3RyaW5nID0gJyc7XG4gIHByaXZhdGUgX3Nob3dDYW5jZWxCdXR0b246IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBfY2FuY2VsVGV4dDogc3RyaW5nO1xuICBwcml2YXRlIF9kaXNhYmxlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIF9tYXhMZW5ndGg6IG51bWJlcjtcbiAgcHJpdmF0ZSBfZm9jdXM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBfaXNTdWJtaXQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBfaXNDdXN0b21UZXh0OiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgX2lzQ2xlYXJDbGlja2luZzogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIF9zeW50aGV0aWNQaENvbnRhaW5lclJlZjogSFRNTEVsZW1lbnQ7XG4gIHByaXZhdGUgX3N5bnRoZXRpY1BoUmVmOiBIVE1MRWxlbWVudDtcbiAgcHJpdmF0ZSBfcmlnaHRCdG5SZWY6IEhUTUxFbGVtZW50O1xuICBwcml2YXRlIF9pbnB1dENvbnRhaW5lclJlZjogSFRNTEVsZW1lbnQ7XG4gIHByaXZhdGUgX3JpZ2h0QnRuSW5pdE1hcmdpbkxlZnQ6IHN0cmluZztcbiAgcHJpdmF0ZSBfYmx1ckZyb21PbkNsZWFyOiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgbG9jYWxlOiBhbnkgPSB7fTtcbiAgcHJpdmF0ZSBfdW5zdWJzY3JpYmUkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICBAVmlld0NoaWxkKCdzZWFyY2gnLCB7IHN0YXRpYzogdHJ1ZSB9KVxuICBpbnB1dEVsZW1lbnRSZWY7XG5cbiAgQElucHV0KClcbiAgc2V0IGRlZmF1bHRWYWx1ZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fZGVmYXVsdFZhbHVlID0gdmFsdWU7XG4gICAgdGhpcy5fdmFsdWUgPSB2YWx1ZTtcbiAgICB0aGlzLmlucHV0RWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnZhbHVlID0gdGhpcy5fdmFsdWU7XG4gIH1cbiAgQElucHV0KClcbiAgZ2V0IHZhbHVlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3ZhbHVlO1xuICB9XG4gIHNldCB2YWx1ZSh2OiBzdHJpbmcpIHtcbiAgICB0aGlzLl92YWx1ZSA9IHYgfHwgJyc7XG4gICAgdGhpcy5pbnB1dEVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC52YWx1ZSA9IHRoaXMuX3ZhbHVlO1xuICAgIHRoaXMuc2V0Q2xhc3MoKTtcbiAgfVxuICBASW5wdXQoKVxuICBnZXQgcGxhY2Vob2xkZXIoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fcGxhY2Vob2xkZXI7XG4gIH1cbiAgc2V0IHBsYWNlaG9sZGVyKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9wbGFjZWhvbGRlciA9IHZhbHVlO1xuICB9XG4gIEBJbnB1dCgpXG4gIGdldCBzaG93Q2FuY2VsQnV0dG9uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9zaG93Q2FuY2VsQnV0dG9uO1xuICB9XG4gIHNldCBzaG93Q2FuY2VsQnV0dG9uKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5fc2hvd0NhbmNlbEJ1dHRvbiA9IHZhbHVlO1xuICAgIHRoaXMuc2V0Q2xhc3MoKTtcbiAgfVxuICBASW5wdXQoKVxuICBnZXQgY2FuY2VsVGV4dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9jYW5jZWxUZXh0O1xuICB9XG4gIHNldCBjYW5jZWxUZXh0KHZhbHVlOiBzdHJpbmcpIHtcbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5fY2FuY2VsVGV4dCA9IHZhbHVlO1xuICAgICAgdGhpcy5faXNDdXN0b21UZXh0ID0gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgQElucHV0KClcbiAgZ2V0IGRpc2FibGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9kaXNhYmxlZDtcbiAgfVxuICBzZXQgZGlzYWJsZWQodmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9kaXNhYmxlZCA9IHZhbHVlO1xuICB9XG4gIEBJbnB1dCgpXG4gIGdldCBtYXhMZW5ndGgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fbWF4TGVuZ3RoO1xuICB9XG4gIHNldCBtYXhMZW5ndGgodmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX21heExlbmd0aCA9IHZhbHVlO1xuICB9XG4gIEBJbnB1dCgpXG4gIHNldCBzZXRGb2N1cyh2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSkge1xuICAgICAgaWYgKHZhbHVlLmZvY3VzVmFsdWUpIHtcbiAgICAgICAgdGhpcy5fZm9jdXMgPSB0cnVlO1xuICAgICAgICB0aGlzLmlucHV0RWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgIHRoaXMuX2JsdXJGcm9tT25DbGVhciA9IHRydWU7XG4gICAgICAgIHRoaXMub25TZWFyY2hiYXJGb2N1cygpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fYmx1ckZyb21PbkNsZWFyID0gZmFsc2U7XG4gICAgICAgIHRoaXMub25TZWFyY2hiYXJCbHVyKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIEBPdXRwdXQoKVxuICBvblN1Ym1pdCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBAT3V0cHV0KClcbiAgb25DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQE91dHB1dCgpXG4gIG9uRm9jdXMgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQE91dHB1dCgpXG4gIG9uQmx1ciA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBAT3V0cHV0KClcbiAgb25DYW5jZWwgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQE91dHB1dCgpXG4gIG9uQ2xlYXIgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgcHJpdmF0ZSBvbkNoYW5nZUZuOiAodmFsdWU6IHN0cmluZykgPT4gdm9pZCA9ICgpID0+IHt9O1xuICBwcml2YXRlIG9uVG91Y2hGbjogKHZhbHVlOiBzdHJpbmcpID0+IHZvaWQgPSAoKSA9PiB7fTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9lbGVtZW50UmVmOiBFbGVtZW50UmVmLCBwcml2YXRlIF9sb2NhbGVQcm92aWRlcjogTG9jYWxlUHJvdmlkZXJTZXJ2aWNlKSB7fVxuXG4gIHNldENsYXNzKCkge1xuICAgIHRoaXMud3JhcENscyA9IHtcbiAgICAgIFtgJHt0aGlzLnByZWZpeENsc31gXTogdHJ1ZSxcbiAgICAgIFtgJHt0aGlzLnByZWZpeENsc30tc3RhcnRgXTogISEodGhpcy5fZm9jdXMgfHwgKHRoaXMuX3ZhbHVlICYmIHRoaXMuX3ZhbHVlLmxlbmd0aCA+IDApKSAmJiAhdGhpcy5fZGlzYWJsZWRcbiAgICB9O1xuICAgIHRoaXMuY2FuY2VsQ2xzID0ge1xuICAgICAgW2Ake3RoaXMucHJlZml4Q2xzfS1jYW5jZWxgXTogdHJ1ZSxcbiAgICAgIFtgJHt0aGlzLnByZWZpeENsc30tY2FuY2VsLXNob3dgXTpcbiAgICAgICAgdGhpcy5fc2hvd0NhbmNlbEJ1dHRvbiB8fCB0aGlzLl9mb2N1cyB8fCAodGhpcy5fdmFsdWUgJiYgdGhpcy5fdmFsdWUubGVuZ3RoID4gMCksXG4gICAgICBbYCR7dGhpcy5wcmVmaXhDbHN9LWNhbmNlbC1hbmltYF06IHRoaXMuX2ZvY3VzXG4gICAgfTtcbiAgICB0aGlzLmNsZWFyQ2xzID0ge1xuICAgICAgW2Ake3RoaXMucHJlZml4Q2xzfS1jbGVhcmBdOiB0aGlzLl92YWx1ZSAmJiB0aGlzLl92YWx1ZS5sZW5ndGggPiAwLFxuICAgICAgW2Ake3RoaXMucHJlZml4Q2xzfS1jbGVhci1zaG93YF06IHRoaXMuX3ZhbHVlICYmIHRoaXMuX3ZhbHVlLmxlbmd0aCA+IDAgJiYgIXRoaXMuX2lzU3VibWl0LFxuICAgICAgW2Ake3RoaXMucHJlZml4Q2xzfS1jbGVhci1hY3RpdmVgXTogdGhpcy5faXNDbGVhckNsaWNraW5nXG4gICAgfTtcbiAgfVxuXG4gIHNldFN0eWxlKCkge1xuICAgIGlmICh0aGlzLl9pbnB1dENvbnRhaW5lclJlZi5jbGFzc05hbWUuaW5kZXhPZihgJHt0aGlzLnByZWZpeENsc30tc3RhcnRgKSA+IC0xKSB7XG4gICAgICBjb25zdCByZWFsV2lkdGggPSB0aGlzLl9zeW50aGV0aWNQaENvbnRhaW5lclJlZi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aDtcbiAgICAgIHRoaXMuX3N5bnRoZXRpY1BoUmVmLnN0eWxlLndpZHRoID0gTWF0aC5jZWlsKHJlYWxXaWR0aCkgKyAncHgnO1xuICAgICAgaWYgKCF0aGlzLl9zaG93Q2FuY2VsQnV0dG9uKSB7XG4gICAgICAgIHRoaXMuX3JpZ2h0QnRuUmVmLnN0eWxlLm1hcmdpblJpZ2h0ID0gJzAnO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9zeW50aGV0aWNQaFJlZi5zdHlsZS53aWR0aCA9ICcxMDAlJztcbiAgICAgIGlmICghdGhpcy5fc2hvd0NhbmNlbEJ1dHRvbikge1xuICAgICAgICB0aGlzLl9yaWdodEJ0bkluaXRNYXJnaW5MZWZ0ID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUodGhpcy5fcmlnaHRCdG5SZWYpWydtYXJnaW4tbGVmdCddO1xuICAgICAgICBjb25zdCBidG5NYXJnaW5SaWdodCA9IHRoaXMuX3JpZ2h0QnRuUmVmLm9mZnNldFdpZHRoICsgcGFyc2VJbnQodGhpcy5fcmlnaHRCdG5Jbml0TWFyZ2luTGVmdCwgMTApO1xuICAgICAgICB0aGlzLl9yaWdodEJ0blJlZi5zdHlsZS5tYXJnaW5SaWdodCA9ICctJyArIGJ0bk1hcmdpblJpZ2h0ICsgJ3B4JztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBvblNlYXJjaGJhckJsdXIoKSB7XG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBpZiAoIXNlbGYuX2JsdXJGcm9tT25DbGVhciAmJiBzZWxmLl92YWx1ZSA9PT0gJycgJiYgc2VsZi5fZm9jdXMpIHtcbiAgICAgICAgc2VsZi5fZm9jdXMgPSBmYWxzZTtcbiAgICAgICAgc2VsZi5fdmFsdWUgPSAnJztcbiAgICAgICAgc2VsZi5vbkJsdXIuZW1pdCgpO1xuICAgICAgICBzZWxmLnNldENsYXNzKCk7XG4gICAgICB9XG4gICAgICBzZWxmLl9ibHVyRnJvbU9uQ2xlYXIgPSBmYWxzZTtcbiAgICB9LCA1MCk7XG4gIH1cblxuICBvblNlYXJjaGJhckZvY3VzKCkge1xuICAgIHRoaXMuX2ZvY3VzID0gdHJ1ZTtcbiAgICB0aGlzLl9pc1N1Ym1pdCA9IGZhbHNlO1xuICAgIHRoaXMub25Gb2N1cy5lbWl0KCk7XG4gICAgdGhpcy5zZXRDbGFzcygpO1xuICB9XG5cbiAgb25TZWFyY2hiYXJDaGFuZ2UoZSkge1xuICAgIHRoaXMuX2ZvY3VzID0gdHJ1ZTtcbiAgICB0aGlzLl92YWx1ZSA9IGU7XG4gICAgdGhpcy5vbkNoYW5nZS5lbWl0KGUpO1xuICAgIHRoaXMub25DaGFuZ2VGbihlKTtcbiAgICB0aGlzLnNldENsYXNzKCk7XG4gIH1cblxuICBvblNlYXJjaFN1Ym1pdChlKSB7XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHRoaXMuX3ZhbHVlID0gZS50YXJnZXRbMF0udmFsdWU7XG4gICAgdGhpcy5faXNTdWJtaXQgPSB0cnVlO1xuICAgIHRoaXMub25TdWJtaXQuZW1pdCh0aGlzLl92YWx1ZSk7XG4gICAgdGhpcy5zZXRDbGFzcygpO1xuICAgIHRoaXMuX2JsdXJGcm9tT25DbGVhciA9IHRydWU7XG4gICAgdGhpcy5pbnB1dEVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5ibHVyKCk7XG4gIH1cblxuICBvblNlYXJjaGJhckNhbmNlbCgpIHtcbiAgICB0aGlzLl9mb2N1cyA9IGZhbHNlO1xuICAgIHRoaXMuX3ZhbHVlID0gJyc7XG4gICAgdGhpcy5vbkNhbmNlbC5lbWl0KCk7XG4gICAgdGhpcy5zZXRDbGFzcygpO1xuICB9XG5cbiAgb25TZWFyY2hiYXJDbGVhcigpIHtcbiAgICB0aGlzLl9ibHVyRnJvbU9uQ2xlYXIgPSB0cnVlO1xuICAgIHRoaXMuX2lzQ2xlYXJDbGlja2luZyA9IHRydWU7XG4gICAgdGhpcy5vblNlYXJjaGJhckNoYW5nZSgnJyk7XG4gICAgdGhpcy5pbnB1dEVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgIHRoaXMub25DbGVhci5lbWl0KHRoaXMuX3ZhbHVlKTtcbiAgICB0aGlzLnNldENsYXNzKCk7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLl92YWx1ZSA9ICcnO1xuICAgICAgdGhpcy5faXNDbGVhckNsaWNraW5nID0gZmFsc2U7XG4gICAgICB0aGlzLl9ibHVyRnJvbU9uQ2xlYXIgPSBmYWxzZTtcbiAgICAgIHRoaXMuc2V0Q2xhc3MoKTtcbiAgICB9LCAxMDApO1xuICAgIHRoaXMub25TZWFyY2hiYXJGb2N1cygpO1xuICB9XG5cbiAgb25TZXRDb21wb3NpdGlvblN0YXRlKGlzQ29tcG9zaW5nOiBib29sZWFuKSB7XG4gICAgdGhpcy5pc0NvbXBvc2luZyA9IGlzQ29tcG9zaW5nO1xuICB9XG5cbiAgd3JpdGVWYWx1ZSh2YWx1ZTogYW55KTogdm9pZCB7XG4gICAgdGhpcy5fdmFsdWUgPSB2YWx1ZSB8fCAnJztcbiAgICB0aGlzLmlucHV0RWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnZhbHVlID0gdGhpcy5fdmFsdWU7XG4gICAgdGhpcy5zZXRDbGFzcygpO1xuICB9XG5cbiAgcmVnaXN0ZXJPbkNoYW5nZShmbjogKHZhbHVlOiBzdHJpbmcpID0+IHZvaWQpOiB2b2lkIHtcbiAgICB0aGlzLm9uQ2hhbmdlRm4gPSBmbjtcbiAgfVxuXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiAodmFsdWU6IHN0cmluZykgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMub25Ub3VjaEZuID0gZm47XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLnNldENsYXNzKCk7XG4gICAgdGhpcy5fbG9jYWxlUHJvdmlkZXIubG9jYWxlQ2hhbmdlLnBpcGUodGFrZVVudGlsKHRoaXMuX3Vuc3Vic2NyaWJlJCkpLnN1YnNjcmliZShfID0+IHtcbiAgICAgIHRoaXMubG9jYWxlID0gdGhpcy5fbG9jYWxlUHJvdmlkZXIuZ2V0TG9jYWxlU3ViT2JqKCdTZWFyY2hCYXInKTtcbiAgICAgIHRoaXMuX2NhbmNlbFRleHQgPSB0aGlzLl9pc0N1c3RvbVRleHQgPyB0aGlzLl9jYW5jZWxUZXh0IDogdGhpcy5sb2NhbGUuY2FuY2VsVGV4dDtcbiAgICB9KTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICB0aGlzLl9zeW50aGV0aWNQaENvbnRhaW5lclJlZiA9IHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFxuICAgICAgYCR7dGhpcy5wcmVmaXhDbHN9LXN5bnRoZXRpYy1waC1jb250YWluZXJgXG4gICAgKVswXTtcbiAgICB0aGlzLl9zeW50aGV0aWNQaFJlZiA9IHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGAke3RoaXMucHJlZml4Q2xzfS1zeW50aGV0aWMtcGhgKVswXTtcbiAgICB0aGlzLl9yaWdodEJ0blJlZiA9IHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdjYW5jZWwnKVswXTtcbiAgICB0aGlzLl9pbnB1dENvbnRhaW5lclJlZiA9IHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGAke3RoaXMucHJlZml4Q2xzfWApWzBdO1xuICB9XG5cbiAgbmdBZnRlclZpZXdDaGVja2VkKCkge1xuICAgIHRoaXMuc2V0U3R5bGUoKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuX3Vuc3Vic2NyaWJlJC5uZXh0KCk7XG4gICAgdGhpcy5fdW5zdWJzY3JpYmUkLmNvbXBsZXRlKCk7XG4gIH1cbn1cbiIsIjxmb3JtIG5hbWU9XCJteUZvcm1cIiBjbGFzcz1cInt7IHByZWZpeENscyB9fVwiIFtuZ0NsYXNzXT1cIndyYXBDbHNcIiBhY3Rpb249XCIjXCIgKHN1Ym1pdCk9XCJvblNlYXJjaFN1Ym1pdCgkZXZlbnQpXCI+XG4gIDxkaXYgY2xhc3M9XCJ7eyBwcmVmaXhDbHMgfX0taW5wdXRcIj5cbiAgICA8ZGl2XG4gICAgICBjbGFzcz1cInt7IHByZWZpeENscyB9fS1zeW50aGV0aWMtcGhcIlxuICAgICAgc3R5bGU9XCJib3gtc2l6aW5nOnVuc2V0XCJcbiAgICAgIFtAY2FuY2VsQnV0dG9uU3RhdGVdPVwic2hvd0NhbmNlbEJ1dHRvbiA/ICd2aXNpYmxlJyA6ICdoaWRkZW4nXCJcbiAgICA+XG4gICAgICA8c3BhbiBjbGFzcz1cInt7IHByZWZpeENscyB9fS1zeW50aGV0aWMtcGgtY29udGFpbmVyXCI+XG4gICAgICAgIDxpIGNsYXNzPVwie3sgcHJlZml4Q2xzIH19LXN5bnRoZXRpYy1waC1pY29uXCI+PC9pPlxuICAgICAgICA8c3BhblxuICAgICAgICAgIGNsYXNzPVwie3sgcHJlZml4Q2xzIH19LXN5bnRoZXRpYy1waC1wbGFjZWhvbGRlclwiXG4gICAgICAgICAgW25nU3R5bGVdPVwieyB2aXNpYmlsaXR5OiBwbGFjZWhvbGRlciAmJiAhaXNDb21wb3NpbmcgJiYgIXZhbHVlID8gJ3Zpc2libGUnIDogJ2hpZGRlbicgfVwiXG4gICAgICAgID5cbiAgICAgICAgICB7eyBwbGFjZWhvbGRlciB9fVxuICAgICAgICA8L3NwYW4+XG4gICAgICA8L3NwYW4+XG4gICAgPC9kaXY+XG4gICAgPGlucHV0XG4gICAgICAjc2VhcmNoXG4gICAgICBjbGFzcz1cInt7IHByZWZpeENscyB9fS12YWx1ZVwiXG4gICAgICBzdHlsZT1cIm91dGxpbmU6bm9uZTtcIlxuICAgICAgW25hbWVdPVwiJ3NlYXJjaCdcIlxuICAgICAgW3R5cGVdPVwiJ3NlYXJjaCdcIlxuICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgIFttYXhsZW5ndGhdPVwibWF4TGVuZ3RoXCJcbiAgICAgIFtwbGFjZWhvbGRlcl09XCJwbGFjZWhvbGRlclwiXG4gICAgICBbbmdNb2RlbF09XCJ2YWx1ZVwiXG4gICAgICAoYmx1cik9XCJvblNlYXJjaGJhckJsdXIoKVwiXG4gICAgICAoZm9jdXMpPVwib25TZWFyY2hiYXJGb2N1cygpXCJcbiAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uU2VhcmNoYmFyQ2hhbmdlKCRldmVudClcIlxuICAgICAgKGNvbXBvc2l0aW9uc3RhcnQpPVwib25TZXRDb21wb3NpdGlvblN0YXRlKHRydWUpXCJcbiAgICAgIChjb21wb3NpdGlvbmVuZCk9XCJvblNldENvbXBvc2l0aW9uU3RhdGUoZmFsc2UpXCJcbiAgICAvPlxuICAgIDxhIFtuZ0NsYXNzXT1cImNsZWFyQ2xzXCIgc3R5bGU9XCJib3gtc2l6aW5nOiBjb250ZW50LWJveDt0cmFuc2l0aW9uOiAwc1wiIChjbGljayk9XCJvblNlYXJjaGJhckNsZWFyKClcIj48L2E+XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPVwiY2FuY2VsXCIgW25nQ2xhc3NdPVwiY2FuY2VsQ2xzXCIgKGNsaWNrKT1cIm9uU2VhcmNoYmFyQ2FuY2VsKClcIj5cbiAgICB7eyBjYW5jZWxUZXh0IH19XG4gIDwvZGl2PlxuPC9mb3JtPlxuIl19