ng-zorro-antd
Version:
An enterprise-class UI components based on Ant Design and Angular
474 lines • 38.1 kB
JavaScript
/**
* @fileoverview added by tsickle
* Generated from: autocomplete.component.ts
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { __decorate, __metadata, __read, __spread } from "tslib";
/**
* @license
* Copyright Alibaba.com All Rights Reserved.
*
* Use of this source code is governed by an MIT-style license that can be
* found in the LICENSE file at https://github.com/NG-ZORRO/ng-zorro-antd/blob/master/LICENSE
*/
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ContentChildren, ElementRef, EventEmitter, Host, Input, NgZone, Optional, Output, QueryList, TemplateRef, ViewChild, ViewChildren, ViewEncapsulation } from '@angular/core';
import { slideMotion } from 'ng-zorro-antd/core/animation';
import { NzNoAnimationDirective } from 'ng-zorro-antd/core/no-animation';
import { InputBoolean } from 'ng-zorro-antd/core/util';
import { defer, merge, Subscription } from 'rxjs';
import { filter, switchMap, take } from 'rxjs/operators';
import { NzAutocompleteOptionComponent } from './autocomplete-option.component';
/**
* @record
*/
export function AutocompleteDataSourceItem() { }
if (false) {
/** @type {?} */
AutocompleteDataSourceItem.prototype.value;
/** @type {?} */
AutocompleteDataSourceItem.prototype.label;
}
var NzAutocompleteComponent = /** @class */ (function () {
function NzAutocompleteComponent(changeDetectorRef, ngZone, noAnimation) {
var _this = this;
this.changeDetectorRef = changeDetectorRef;
this.ngZone = ngZone;
this.noAnimation = noAnimation;
this.nzOverlayClassName = '';
this.nzOverlayStyle = {};
this.nzDefaultActiveFirstOption = true;
this.nzBackfill = false;
this.compareWith = (/**
* @param {?} o1
* @param {?} o2
* @return {?}
*/
function (o1, o2) { return o1 === o2; });
this.selectionChange = new EventEmitter();
this.showPanel = true;
this.isOpen = false;
this.dropDownPosition = 'bottom';
this.activeItemIndex = -1;
this.selectionChangeSubscription = Subscription.EMPTY;
this.optionMouseEnterSubscription = Subscription.EMPTY;
this.dataSourceChangeSubscription = Subscription.EMPTY;
/**
* Options changes listener
*/
this.optionSelectionChanges = defer((/**
* @return {?}
*/
function () {
if (_this.options) {
return merge.apply(void 0, __spread(_this.options.map((/**
* @param {?} option
* @return {?}
*/
function (option) { return option.selectionChange; }))));
}
return _this.ngZone.onStable.asObservable().pipe(take(1), switchMap((/**
* @return {?}
*/
function () { return _this.optionSelectionChanges; })));
}));
this.optionMouseEnter = defer((/**
* @return {?}
*/
function () {
if (_this.options) {
return merge.apply(void 0, __spread(_this.options.map((/**
* @param {?} option
* @return {?}
*/
function (option) { return option.mouseEntered; }))));
}
return _this.ngZone.onStable.asObservable().pipe(take(1), switchMap((/**
* @return {?}
*/
function () { return _this.optionMouseEnter; })));
}));
}
Object.defineProperty(NzAutocompleteComponent.prototype, "options", {
/**
* Options accessor, its source may be content or dataSource
*/
get: /**
* Options accessor, its source may be content or dataSource
* @return {?}
*/
function () {
// first dataSource
if (this.nzDataSource) {
return this.fromDataSourceOptions;
}
else {
return this.fromContentOptions;
}
},
enumerable: true,
configurable: true
});
/**
* @return {?}
*/
NzAutocompleteComponent.prototype.ngAfterContentInit = /**
* @return {?}
*/
function () {
if (!this.nzDataSource) {
this.optionsInit();
}
};
/**
* @return {?}
*/
NzAutocompleteComponent.prototype.ngAfterViewInit = /**
* @return {?}
*/
function () {
if (this.nzDataSource) {
this.optionsInit();
}
};
/**
* @return {?}
*/
NzAutocompleteComponent.prototype.ngOnDestroy = /**
* @return {?}
*/
function () {
this.dataSourceChangeSubscription.unsubscribe();
this.selectionChangeSubscription.unsubscribe();
this.optionMouseEnterSubscription.unsubscribe();
};
/**
* @return {?}
*/
NzAutocompleteComponent.prototype.setVisibility = /**
* @return {?}
*/
function () {
this.showPanel = !!this.options.length;
this.changeDetectorRef.markForCheck();
};
/**
* @param {?} index
* @return {?}
*/
NzAutocompleteComponent.prototype.setActiveItem = /**
* @param {?} index
* @return {?}
*/
function (index) {
/** @type {?} */
var activeItem = this.options.toArray()[index];
if (activeItem && !activeItem.active) {
this.activeItem = activeItem;
this.activeItemIndex = index;
this.clearSelectedOptions(this.activeItem);
this.activeItem.setActiveStyles();
this.changeDetectorRef.markForCheck();
}
};
/**
* @return {?}
*/
NzAutocompleteComponent.prototype.setNextItemActive = /**
* @return {?}
*/
function () {
/** @type {?} */
var nextIndex = this.activeItemIndex + 1 <= this.options.length - 1 ? this.activeItemIndex + 1 : 0;
this.setActiveItem(nextIndex);
};
/**
* @return {?}
*/
NzAutocompleteComponent.prototype.setPreviousItemActive = /**
* @return {?}
*/
function () {
/** @type {?} */
var previousIndex = this.activeItemIndex - 1 < 0 ? this.options.length - 1 : this.activeItemIndex - 1;
this.setActiveItem(previousIndex);
};
/**
* @param {?} value
* @return {?}
*/
NzAutocompleteComponent.prototype.getOptionIndex = /**
* @param {?} value
* @return {?}
*/
function (value) {
var _this = this;
return (/** @type {?} */ (this.options.reduce((/**
* @param {?} result
* @param {?} current
* @param {?} index
* @return {?}
*/
function (result, current, index) {
return result === -1 ? (_this.compareWith(value, current.nzValue) ? index : -1) : result;
}), -1)));
};
/**
* @param {?} value
* @return {?}
*/
NzAutocompleteComponent.prototype.getOption = /**
* @param {?} value
* @return {?}
*/
function (value) {
var _this = this;
return this.options.find((/**
* @param {?} item
* @return {?}
*/
function (item) { return _this.compareWith(value, item.nzValue); })) || null;
};
/**
* @param {?} position
* @return {?}
*/
NzAutocompleteComponent.prototype.updatePosition = /**
* @param {?} position
* @return {?}
*/
function (position) {
this.dropDownPosition = position;
this.changeDetectorRef.markForCheck();
};
/**
* @private
* @return {?}
*/
NzAutocompleteComponent.prototype.optionsInit = /**
* @private
* @return {?}
*/
function () {
var _this = this;
this.setVisibility();
this.subscribeOptionChanges();
/** @type {?} */
var changes = this.nzDataSource ? this.fromDataSourceOptions.changes : this.fromContentOptions.changes;
// async
this.dataSourceChangeSubscription = changes.subscribe((/**
* @param {?} e
* @return {?}
*/
function (e) {
if (!e.dirty && _this.isOpen) {
setTimeout((/**
* @return {?}
*/
function () { return _this.setVisibility(); }));
}
_this.subscribeOptionChanges();
}));
};
/**
* Clear the status of options
*/
/**
* Clear the status of options
* @param {?=} skip
* @param {?=} deselect
* @return {?}
*/
NzAutocompleteComponent.prototype.clearSelectedOptions = /**
* Clear the status of options
* @param {?=} skip
* @param {?=} deselect
* @return {?}
*/
function (skip, deselect) {
if (deselect === void 0) { deselect = false; }
this.options.forEach((/**
* @param {?} option
* @return {?}
*/
function (option) {
if (option !== skip) {
if (deselect) {
option.deselect();
}
option.setInactiveStyles();
}
}));
};
/**
* @private
* @return {?}
*/
NzAutocompleteComponent.prototype.subscribeOptionChanges = /**
* @private
* @return {?}
*/
function () {
var _this = this;
this.selectionChangeSubscription.unsubscribe();
this.selectionChangeSubscription = this.optionSelectionChanges
.pipe(filter((/**
* @param {?} event
* @return {?}
*/
function (event) { return event.isUserInput; })))
.subscribe((/**
* @param {?} event
* @return {?}
*/
function (event) {
event.source.select();
event.source.setActiveStyles();
_this.activeItem = event.source;
_this.activeItemIndex = _this.getOptionIndex(_this.activeItem.nzValue);
_this.clearSelectedOptions(event.source, true);
_this.selectionChange.emit(event.source);
}));
this.optionMouseEnterSubscription.unsubscribe();
this.optionMouseEnterSubscription = this.optionMouseEnter.subscribe((/**
* @param {?} event
* @return {?}
*/
function (event) {
event.setActiveStyles();
_this.activeItem = event;
_this.activeItemIndex = _this.getOptionIndex(_this.activeItem.nzValue);
_this.clearSelectedOptions(event);
}));
};
NzAutocompleteComponent.decorators = [
{ type: Component, args: [{
selector: 'nz-autocomplete',
exportAs: 'nzAutocomplete',
preserveWhitespaces: false,
changeDetection: ChangeDetectionStrategy.OnPush,
encapsulation: ViewEncapsulation.None,
template: "\n <ng-template>\n <div\n #panel\n class=\"ant-select-dropdown ant-select-dropdown-placement-bottomLeft\"\n [class.ant-select-dropdown-hidden]=\"!showPanel\"\n [ngClass]=\"nzOverlayClassName\"\n [ngStyle]=\"nzOverlayStyle\"\n [nzNoAnimation]=\"noAnimation?.nzNoAnimation\"\n [@slideMotion]=\"dropDownPosition\"\n [@.disabled]=\"noAnimation?.nzNoAnimation\"\n >\n <div style=\"max-height: 256px; overflow-y: auto; overflow-anchor: none;\">\n <div style=\"display: flex; flex-direction: column;\">\n <ng-template *ngTemplateOutlet=\"nzDataSource ? optionsTemplate : contentTemplate\"></ng-template>\n </div>\n </div>\n </div>\n <ng-template #contentTemplate>\n <ng-content></ng-content>\n </ng-template>\n <ng-template #optionsTemplate>\n <nz-auto-option\n *ngFor=\"let option of nzDataSource\"\n [nzValue]=\"option\"\n [nzLabel]=\"option && option.label ? option.label : $any(option)\"\n >\n {{ option && option.label ? option.label : option }}\n </nz-auto-option>\n </ng-template>\n </ng-template>\n ",
animations: [slideMotion]
}] }
];
/** @nocollapse */
NzAutocompleteComponent.ctorParameters = function () { return [
{ type: ChangeDetectorRef },
{ type: NgZone },
{ type: NzNoAnimationDirective, decorators: [{ type: Host }, { type: Optional }] }
]; };
NzAutocompleteComponent.propDecorators = {
nzWidth: [{ type: Input }],
nzOverlayClassName: [{ type: Input }],
nzOverlayStyle: [{ type: Input }],
nzDefaultActiveFirstOption: [{ type: Input }],
nzBackfill: [{ type: Input }],
compareWith: [{ type: Input }],
nzDataSource: [{ type: Input }],
selectionChange: [{ type: Output }],
fromContentOptions: [{ type: ContentChildren, args: [NzAutocompleteOptionComponent, { descendants: true },] }],
fromDataSourceOptions: [{ type: ViewChildren, args: [NzAutocompleteOptionComponent,] }],
template: [{ type: ViewChild, args: [TemplateRef, { static: false },] }],
panel: [{ type: ViewChild, args: ['panel', { static: false },] }],
content: [{ type: ViewChild, args: ['content', { static: false },] }]
};
__decorate([
InputBoolean(),
__metadata("design:type", Object)
], NzAutocompleteComponent.prototype, "nzDefaultActiveFirstOption", void 0);
__decorate([
InputBoolean(),
__metadata("design:type", Object)
], NzAutocompleteComponent.prototype, "nzBackfill", void 0);
return NzAutocompleteComponent;
}());
export { NzAutocompleteComponent };
if (false) {
/** @type {?} */
NzAutocompleteComponent.ngAcceptInputType_nzDefaultActiveFirstOption;
/** @type {?} */
NzAutocompleteComponent.ngAcceptInputType_nzBackfill;
/** @type {?} */
NzAutocompleteComponent.prototype.nzWidth;
/** @type {?} */
NzAutocompleteComponent.prototype.nzOverlayClassName;
/** @type {?} */
NzAutocompleteComponent.prototype.nzOverlayStyle;
/** @type {?} */
NzAutocompleteComponent.prototype.nzDefaultActiveFirstOption;
/** @type {?} */
NzAutocompleteComponent.prototype.nzBackfill;
/** @type {?} */
NzAutocompleteComponent.prototype.compareWith;
/** @type {?} */
NzAutocompleteComponent.prototype.nzDataSource;
/** @type {?} */
NzAutocompleteComponent.prototype.selectionChange;
/** @type {?} */
NzAutocompleteComponent.prototype.showPanel;
/** @type {?} */
NzAutocompleteComponent.prototype.isOpen;
/** @type {?} */
NzAutocompleteComponent.prototype.activeItem;
/** @type {?} */
NzAutocompleteComponent.prototype.dropDownPosition;
/**
* Provided by content
* @type {?}
*/
NzAutocompleteComponent.prototype.fromContentOptions;
/**
* Provided by dataSource
* @type {?}
*/
NzAutocompleteComponent.prototype.fromDataSourceOptions;
/**
* cdk-overlay
* @type {?}
*/
NzAutocompleteComponent.prototype.template;
/** @type {?} */
NzAutocompleteComponent.prototype.panel;
/** @type {?} */
NzAutocompleteComponent.prototype.content;
/**
* @type {?}
* @private
*/
NzAutocompleteComponent.prototype.activeItemIndex;
/**
* @type {?}
* @private
*/
NzAutocompleteComponent.prototype.selectionChangeSubscription;
/**
* @type {?}
* @private
*/
NzAutocompleteComponent.prototype.optionMouseEnterSubscription;
/**
* @type {?}
* @private
*/
NzAutocompleteComponent.prototype.dataSourceChangeSubscription;
/**
* Options changes listener
* @type {?}
*/
NzAutocompleteComponent.prototype.optionSelectionChanges;
/** @type {?} */
NzAutocompleteComponent.prototype.optionMouseEnter;
/**
* @type {?}
* @private
*/
NzAutocompleteComponent.prototype.changeDetectorRef;
/**
* @type {?}
* @private
*/
NzAutocompleteComponent.prototype.ngZone;
/** @type {?} */
NzAutocompleteComponent.prototype.noAnimation;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0b2NvbXBsZXRlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25nLXpvcnJvLWFudGQvYXV0by1jb21wbGV0ZS8iLCJzb3VyY2VzIjpbImF1dG9jb21wbGV0ZS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztBQVFBLE9BQU8sRUFHTCx1QkFBdUIsRUFDdkIsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxlQUFlLEVBQ2YsVUFBVSxFQUNWLFlBQVksRUFDWixJQUFJLEVBQ0osS0FBSyxFQUNMLE1BQU0sRUFFTixRQUFRLEVBQ1IsTUFBTSxFQUNOLFNBQVMsRUFDVCxXQUFXLEVBQ1gsU0FBUyxFQUNULFlBQVksRUFDWixpQkFBaUIsRUFDbEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQzNELE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBRXpFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBYyxZQUFZLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDOUQsT0FBTyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFekQsT0FBTyxFQUFFLDZCQUE2QixFQUEyQixNQUFNLGlDQUFpQyxDQUFDOzs7O0FBRXpHLGdEQUdDOzs7SUFGQywyQ0FBYzs7SUFDZCwyQ0FBYzs7QUFLaEI7SUEwR0UsaUNBQ1UsaUJBQW9DLEVBQ3BDLE1BQWMsRUFDSyxXQUFvQztRQUhqRSxpQkFJSTtRQUhNLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBbUI7UUFDcEMsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUNLLGdCQUFXLEdBQVgsV0FBVyxDQUF5QjtRQWhFeEQsdUJBQWtCLEdBQUcsRUFBRSxDQUFDO1FBQ3hCLG1CQUFjLEdB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Q0wsTUFBTTtxQ0FxQk4sZUFBZSxTQUFDLDZCQUE2QixFQUFFLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRTt3Q0FHcEUsWUFBWSxTQUFDLDZCQUE2QjsyQkFHMUMsU0FBUyxTQUFDLFdBQVcsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7d0JBQ3hDLFNBQVMsU0FBQyxPQUFPLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFOzBCQUNwQyxTQUFTLFNBQUMsU0FBUyxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTs7SUFqQ2Q7UUFBZixZQUFZLEVBQUU7OytFQUFtQztJQUNsQztRQUFmLFlBQVksRUFBRTs7K0RBQW9CO0lBMks5Qyw4QkFBQztDQUFBLEFBM05ELElBMk5DO1NBbkxZLHVCQUF1Qjs7O0lBQ2xDLHFFQUFrRTs7SUFDbEUscURBQWtEOztJQUVsRCwwQ0FBeUI7O0lBQ3pCLHFEQUFpQzs7SUFDakMsaURBQXdEOztJQUN4RCw2REFBMkQ7O0lBQzNELDZDQUE0Qzs7SUFDNUMsOENBQTBEOztJQUMxRCwrQ0FBOEM7O0lBQzlDLGtEQUMwSDs7SUFFMUgsNENBQTBCOztJQUMxQix5Q0FBd0I7O0lBQ3hCLDZDQUEwQzs7SUFDMUMsbURBQWdEOzs7OztJQWVoRCxxREFDNkQ7Ozs7O0lBRTdELHdEQUE2Rzs7Ozs7SUFHN0csMkNBQXFFOztJQUNyRSx3Q0FBeUQ7O0lBQ3pELDBDQUE2RDs7Ozs7SUFFN0Qsa0RBQXFDOzs7OztJQUNyQyw4REFBeUQ7Ozs7O0lBQ3pELCtEQUEwRDs7Ozs7SUFDMUQsK0RBQTBEOzs7OztJQUUxRCx5REFRRzs7SUFDSCxtREFRRzs7Ozs7SUFHRCxvREFBNEM7Ozs7O0lBQzVDLHlDQUFzQjs7SUFDdEIsOENBQStEIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEFsaWJhYmEuY29tIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9naXRodWIuY29tL05HLVpPUlJPL25nLXpvcnJvLWFudGQvYmxvYi9tYXN0ZXIvTElDRU5TRVxuICovXG5cbmltcG9ydCB7XG4gIEFmdGVyQ29udGVudEluaXQsXG4gIEFmdGVyVmlld0luaXQsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBDb250ZW50Q2hpbGRyZW4sXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSG9zdCxcbiAgSW5wdXQsXG4gIE5nWm9uZSxcbiAgT25EZXN0cm95LFxuICBPcHRpb25hbCxcbiAgT3V0cHV0LFxuICBRdWVyeUxpc3QsXG4gIFRlbXBsYXRlUmVmLFxuICBWaWV3Q2hpbGQsXG4gIFZpZXdDaGlsZHJlbixcbiAgVmlld0VuY2Fwc3VsYXRpb25cbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBzbGlkZU1vdGlvbiB9IGZyb20gJ25nLXpvcnJvLWFudGQvY29yZS9hbmltYXRpb24nO1xuaW1wb3J0IHsgTnpOb0FuaW1hdGlvbkRpcmVjdGl2ZSB9IGZyb20gJ25nLXpvcnJvLWFudGQvY29yZS9uby1hbmltYXRpb24nO1xuaW1wb3J0IHsgQm9vbGVhbklucHV0LCBDb21wYXJlV2l0aCwgTnpEcm9wRG93blBvc2l0aW9uLCBOelNhZmVBbnkgfSBmcm9tICduZy16b3Jyby1hbnRkL2NvcmUvdHlwZXMnO1xuaW1wb3J0IHsgSW5wdXRCb29sZWFuIH0gZnJvbSAnbmctem9ycm8tYW50ZC9jb3JlL3V0aWwnO1xuaW1wb3J0IHsgZGVmZXIsIG1lcmdlLCBPYnNlcnZhYmxlLCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGZpbHRlciwgc3dpdGNoTWFwLCB0YWtlIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBOekF1dG9jb21wbGV0ZU9wdGlvbkNvbXBvbmVudCwgTnpPcHRpb25TZWxlY3Rpb25DaGFuZ2UgfSBmcm9tICcuL2F1dG9jb21wbGV0ZS1vcHRpb24uY29tcG9uZW50JztcblxuZXhwb3J0IGludGVyZmFjZSBBdXRvY29tcGxldGVEYXRhU291cmNlSXRlbSB7XG4gIHZhbHVlOiBzdHJpbmc7XG4gIGxhYmVsOiBzdHJpbmc7XG59XG5cbmV4cG9ydCB0eXBlIEF1dG9jb21wbGV0ZURhdGFTb3VyY2UgPSBBdXRvY29tcGxldGVEYXRhU291cmNlSXRlbVtdIHwgc3RyaW5nW10gfCBudW1iZXJbXTtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbnotYXV0b2NvbXBsZXRlJyxcbiAgZXhwb3J0QXM6ICduekF1dG9jb21wbGV0ZScsXG4gIHByZXNlcnZlV2hpdGVzcGFjZXM6IGZhbHNlLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgdGVtcGxhdGU6IGBcbiAgICA8bmctdGVtcGxhdGU+XG4gICAgICA8ZGl2XG4gICAgICAgICNwYW5lbFxuICAgICAgICBjbGFzcz1cImFudC1zZWxlY3QtZHJvcGRvd24gYW50LXNlbGVjdC1kcm9wZG93bi1wbGFjZW1lbnQtYm90dG9tTGVmdFwiXG4gICAgICAgIFtjbGFzcy5hbnQtc2VsZWN0LWRyb3Bkb3duLWhpZGRlbl09XCIhc2hvd1BhbmVsXCJcbiAgICAgICAgW25nQ2xhc3NdPVwibnpPdmVybGF5Q2xhc3NOYW1lXCJcbiAgICAgICAgW25nU3R5bGVdPVwibnpPdmVybGF5U3R5bGVcIlxuICAgICAgICBbbnpOb0FuaW1hdGlvbl09XCJub0FuaW1hdGlvbj8ubnpOb0FuaW1hdGlvblwiXG4gICAgICAgIFtAc2xpZGVNb3Rpb25dPVwiZHJvcERvd25Qb3NpdGlvblwiXG4gICAgICAgIFtALmRpc2FibGVkXT1cIm5vQW5pbWF0aW9uPy5uek5vQW5pbWF0aW9uXCJcbiAgICAgID5cbiAgICAgICAgPGRpdiBzdHlsZT1cIm1heC1oZWlnaHQ6IDI1NnB4OyBvdmVyZmxvdy15OiBhdXRvOyBvdmVyZmxvdy1hbmNob3I6IG5vbmU7XCI+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XCI+XG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgKm5nVGVtcGxhdGVPdXRsZXQ9XCJuekRhdGFTb3VyY2UgPyBvcHRpb25zVGVtcGxhdGUgOiBjb250ZW50VGVtcGxhdGVcIj48L25nLXRlbXBsYXRlPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPG5nLXRlbXBsYXRlICNjb250ZW50VGVtcGxhdGU+XG4gICAgICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbiAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICA8bmctdGVtcGxhdGUgI29wdGlvbnNUZW1wbGF0ZT5cbiAgICAgICAgPG56LWF1dG8tb3B0aW9uXG4gICAgICAgICAgKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBuekRhdGFTb3VyY2VcIlxuICAgICAgICAgIFtuelZhbHVlXT1cIm9wdGlvblwiXG4gICAgICAgICAgW256TGFiZWxdPVwib3B0aW9uICYmIG9wdGlvbi5sYWJlbCA/IG9wdGlvbi5sYWJlbCA6ICRhbnkob3B0aW9uKVwiXG4gICAgICAgID5cbiAgICAgICAgICB7eyBvcHRpb24gJiYgb3B0aW9uLmxhYmVsID8gb3B0aW9uLmxhYmVsIDogb3B0aW9uIH19XG4gICAgICAgIDwvbnotYXV0by1vcHRpb24+XG4gICAgICA8L25nLXRlbXBsYXRlPlxuICAgIDwvbmctdGVtcGxhdGU+XG4gIGAsXG4gIGFuaW1hdGlvbnM6IFtzbGlkZU1vdGlvbl1cbn0pXG5leHBvcnQgY2xhc3MgTnpBdXRvY29tcGxldGVDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlckNvbnRlbnRJbml0LCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuICBzdGF0aWMgbmdBY2NlcHRJbnB1dFR5cGVfbnpEZWZhdWx0QWN0aXZlRmlyc3RPcHRpb246IEJvb2xlYW5JbnB1dDtcbiAgc3RhdGljIG5nQWNjZXB0SW5wdXRUeXBlX256QmFja2ZpbGw6IEJvb2xlYW5JbnB1dDtcblxuICBASW5wdXQoKSBueldpZHRoOiBudW1iZXI7XG4gIEBJbnB1dCgpIG56T3ZlcmxheUNsYXNzTmFtZSA9ICcnO1xuICBASW5wdXQoKSBuek92ZXJsYXlTdHlsZTogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSA9IHt9O1xuICBASW5wdXQoKSBASW5wdXRCb29sZWFuKCkgbnpEZWZhdWx0QWN0aXZlRmlyc3RPcHRpb24gPSB0cnVlO1xuICBASW5wdXQoKSBASW5wdXRCb29sZWFuKCkgbnpCYWNrZmlsbCA9IGZhbHNlO1xuICBASW5wdXQoKSBjb21wYXJlV2l0aDogQ29tcGFyZVdpdGggPSAobzEsIG8yKSA9PiBvMSA9PT0gbzI7XG4gIEBJbnB1dCgpIG56RGF0YVNvdXJjZTogQXV0b2NvbXBsZXRlRGF0YVNvdXJjZTtcbiAgQE91dHB1dCgpXG4gIHJlYWRvbmx5IHNlbGVjdGlvbkNoYW5nZTogRXZlbnRFbWl0dGVyPE56QXV0b2NvbXBsZXRlT3B0aW9uQ29tcG9uZW50PiA9IG5ldyBFdmVudEVtaXR0ZXI8TnpBdXRvY29tcGxldGVPcHRpb25Db21wb25lbnQ+KCk7XG5cbiAgc2hvd1BhbmVsOiBib29sZWFuID0gdHJ1ZTtcbiAgaXNPcGVuOiBib29sZWFuID0gZmFsc2U7XG4gIGFjdGl2ZUl0ZW06IE56QXV0b2NvbXBsZXRlT3B0aW9uQ29tcG9uZW50O1xuICBkcm9wRG93blBvc2l0aW9uOiBOekRyb3BEb3duUG9zaXRpb24gPSAnYm90dG9tJztcblxuICAvKipcbiAgICogT3B0aW9ucyBhY2Nlc3NvciwgaXRzIHNvdXJjZSBtYXkgYmUgY29udGVudCBvciBkYXRhU291cmNlXG4gICAqL1xuICBnZXQgb3B0aW9ucygpOiBRdWVyeUxpc3Q8TnpBdXRvY29tcGxldGVPcHRpb25Db21wb25lbnQ+IHtcbiAgICAvLyBmaXJzdCBkYXRhU291cmNlXG4gICAgaWYgKHRoaXMubnpEYXRhU291cmNlKSB7XG4gICAgICByZXR1cm4gdGhpcy5mcm9tRGF0YVNvdXJjZU9wdGlvbnM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLmZyb21Db250ZW50T3B0aW9ucztcbiAgICB9XG4gIH1cblxuICAvKiogUHJvdmlkZWQgYnkgY29udGVudCAqL1xuICBAQ29udGVudENoaWxkcmVuKE56QXV0b2NvbXBsZXRlT3B0aW9uQ29tcG9uZW50LCB7IGRlc2NlbmRhbnRzOiB0cnVlIH0pXG4gIGZyb21Db250ZW50T3B0aW9uczogUXVlcnlMaXN0PE56QXV0b2NvbXBsZXRlT3B0aW9uQ29tcG9uZW50PjtcbiAgLyoqIFByb3ZpZGVkIGJ5IGRhdGFTb3VyY2UgKi9cbiAgQFZpZXdDaGlsZHJlbihOekF1dG9jb21wbGV0ZU9wdGlvbkNvbXBvbmVudCkgZnJvbURhdGFTb3VyY2VPcHRpb25zOiBRdWVyeUxpc3Q8TnpBdXRvY29tcGxldGVPcHRpb25Db21wb25lbnQ+O1xuXG4gIC8qKiBjZGstb3ZlcmxheSAqL1xuICBAVmlld0NoaWxkKFRlbXBsYXRlUmVmLCB7IHN0YXRpYzogZmFsc2UgfSkgdGVtcGxhdGU6IFRlbXBsYXRlUmVmPHt9PjtcbiAgQFZpZXdDaGlsZCgncGFuZWwnLCB7IHN0YXRpYzogZmFsc2UgfSkgcGFuZWw6IEVsZW1lbnRSZWY7XG4gIEBWaWV3Q2hpbGQoJ2NvbnRlbnQnLCB7IHN0YXRpYzogZmFsc2UgfSkgY29udGVudDogRWxlbWVudFJlZjtcblxuICBwcml2YXRlIGFjdGl2ZUl0ZW1JbmRleDogbnVtYmVyID0gLTE7XG4gIHByaXZhdGUgc2VsZWN0aW9uQ2hhbmdlU3Vic2NyaXB0aW9uID0gU3Vic2NyaXB0aW9uLkVNUFRZO1xuICBwcml2YXRlIG9wdGlvbk1vdXNlRW50ZXJTdWJzY3JpcHRpb24gPSBTdWJzY3JpcHRpb24uRU1QVFk7XG4gIHByaXZhdGUgZGF0YVNvdXJjZUNoYW5nZVN1YnNjcmlwdGlvbiA9IFN1YnNjcmlwdGlvbi5FTVBUWTtcbiAgLyoqIE9wdGlvbnMgY2hhbmdlcyBsaXN0ZW5lciAqL1xuICByZWFkb25seSBvcHRpb25TZWxlY3Rpb25DaGFuZ2VzOiBPYnNlcnZhYmxlPE56T3B0aW9uU2VsZWN0aW9uQ2hhbmdlPiA9IGRlZmVyKCgpID0+IHtcbiAgICBpZiAodGhpcy5vcHRpb25zKSB7XG4gICAgICByZXR1cm4gbWVyZ2U8TnpPcHRpb25TZWxlY3Rpb25DaGFuZ2U+KC4uLnRoaXMub3B0aW9ucy5tYXAob3B0aW9uID0+IG9wdGlvbi5zZWxlY3Rpb25DaGFuZ2UpKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMubmdab25lLm9uU3RhYmxlLmFzT2JzZXJ2YWJsZSgpLnBpcGUoXG4gICAgICB0YWtlKDEpLFxuICAgICAgc3dpdGNoTWFwKCgpID0+IHRoaXMub3B0aW9uU2VsZWN0aW9uQ2hhbmdlcylcbiAgICApO1xuICB9KTtcbiAgcmVhZG9ubHkgb3B0aW9uTW91c2VFbnRlcjogT2JzZXJ2YWJsZTxOekF1dG9jb21wbGV0ZU9wdGlvbkNvbXBvbmVudD4gPSBkZWZlcigoKSA9PiB7XG4gICAgaWYgKHRoaXMub3B0aW9ucykge1xuICAgICAgcmV0dXJuIG1lcmdlPE56QXV0b2NvbXBsZXRlT3B0aW9uQ29tcG9uZW50PiguLi50aGlzLm9wdGlvbnMubWFwKG9wdGlvbiA9PiBvcHRpb24ubW91c2VFbnRlcmVkKSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLm5nWm9uZS5vblN0YWJsZS5hc09ic2VydmFibGUoKS5waXBlKFxuICAgICAgdGFrZSgxKSxcbiAgICAgIHN3aXRjaE1hcCgoKSA9PiB0aGlzLm9wdGlvbk1vdXNlRW50ZXIpXG4gICAgKTtcbiAgfSk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBjaGFuZ2VEZXRlY3RvclJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgcHJpdmF0ZSBuZ1pvbmU6IE5nWm9uZSxcbiAgICBASG9zdCgpIEBPcHRpb25hbCgpIHB1YmxpYyBub0FuaW1hdGlvbj86IE56Tm9BbmltYXRpb25EaXJlY3RpdmVcbiAgKSB7fVxuXG4gIG5nQWZ0ZXJDb250ZW50SW5pdCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMubnpEYXRhU291cmNlKSB7XG4gICAgICB0aGlzLm9wdGlvbnNJbml0KCk7XG4gICAgfVxuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLm56RGF0YVNvdXJjZSkge1xuICAgICAgdGhpcy5vcHRpb25zSW5pdCgpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuZGF0YVNvdXJjZUNoYW5nZVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuc2VsZWN0aW9uQ2hhbmdlU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5vcHRpb25Nb3VzZUVudGVyU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBzZXRWaXNpYmlsaXR5KCk6IHZvaWQge1xuICAgIHRoaXMuc2hvd1BhbmVsID0gISF0aGlzLm9wdGlvbnMubGVuZ3RoO1xuICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBzZXRBY3RpdmVJdGVtKGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBhY3RpdmVJdGVtID0gdGhpcy5vcHRpb25zLnRvQXJyYXkoKVtpbmRleF07XG4gICAgaWYgKGFjdGl2ZUl0ZW0gJiYgIWFjdGl2ZUl0ZW0uYWN0aXZlKSB7XG4gICAgICB0aGlzLmFjdGl2ZUl0ZW0gPSBhY3RpdmVJdGVtO1xuICAgICAgdGhpcy5hY3RpdmVJdGVtSW5kZXggPSBpbmRleDtcbiAgICAgIHRoaXMuY2xlYXJTZWxlY3RlZE9wdGlvbnModGhpcy5hY3RpdmVJdGVtKTtcbiAgICAgIHRoaXMuYWN0aXZlSXRlbS5zZXRBY3RpdmVTdHlsZXMoKTtcbiAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuICB9XG5cbiAgc2V0TmV4dEl0ZW1BY3RpdmUoKTogdm9pZCB7XG4gICAgY29uc3QgbmV4dEluZGV4ID0gdGhpcy5hY3RpdmVJdGVtSW5kZXggKyAxIDw9IHRoaXMub3B0aW9ucy5sZW5ndGggLSAxID8gdGhpcy5hY3RpdmVJdGVtSW5kZXggKyAxIDogMDtcbiAgICB0aGlzLnNldEFjdGl2ZUl0ZW0obmV4dEluZGV4KTtcbiAgfVxuXG4gIHNldFByZXZpb3VzSXRlbUFjdGl2ZSgpOiB2b2lkIHtcbiAgICBjb25zdCBwcmV2aW91c0luZGV4ID0gdGhpcy5hY3RpdmVJdGVtSW5kZXggLSAxIDwgMCA/IHRoaXMub3B0aW9ucy5sZW5ndGggLSAxIDogdGhpcy5hY3RpdmVJdGVtSW5kZXggLSAxO1xuICAgIHRoaXMuc2V0QWN0aXZlSXRlbShwcmV2aW91c0luZGV4KTtcbiAgfVxuXG4gIGdldE9wdGlvbkluZGV4KHZhbHVlOiBOelNhZmVBbnkpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnMucmVkdWNlKChyZXN1bHQ6IG51bWJlciwgY3VycmVudDogTnpBdXRvY29tcGxldGVPcHRpb25Db21wb25lbnQsIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgIHJldHVybiByZXN1bHQgPT09IC0xID8gKHRoaXMuY29tcGFyZVdpdGgodmFsdWUsIGN1cnJlbnQubnpWYWx1ZSkgPyBpbmRleCA6IC0xKSA6IHJlc3VsdDtcbiAgICB9LCAtMSkhO1xuICB9XG5cbiAgZ2V0T3B0aW9uKHZhbHVlOiBOelNhZmVBbnkpOiBOekF1dG9jb21wbGV0ZU9wdGlvbkNvbXBvbmVudCB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnMuZmluZChpdGVtID0+IHRoaXMuY29tcGFyZVdpdGgodmFsdWUsIGl0ZW0ubnpWYWx1ZSkpIHx8IG51bGw7XG4gIH1cblxuICB1cGRhdGVQb3NpdGlvbihwb3NpdGlvbjogTnpEcm9wRG93blBvc2l0aW9uKTogdm9pZCB7XG4gICAgdGhpcy5kcm9wRG93blBvc2l0aW9uID0gcG9zaXRpb247XG4gICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHByaXZhdGUgb3B0aW9uc0luaXQoKTogdm9pZCB7XG4gICAgdGhpcy5zZXRWaXNpYmlsaXR5KCk7XG4gICAgdGhpcy5zdWJzY3JpYmVPcHRpb25DaGFuZ2VzKCk7XG4gICAgY29uc3QgY2hhbmdlcyA9IHRoaXMubnpEYXRhU291cmNlID8gdGhpcy5mcm9tRGF0YVNvdXJjZU9wdGlvbnMuY2hhbmdlcyA6IHRoaXMuZnJvbUNvbnRlbnRPcHRpb25zLmNoYW5nZXM7XG4gICAgLy8gYXN5bmNcbiAgICB0aGlzLmRhdGFTb3VyY2VDaGFuZ2VTdWJzY3JpcHRpb24gPSBjaGFuZ2VzLnN1YnNjcmliZShlID0+IHtcbiAgICAgIGlmICghZS5kaXJ0eSAmJiB0aGlzLmlzT3Blbikge1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuc2V0VmlzaWJpbGl0eSgpKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuc3Vic2NyaWJlT3B0aW9uQ2hhbmdlcygpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFyIHRoZSBzdGF0dXMgb2Ygb3B0aW9uc1xuICAgKi9cbiAgY2xlYXJTZWxlY3RlZE9wdGlvbnMoc2tpcD86IE56QXV0b2NvbXBsZXRlT3B0aW9uQ29tcG9uZW50IHwgbnVsbCwgZGVzZWxlY3Q6IGJvb2xlYW4gPSBmYWxzZSk6IHZvaWQge1xuICAgIHRoaXMub3B0aW9ucy5mb3JFYWNoKG9wdGlvbiA9PiB7XG4gICAgICBpZiAob3B0aW9uICE9PSBza2lwKSB7XG4gICAgICAgIGlmIChkZXNlbGVjdCkge1xuICAgICAgICAgIG9wdGlvbi5kZXNlbGVjdCgpO1xuICAgICAgICB9XG4gICAgICAgIG9wdGlvbi5zZXRJbmFjdGl2ZVN0eWxlcygpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBzdWJzY3JpYmVPcHRpb25DaGFuZ2VzKCk6IHZvaWQge1xuICAgIHRoaXMuc2VsZWN0aW9uQ2hhbmdlU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5zZWxlY3Rpb25DaGFuZ2VTdWJzY3JpcHRpb24gPSB0aGlzLm9wdGlvblNlbGVjdGlvbkNoYW5nZXNcbiAgICAgIC5waXBlKGZpbHRlcigoZXZlbnQ6IE56T3B0aW9uU2VsZWN0aW9uQ2hhbmdlKSA9PiBldmVudC5pc1VzZXJJbnB1dCkpXG4gICAgICAuc3Vic2NyaWJlKChldmVudDogTnpPcHRpb25TZWxlY3Rpb25DaGFuZ2UpID0+IHtcbiAgICAgICAgZXZlbnQuc291cmNlLnNlbGVjdCgpO1xuICAgICAgICBldmVudC5zb3VyY2Uuc2V0QWN0aXZlU3R5bGVzKCk7XG4gICAgICAgIHRoaXMuYWN0aXZlSXRlbSA9IGV2ZW50LnNvdXJjZTtcbiAgICAgICAgdGhpcy5hY3RpdmVJdGVtSW5kZXggPSB0aGlzLmdldE9wdGlvbkluZGV4KHRoaXMuYWN0aXZlSXRlbS5uelZhbHVlKTtcbiAgICAgICAgdGhpcy5jbGVhclNlbGVjdGVkT3B0aW9ucyhldmVudC5zb3VyY2UsIHRydWUpO1xuICAgICAgICB0aGlzLnNlbGVjdGlvbkNoYW5nZS5lbWl0KGV2ZW50LnNvdXJjZSk7XG4gICAgICB9KTtcblxuICAgIHRoaXMub3B0aW9uTW91c2VFbnRlclN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMub3B0aW9uTW91c2VFbnRlclN1YnNjcmlwdGlvbiA9IHRoaXMub3B0aW9uTW91c2VFbnRlci5zdWJzY3JpYmUoKGV2ZW50OiBOekF1dG9jb21wbGV0ZU9wdGlvbkNvbXBvbmVudCkgPT4ge1xuICAgICAgZXZlbnQuc2V0QWN0aXZlU3R5bGVzKCk7XG4gICAgICB0aGlzLmFjdGl2ZUl0ZW0gPSBldmVudDtcbiAgICAgIHRoaXMuYWN0aXZlSXRlbUluZGV4ID0gdGhpcy5nZXRPcHRpb25JbmRleCh0aGlzLmFjdGl2ZUl0ZW0ubnpWYWx1ZSk7XG4gICAgICB0aGlzLmNsZWFyU2VsZWN0ZWRPcHRpb25zKGV2ZW50KTtcbiAgICB9KTtcbiAgfVxufVxuIl19