UNPKG

ng-zorro-antd

Version:

An enterprise-class UI components based on Ant Design and Angular

382 lines 32.8 kB
/** * @fileoverview added by tsickle * Generated from: select-top-control.component.ts * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ /** * @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 { BACKSPACE } from '@angular/cdk/keycodes'; import { ChangeDetectionStrategy, Component, EventEmitter, Host, Input, Optional, Output, ViewChild, ViewEncapsulation } from '@angular/core'; import { zoomMotion } from 'ng-zorro-antd/core/animation'; import { NzNoAnimationDirective } from 'ng-zorro-antd/core/no-animation'; import { NzSelectSearchComponent } from './select-search.component'; export class NzSelectTopControlComponent { /** * @param {?=} noAnimation */ constructor(noAnimation) { this.noAnimation = noAnimation; this.showSearch = false; this.placeHolder = null; this.open = false; this.maxTagCount = Infinity; this.autofocus = false; this.disabled = false; this.mode = 'default'; this.customTemplate = null; this.maxTagPlaceholder = null; this.removeIcon = null; this.listOfTopItem = []; this.tokenSeparators = []; this.tokenize = new EventEmitter(); this.inputValueChange = new EventEmitter(); this.animationEnd = new EventEmitter(); this.deleteItem = new EventEmitter(); this.openChange = new EventEmitter(); this.listOfSlicedItem = []; this.isShowPlaceholder = true; this.isShowSingleLabel = false; this.isComposing = false; this.inputValue = null; } /** * @return {?} */ onHostClick() { if (!this.disabled) { this.openChange.next(!this.open); } } /** * @param {?} e * @return {?} */ onHostKeydown(e) { /** @type {?} */ const inputValue = ((/** @type {?} */ (e.target))).value; if (e.keyCode === BACKSPACE && this.mode !== 'default' && !inputValue && this.listOfTopItem.length > 0) { e.preventDefault(); this.onDeleteItem(this.listOfTopItem[this.listOfTopItem.length - 1]); } } /** * @return {?} */ updateTemplateVariable() { /** @type {?} */ const isSelectedValueEmpty = this.listOfTopItem.length === 0; this.isShowPlaceholder = isSelectedValueEmpty && !this.isComposing && !this.inputValue; this.isShowSingleLabel = !isSelectedValueEmpty && !this.isComposing && !this.inputValue; } /** * @param {?} isComposing * @return {?} */ isComposingChange(isComposing) { this.isComposing = isComposing; this.updateTemplateVariable(); } /** * @param {?} value * @return {?} */ onInputValueChange(value) { if (value !== this.inputValue) { this.inputValue = value; this.updateTemplateVariable(); this.inputValueChange.emit(value); this.tokenSeparate(value, this.tokenSeparators); } } /** * @param {?} inputValue * @param {?} tokenSeparators * @return {?} */ tokenSeparate(inputValue, tokenSeparators) { /** @type {?} */ const includesSeparators = (/** * @param {?} str * @param {?} separators * @return {?} */ (str, separators) => { // tslint:disable-next-line:prefer-for-of for (let i = 0; i < separators.length; ++i) { if (str.lastIndexOf(separators[i]) > 0) { return true; } } return false; }); /** @type {?} */ const splitBySeparators = (/** * @param {?} str * @param {?} separators * @return {?} */ (str, separators) => { /** @type {?} */ const reg = new RegExp(`[${separators.join()}]`); /** @type {?} */ const array = ((/** @type {?} */ (str))).split(reg).filter((/** * @param {?} token * @return {?} */ token => token)); return [...new Set(array)]; }); if (inputValue && inputValue.length && tokenSeparators.length && this.mode !== 'default' && includesSeparators(inputValue, tokenSeparators)) { /** @type {?} */ const listOfLabel = splitBySeparators(inputValue, tokenSeparators); this.tokenize.next(listOfLabel); } } /** * @return {?} */ clearInputValue() { if (this.nzSelectSearchComponent) { this.nzSelectSearchComponent.clearInputValue(); } } /** * @return {?} */ focus() { if (this.nzSelectSearchComponent) { this.nzSelectSearchComponent.focus(); } } /** * @return {?} */ blur() { if (this.nzSelectSearchComponent) { this.nzSelectSearchComponent.blur(); } } /** * @param {?} _index * @param {?} option * @return {?} */ trackValue(_index, option) { return option.nzValue; } /** * @param {?} item * @return {?} */ onDeleteItem(item) { if (!this.disabled && !item.nzDisabled) { this.deleteItem.next(item); } } /** * @return {?} */ onAnimationEnd() { this.animationEnd.next(); } /** * @param {?} changes * @return {?} */ ngOnChanges(changes) { const { listOfTopItem, maxTagCount, customTemplate, maxTagPlaceholder } = changes; if (listOfTopItem) { this.updateTemplateVariable(); } if (listOfTopItem || maxTagCount || customTemplate || maxTagPlaceholder) { /** @type {?} */ const listOfSlicedItem = this.listOfTopItem.slice(0, this.maxTagCount).map((/** * @param {?} o * @return {?} */ o => { return { nzLabel: o.nzLabel, nzValue: o.nzValue, nzDisabled: o.nzDisabled, contentTemplateOutlet: this.customTemplate, contentTemplateOutletContext: o }; })); if (this.listOfTopItem.length > this.maxTagCount) { /** @type {?} */ const exceededLabel = `+ ${this.listOfTopItem.length - this.maxTagCount} ...`; /** @type {?} */ const listOfSelectedValue = this.listOfTopItem.map((/** * @param {?} item * @return {?} */ item => item.nzValue)); /** @type {?} */ const exceededItem = { nzLabel: exceededLabel, nzValue: '$$__nz_exceeded_item', nzDisabled: true, contentTemplateOutlet: this.maxTagPlaceholder, contentTemplateOutletContext: listOfSelectedValue.slice(this.maxTagCount) }; listOfSlicedItem.push(exceededItem); } this.listOfSlicedItem = listOfSlicedItem; } } } NzSelectTopControlComponent.decorators = [ { type: Component, args: [{ selector: 'nz-select-top-control', exportAs: 'nzSelectTopControl', preserveWhitespaces: false, animations: [zoomMotion], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, template: ` <!--single mode--> <ng-container [ngSwitch]="mode"> <ng-container *ngSwitchCase="'default'"> <nz-select-item *ngIf="isShowSingleLabel" [deletable]="false" [disabled]="false" [removeIcon]="removeIcon" [label]="listOfTopItem[0].nzLabel" [contentTemplateOutlet]="customTemplate" [contentTemplateOutletContext]="listOfTopItem[0]" ></nz-select-item> <nz-select-search [disabled]="disabled" [value]="inputValue" [showInput]="open && showSearch" [mirrorSync]="false" [autofocus]="autofocus" [focusTrigger]="open" (isComposingChange)="isComposingChange($event)" (valueChange)="onInputValueChange($event)" ></nz-select-search> </ng-container> <ng-container *ngSwitchDefault> <!--multiple or tags mode--> <nz-select-item *ngFor="let item of listOfSlicedItem; trackBy: trackValue" [@zoomMotion] [@.disabled]="noAnimation?.nzNoAnimation" [nzNoAnimation]="noAnimation?.nzNoAnimation" [removeIcon]="removeIcon" [label]="item.nzLabel" [disabled]="item.nzDisabled || disabled" [contentTemplateOutlet]="item.contentTemplateOutlet" [deletable]="true" [contentTemplateOutletContext]="item.contentTemplateOutletContext" (@zoomMotion.done)="onAnimationEnd()" (delete)="onDeleteItem(item.contentTemplateOutletContext)" > </nz-select-item> <nz-select-search [disabled]="disabled" [value]="inputValue" [autofocus]="autofocus" [showInput]="true" [mirrorSync]="true" [focusTrigger]="open" (isComposingChange)="isComposingChange($event)" (valueChange)="onInputValueChange($event)" ></nz-select-search> </ng-container> </ng-container> <nz-select-placeholder *ngIf="isShowPlaceholder" [placeholder]="placeHolder"></nz-select-placeholder> `, host: { '[class.ant-select-selector]': 'true', '(click)': 'onHostClick()', '(keydown)': 'onHostKeydown($event)' } }] } ]; /** @nocollapse */ NzSelectTopControlComponent.ctorParameters = () => [ { type: NzNoAnimationDirective, decorators: [{ type: Host }, { type: Optional }] } ]; NzSelectTopControlComponent.propDecorators = { showSearch: [{ type: Input }], placeHolder: [{ type: Input }], open: [{ type: Input }], maxTagCount: [{ type: Input }], autofocus: [{ type: Input }], disabled: [{ type: Input }], mode: [{ type: Input }], customTemplate: [{ type: Input }], maxTagPlaceholder: [{ type: Input }], removeIcon: [{ type: Input }], listOfTopItem: [{ type: Input }], tokenSeparators: [{ type: Input }], tokenize: [{ type: Output }], inputValueChange: [{ type: Output }], animationEnd: [{ type: Output }], deleteItem: [{ type: Output }], openChange: [{ type: Output }], nzSelectSearchComponent: [{ type: ViewChild, args: [NzSelectSearchComponent,] }] }; if (false) { /** @type {?} */ NzSelectTopControlComponent.prototype.showSearch; /** @type {?} */ NzSelectTopControlComponent.prototype.placeHolder; /** @type {?} */ NzSelectTopControlComponent.prototype.open; /** @type {?} */ NzSelectTopControlComponent.prototype.maxTagCount; /** @type {?} */ NzSelectTopControlComponent.prototype.autofocus; /** @type {?} */ NzSelectTopControlComponent.prototype.disabled; /** @type {?} */ NzSelectTopControlComponent.prototype.mode; /** @type {?} */ NzSelectTopControlComponent.prototype.customTemplate; /** @type {?} */ NzSelectTopControlComponent.prototype.maxTagPlaceholder; /** @type {?} */ NzSelectTopControlComponent.prototype.removeIcon; /** @type {?} */ NzSelectTopControlComponent.prototype.listOfTopItem; /** @type {?} */ NzSelectTopControlComponent.prototype.tokenSeparators; /** @type {?} */ NzSelectTopControlComponent.prototype.tokenize; /** @type {?} */ NzSelectTopControlComponent.prototype.inputValueChange; /** @type {?} */ NzSelectTopControlComponent.prototype.animationEnd; /** @type {?} */ NzSelectTopControlComponent.prototype.deleteItem; /** @type {?} */ NzSelectTopControlComponent.prototype.openChange; /** @type {?} */ NzSelectTopControlComponent.prototype.nzSelectSearchComponent; /** @type {?} */ NzSelectTopControlComponent.prototype.listOfSlicedItem; /** @type {?} */ NzSelectTopControlComponent.prototype.isShowPlaceholder; /** @type {?} */ NzSelectTopControlComponent.prototype.isShowSingleLabel; /** @type {?} */ NzSelectTopControlComponent.prototype.isComposing; /** @type {?} */ NzSelectTopControlComponent.prototype.inputValue; /** @type {?} */ NzSelectTopControlComponent.prototype.noAnimation; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0LXRvcC1jb250cm9sLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25nLXpvcnJvLWFudGQvc2VsZWN0LyIsInNvdXJjZXMiOlsic2VsZWN0LXRvcC1jb250cm9sLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUFRQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDbEQsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsWUFBWSxFQUNaLElBQUksRUFDSixLQUFLLEVBRUwsUUFBUSxFQUNSLE1BQU0sRUFHTixTQUFTLEVBQ1QsaUJBQWlCLEVBQ2xCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUV6RSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQXVFcEUsTUFBTSxPQUFPLDJCQUEyQjs7OztJQXNIdEMsWUFBdUMsV0FBb0M7UUFBcEMsZ0JBQVcsR0FBWCxXQUFXLENBQXlCO1FBckhsRSxlQUFVLEdBQUcsS0FBSyxDQUFDO1FBQ25CLGdCQUFXLEdBQTJDLElBQUksQ0FBQztRQUMzRCxTQUFJLEdBQUcsS0FBSyxDQUFDO1FBQ2IsZ0JBQVcsR0FBVyxRQUFRLENBQUM7UUFDL0IsY0FBUyxHQUFHLEtBQUssQ0FBQztRQUNsQixhQUFRLEdBQUcsS0FBSyxDQUFDO1FBQ2pCLFNBQUksR0FBcUIsU0FBUyxDQUFDO1FBQ25DLG1CQUFjLEdBQTZELElBQUksQ0FBQztRQUNoRixzQkFBaUIsR0FBbUQsSUFBSSxDQUFDO1FBQ3pFLGVBQVUsR0FBa0MsSUFBSSxDQUFDO1FBQ2pELGtCQUFhLEdBQTRCLEVBQUUsQ0FBQztRQUM1QyxvQkFBZSxHQUFhLEVBQUUsQ0FBQztRQUNyQixhQUFRLEdBQUcsSUFBSSxZ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TCxNQUFNOytCQUNOLE1BQU07MkJBQ04sTUFBTTt5QkFDTixNQUFNO3lCQUNOLE1BQU07c0NBQ04sU0FBUyxTQUFDLHVCQUF1Qjs7OztJQWpCbEMsaURBQTRCOztJQUM1QixrREFBb0U7O0lBQ3BFLDJDQUFzQjs7SUFDdEIsa0RBQXdDOztJQUN4QyxnREFBMkI7O0lBQzNCLCtDQUEwQjs7SUFDMUIsMkNBQTRDOztJQUM1QyxxREFBeUY7O0lBQ3pGLHdEQUFrRjs7SUFDbEYsaURBQTBEOztJQUMxRCxvREFBcUQ7O0lBQ3JELHNEQUF3Qzs7SUFDeEMsK0NBQTJEOztJQUMzRCx1REFBd0U7O0lBQ3hFLG1EQUEyRDs7SUFDM0QsaURBQTBFOztJQUMxRSxpREFBNEQ7O0lBQzVELDhEQUFxRjs7SUFDckYsdURBQW9EOztJQUNwRCx3REFBeUI7O0lBQ3pCLHdEQUEwQjs7SUFDMUIsa0RBQW9COztJQUNwQixpREFBaUM7O0lBK0ZyQixrREFBK0QiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgQWxpYmFiYS5jb20gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2dpdGh1Yi5jb20vTkctWk9SUk8vbmctem9ycm8tYW50ZC9ibG9iL21hc3Rlci9MSUNFTlNFXG4gKi9cblxuaW1wb3J0IHsgQkFDS1NQQUNFIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2tleWNvZGVzJztcbmltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIEV2ZW50RW1pdHRlcixcbiAgSG9zdCxcbiAgSW5wdXQsXG4gIE9uQ2hhbmdlcyxcbiAgT3B0aW9uYWwsXG4gIE91dHB1dCxcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgVGVtcGxhdGVSZWYsXG4gIFZpZXdDaGlsZCxcbiAgVmlld0VuY2Fwc3VsYXRpb25cbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyB6b29tTW90aW9uIH0gZnJvbSAnbmctem9ycm8tYW50ZC9jb3JlL2FuaW1hdGlvbic7XG5pbXBvcnQgeyBOek5vQW5pbWF0aW9uRGlyZWN0aXZlIH0gZnJvbSAnbmctem9ycm8tYW50ZC9jb3JlL25vLWFuaW1hdGlvbic7XG5pbXBvcnQgeyBOelNhZmVBbnkgfSBmcm9tICduZy16b3Jyby1hbnRkL2NvcmUvdHlwZXMnO1xuaW1wb3J0IHsgTnpTZWxlY3RTZWFyY2hDb21wb25lbnQgfSBmcm9tICcuL3NlbGVjdC1zZWFyY2guY29tcG9uZW50JztcbmltcG9ydCB7IE56U2VsZWN0SXRlbUludGVyZmFjZSwgTnpTZWxlY3RNb2RlVHlwZSwgTnpTZWxlY3RUb3BDb250cm9sSXRlbVR5cGUgfSBmcm9tICcuL3NlbGVjdC50eXBlcyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ256LXNlbGVjdC10b3AtY29udHJvbCcsXG4gIGV4cG9ydEFzOiAnbnpTZWxlY3RUb3BDb250cm9sJyxcbiAgcHJlc2VydmVXaGl0ZXNwYWNlczogZmFsc2UsXG4gIGFuaW1hdGlvbnM6IFt6b29tTW90aW9uXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIHRlbXBsYXRlOiBgXG4gICAgPCEtLXNpbmdsZSBtb2RlLS0+XG4gICAgPG5nLWNvbnRhaW5lciBbbmdTd2l0Y2hdPVwibW9kZVwiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2RlZmF1bHQnXCI+XG4gICAgICAgIDxuei1zZWxlY3QtaXRlbVxuICAgICAgICAgICpuZ0lmPVwiaXNTaG93U2luZ2xlTGFiZWxcIlxuICAgICAgICAgIFtkZWxldGFibGVdPVwiZmFsc2VcIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCJmYWxzZVwiXG4gICAgICAgICAgW3JlbW92ZUljb25dPVwicmVtb3ZlSWNvblwiXG4gICAgICAgICAgW2xhYmVsXT1cImxpc3RPZlRvcEl0ZW1bMF0ubnpMYWJlbFwiXG4gICAgICAgICAgW2NvbnRlbnRUZW1wbGF0ZU91dGxldF09XCJjdXN0b21UZW1wbGF0ZVwiXG4gICAgICAgICAgW2NvbnRlbnRUZW1wbGF0ZU91dGxldENvbnRleHRdPVwibGlzdE9mVG9wSXRlbVswXVwiXG4gICAgICAgID48L256LXNlbGVjdC1pdGVtPlxuICAgICAgICA8bnotc2VsZWN0LXNlYXJjaFxuICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICAgICAgW3ZhbHVlXT1cImlucHV0VmFsdWVcIlxuICAgICAgICAgIFtzaG93SW5wdXRdPVwib3BlbiAmJiBzaG93U2VhcmNoXCJcbiAgICAgICAgICBbbWlycm9yU3luY109XCJmYWxzZVwiXG4gICAgICAgICAgW2F1dG9mb2N1c109XCJhdXRvZm9jdXNcIlxuICAgICAgICAgIFtmb2N1c1RyaWdnZXJdPVwib3BlblwiXG4gICAgICAgICAgKGlzQ29tcG9zaW5nQ2hhbmdlKT1cImlzQ29tcG9zaW5nQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJvbklucHV0VmFsdWVDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgID48L256LXNlbGVjdC1zZWFyY2g+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoRGVmYXVsdD5cbiAgICAgICAgPCEtLW11bHRpcGxlIG9yIHRhZ3MgbW9kZS0tPlxuICAgICAgICA8bnotc2VsZWN0LWl0ZW1cbiAgICAgICAgICAqbmdGb3I9XCJsZXQgaXRlbSBvZiBsaXN0T2ZTbGljZWRJdGVtOyB0cmFja0J5OiB0cmFja1ZhbHVlXCJcbiAgICAgICAgICBbQHpvb21Nb3Rpb25dXG4gICAgICAgICAgW0AuZGlzYWJsZWRdPVwibm9BbmltYXRpb24/Lm56Tm9BbmltYXRpb25cIlxuICAgICAgICAgIFtuek5vQW5pbWF0aW9uXT1cIm5vQW5pbWF0aW9uPy5uek5vQW5pbWF0aW9uXCJcbiAgICAgICAgICBbcmVtb3ZlSWNvbl09XCJyZW1vdmVJY29uXCJcbiAgICAgICAgICBbbGFiZWxdPVwiaXRlbS5uekxhYmVsXCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiaXRlbS5uekRpc2FibGVkIHx8IGRpc2FibGVkXCJcbiAgICAgICAgICBbY29udGVudFRlbXBsYXRlT3V0bGV0XT1cIml0ZW0uY29udGVudFRlbXBsYXRlT3V0bGV0XCJcbiAgICAgICAgICBbZGVsZXRhYmxlXT1cInRydWVcIlxuICAgICAgICAgIFtjb250ZW50VGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cIml0ZW0uY29udGVudFRlbXBsYXRlT3V0bGV0Q29udGV4dFwiXG4gICAgICAgICAgKEB6b29tTW90aW9uLmRvbmUpPVwib25BbmltYXRpb25FbmQoKVwiXG4gICAgICAgICAgKGRlbGV0ZSk9XCJvbkRlbGV0ZUl0ZW0oaXRlbS5jb250ZW50VGVtcGxhdGVPdXRsZXRDb250ZXh0KVwiXG4gICAgICAgID5cbiAgICAgICAgPC9uei1zZWxlY3QtaXRlbT5cbiAgICAgICAgPG56LXNlbGVjdC1zZWFyY2hcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICAgIFt2YWx1ZV09XCJpbnB1dFZhbHVlXCJcbiAgICAgICAgICBbYXV0b2ZvY3VzXT1cImF1dG9mb2N1c1wiXG4gICAgICAgICAgW3Nob3dJbnB1dF09XCJ0cnVlXCJcbiAgICAgICAgICBbbWlycm9yU3luY109XCJ0cnVlXCJcbiAgICAgICAgICBbZm9jdXNUcmlnZ2VyXT1cIm9wZW5cIlxuICAgICAgICAgIChpc0NvbXBvc2luZ0NoYW5nZSk9XCJpc0NvbXBvc2luZ0NoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwib25JbnB1dFZhbHVlQ2hhbmdlKCRldmVudClcIlxuICAgICAgICA+PC9uei1zZWxlY3Qtc2VhcmNoPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9uZy1jb250YWluZXI+XG4gICAgPG56LXNlbGVjdC1wbGFjZWhvbGRlciAqbmdJZj1cImlzU2hvd1BsYWNlaG9sZGVyXCIgW3BsYWNlaG9sZGVyXT1cInBsYWNlSG9sZGVyXCI+PC9uei1zZWxlY3QtcGxhY2Vob2xkZXI+XG4gIGAsXG4gIGhvc3Q6IHtcbiAgICAnW2NsYXNzLmFudC1zZWxlY3Qtc2VsZWN0b3JdJzogJ3RydWUnLFxuICAgICcoY2xpY2spJzogJ29uSG9zdENsaWNrKCknLFxuICAgICcoa2V5ZG93biknOiAnb25Ib3N0S2V5ZG93bigkZXZlbnQpJ1xuICB9XG59KVxuZXhwb3J0IGNsYXNzIE56U2VsZWN0VG9wQ29udHJvbENvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcyB7XG4gIEBJbnB1dCgpIHNob3dTZWFyY2ggPSBmYWxzZTtcbiAgQElucHV0KCkgcGxhY2VIb2xkZXI6IHN0cmluZyB8IFRlbXBsYXRlUmVmPE56U2FmZUFueT4gfCBudWxsID0gbnVsbDtcbiAgQElucHV0KCkgb3BlbiA9IGZhbHNlO1xuICBASW5wdXQoKSBtYXhUYWdDb3VudDogbnVtYmVyID0gSW5maW5pdHk7XG4gIEBJbnB1dCgpIGF1dG9mb2N1cyA9IGZhbHNlO1xuICBASW5wdXQoKSBkaXNhYmxlZCA9IGZhbHNlO1xuICBASW5wdXQoKSBtb2RlOiBOelNlbGVjdE1vZGVUeXBlID0gJ2RlZmF1bHQnO1xuICBASW5wdXQoKSBjdXN0b21UZW1wbGF0ZTogVGVtcGxhdGVSZWY8eyAkaW1wbGljaXQ6IE56U2VsZWN0SXRlbUludGVyZmFjZSB9PiB8IG51bGwgPSBudWxsO1xuICBASW5wdXQoKSBtYXhUYWdQbGFjZWhvbGRlcjogVGVtcGxhdGVSZWY8eyAkaW1wbGljaXQ6IE56U2FmZUFueVtdIH0+IHwgbnVsbCA9IG51bGw7XG4gIEBJbnB1dCgpIHJlbW92ZUljb246IFRlbXBsYXRlUmVmPE56U2FmZUFueT4gfCBudWxsID0gbnVsbDtcbiAgQElucHV0KCkgbGlzdE9mVG9wSXRlbTogTnpTZWxlY3RJdGVtSW50ZXJmYWNlW10gPSBbXTtcbiAgQElucHV0KCkgdG9rZW5TZXBhcmF0b3JzOiBzdHJpbmdbXSA9IFtdO1xuICBAT3V0cHV0KCkgcmVhZG9ubHkgdG9rZW5pemUgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZ1tdPigpO1xuICBAT3V0cHV0KCkgcmVhZG9ubHkgaW5wdXRWYWx1ZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nIHwgbnVsbD4oKTtcbiAgQE91dHB1dCgpIHJlYWRvbmx5IGFuaW1hdGlvbkVuZCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQE91dHB1dCgpIHJlYWRvbmx5IGRlbGV0ZUl0ZW0gPSBuZXcgRXZlbnRFbWl0dGVyPE56U2VsZWN0SXRlbUludGVyZmFjZT4oKTtcbiAgQE91dHB1dCgpIHJlYWRvbmx5IG9wZW5DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG4gIEBWaWV3Q2hpbGQoTnpTZWxlY3RTZWFyY2hDb21wb25lbnQpIG56U2VsZWN0U2VhcmNoQ29tcG9uZW50OiBOelNlbGVjdFNlYXJjaENvbXBvbmVudDtcbiAgbGlzdE9mU2xpY2VkSXRlbTogTnpTZWxlY3RUb3BDb250cm9sSXRlbVR5cGVbXSA9IFtdO1xuICBpc1Nob3dQbGFjZWhvbGRlciA9IHRydWU7XG4gIGlzU2hvd1NpbmdsZUxhYmVsID0gZmFsc2U7XG4gIGlzQ29tcG9zaW5nID0gZmFsc2U7XG4gIGlucHV0VmFsdWU6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gIG9uSG9zdENsaWNrKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5kaXNhYmxlZCkge1xuICAgICAgdGhpcy5vcGVuQ2hhbmdlLm5leHQoIXRoaXMub3Blbik7XG4gICAgfVxuICB9XG5cbiAgb25Ib3N0S2V5ZG93bihlOiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgaW5wdXRWYWx1ZSA9IChlLnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KS52YWx1ZTtcbiAgICBpZiAoZS5rZXlDb2RlID09PSBCQUNLU1BBQ0UgJiYgdGhpcy5tb2RlICE9PSAnZGVmYXVsdCcgJiYgIWlucHV0VmFsdWUgJiYgdGhpcy5saXN0T2ZUb3BJdGVtLmxlbmd0aCA+IDApIHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHRoaXMub25EZWxldGVJdGVtKHRoaXMubGlzdE9mVG9wSXRlbVt0aGlzLmxpc3RPZlRvcEl0ZW0ubGVuZ3RoIC0gMV0pO1xuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZVRlbXBsYXRlVmFyaWFibGUoKTogdm9pZCB7XG4gICAgY29uc3QgaXNTZWxlY3RlZFZhbHVlRW1wdHkgPSB0aGlzLmxpc3RPZlRvcEl0ZW0ubGVuZ3RoID09PSAwO1xuICAgIHRoaXMuaXNTaG93UGxhY2Vob2xkZXIgPSBpc1NlbGVjdGVkVmFsdWVFbXB0eSAmJiAhdGhpcy5pc0NvbXBvc2luZyAmJiAhdGhpcy5pbnB1dFZhbHVlO1xuICAgIHRoaXMuaXNTaG93U2luZ2xlTGFiZWwgPSAhaXNTZWxlY3RlZFZhbHVlRW1wdHkgJiYgIXRoaXMuaXNDb21wb3NpbmcgJiYgIXRoaXMuaW5wdXRWYWx1ZTtcbiAgfVxuXG4gIGlzQ29tcG9zaW5nQ2hhbmdlKGlzQ29tcG9zaW5nOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5pc0NvbXBvc2luZyA9IGlzQ29tcG9zaW5nO1xuICAgIHRoaXMudXBkYXRlVGVtcGxhdGVWYXJpYWJsZSgpO1xuICB9XG5cbiAgb25JbnB1dFZhbHVlQ2hhbmdlKHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAodmFsdWUgIT09IHRoaXMuaW5wdXRWYWx1ZSkge1xuICAgICAgdGhpcy5pbnB1dFZhbHVlID0gdmFsdWU7XG4gICAgICB0aGlzLnVwZGF0ZVRlbXBsYXRlVmFyaWFibGUoKTtcbiAgICAgIHRoaXMuaW5wdXRWYWx1ZUNoYW5nZS5lbWl0KHZhbHVlKTtcbiAgICAgIHRoaXMudG9rZW5TZXBhcmF0ZSh2YWx1ZSwgdGhpcy50b2tlblNlcGFyYXRvcnMpO1xuICAgIH1cbiAgfVxuXG4gIHRva2VuU2VwYXJhdGUoaW5wdXRWYWx1ZTogc3RyaW5nLCB0b2tlblNlcGFyYXRvcnM6IHN0cmluZ1tdKTogdm9pZCB7XG4gICAgY29uc3QgaW5jbHVkZXNTZXBhcmF0b3JzID0gKHN0cjogc3RyaW5nIHwgc3RyaW5nW10sIHNlcGFyYXRvcnM6IHN0cmluZ1tdKTogYm9vbGVhbiA9PiB7XG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6cHJlZmVyLWZvci1vZlxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZXBhcmF0b3JzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGlmIChzdHIubGFzdEluZGV4T2Yoc2VwYXJhdG9yc1tpXSkgPiAwKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9O1xuICAgIGNvbnN0IHNwbGl0QnlTZXBhcmF0b3JzID0gKHN0cjogc3RyaW5nIHwgc3RyaW5nW10sIHNlcGFyYXRvcnM6IHN0cmluZ1tdKTogc3RyaW5nW10gPT4ge1xuICAgICAgY29uc3QgcmVnID0gbmV3IFJlZ0V4cChgWyR7c2VwYXJhdG9ycy5qb2luKCl9XWApO1xuICAgICAgY29uc3QgYXJyYXkgPSAoc3RyIGFzIHN0cmluZykuc3BsaXQocmVnKS5maWx0ZXIodG9rZW4gPT4gdG9rZW4pO1xuICAgICAgcmV0dXJuIFsuLi5uZXcgU2V0KGFycmF5KV07XG4gICAgfTtcbiAgICBpZiAoXG4gICAgICBpbnB1dFZhbHVlICYmXG4gICAgICBpbnB1dFZhbHVlLmxlbmd0aCAmJlxuICAgICAgdG9rZW5TZXBhcmF0b3JzLmxlbmd0aCAmJlxuICAgICAgdGhpcy5tb2RlICE9PSAnZGVmYXVsdCcgJiZcbiAgICAgIGluY2x1ZGVzU2VwYXJhdG9ycyhpbnB1dFZhbHVlLCB0b2tlblNlcGFyYXRvcnMpXG4gICAgKSB7XG4gICAgICBjb25zdCBsaXN0T2ZMYWJlbCA9IHNwbGl0QnlTZXBhcmF0b3JzKGlucHV0VmFsdWUsIHRva2VuU2VwYXJhdG9ycyk7XG4gICAgICB0aGlzLnRva2VuaXplLm5leHQobGlzdE9mTGFiZWwpO1xuICAgIH1cbiAgfVxuXG4gIGNsZWFySW5wdXRWYWx1ZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5uelNlbGVjdFNlYXJjaENvbXBvbmVudCkge1xuICAgICAgdGhpcy5uelNlbGVjdFNlYXJjaENvbXBvbmVudC5jbGVhcklucHV0VmFsdWUoKTtcbiAgICB9XG4gIH1cblxuICBmb2N1cygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5uelNlbGVjdFNlYXJjaENvbXBvbmVudCkge1xuICAgICAgdGhpcy5uelNlbGVjdFNlYXJjaENvbXBvbmVudC5mb2N1cygpO1xuICAgIH1cbiAgfVxuXG4gIGJsdXIoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMubnpTZWxlY3RTZWFyY2hDb21wb25lbnQpIHtcbiAgICAgIHRoaXMubnpTZWxlY3RTZWFyY2hDb21wb25lbnQuYmx1cigpO1xuICAgIH1cbiAgfVxuXG4gIHRyYWNrVmFsdWUoX2luZGV4OiBudW1iZXIsIG9wdGlvbjogTnpTZWxlY3RUb3BDb250cm9sSXRlbVR5cGUpOiBOelNhZmVBbnkge1xuICAgIHJldHVybiBvcHRpb24ubnpWYWx1ZTtcbiAgfVxuXG4gIG9uRGVsZXRlSXRlbShpdGVtOiBOelNlbGVjdEl0ZW1JbnRlcmZhY2UpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZGlzYWJsZWQgJiYgIWl0ZW0ubnpEaXNhYmxlZCkge1xuICAgICAgdGhpcy5kZWxldGVJdGVtLm5leHQoaXRlbSk7XG4gICAgfVxuICB9XG5cbiAgb25BbmltYXRpb25FbmQoKTogdm9pZCB7XG4gICAgdGhpcy5hbmltYXRpb25FbmQubmV4dCgpO1xuICB9XG5cbiAgY29uc3RydWN0b3IoQEhvc3QoKSBAT3B0aW9uYWwoKSBwdWJsaWMgbm9BbmltYXRpb24/OiBOek5vQW5pbWF0aW9uRGlyZWN0aXZlKSB7fVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBjb25zdCB7IGxpc3RPZlRvcEl0ZW0sIG1heFRhZ0NvdW50LCBjdXN0b21UZW1wbGF0ZSwgbWF4VGFnUGxhY2Vob2xkZXIgfSA9IGNoYW5nZXM7XG4gICAgaWYgKGxpc3RPZlRvcEl0ZW0pIHtcbiAgICAgIHRoaXMudXBkYXRlVGVtcGxhdGVWYXJpYWJsZSgpO1xuICAgIH1cbiAgICBpZiAobGlzdE9mVG9wSXRlbSB8fCBtYXhUYWdDb3VudCB8fCBjdXN0b21UZW1wbGF0ZSB8fCBtYXhUYWdQbGFjZWhvbGRlcikge1xuICAgICAgY29uc3QgbGlzdE9mU2xpY2VkSXRlbTogTnpTZWxlY3RUb3BDb250cm9sSXRlbVR5cGVbXSA9IHRoaXMubGlzdE9mVG9wSXRlbS5zbGljZSgwLCB0aGlzLm1heFRhZ0NvdW50KS5tYXAobyA9PiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbnpMYWJlbDogby5uekxhYmVsLFxuICAgICAgICAgIG56VmFsdWU6IG8ubnpWYWx1ZSxcbiAgICAgICAgICBuekRpc2FibGVkOiBvLm56RGlzYWJsZWQsXG4gICAgICAgICAgY29udGVudFRlbXBsYXRlT3V0bGV0OiB0aGlzLmN1c3RvbVRlbXBsYXRlLFxuICAgICAgICAgIGNvbnRlbnRUZW1wbGF0ZU91dGxldENvbnRleHQ6IG9cbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICAgICAgaWYgKHRoaXMubGlzdE9mVG9wSXRlbS5sZW5ndGggPiB0aGlzLm1heFRhZ0NvdW50KSB7XG4gICAgICAgIGNvbnN0IGV4Y2VlZGVkTGFiZWwgPSBgKyAke3RoaXMubGlzdE9mVG9wSXRlbS5sZW5ndGggLSB0aGlzLm1heFRhZ0NvdW50fSAuLi5gO1xuICAgICAgICBjb25zdCBsaXN0T2ZTZWxlY3RlZFZhbHVlID0gdGhpcy5saXN0T2ZUb3BJdGVtLm1hcChpdGVtID0+IGl0ZW0ubnpWYWx1ZSk7XG4gICAgICAgIGNvbnN0IGV4Y2VlZGVkSXRlbSA9IHtcbiAgICAgICAgICBuekxhYmVsOiBleGNlZWRlZExhYmVsLFxuICAgICAgICAgIG56VmFsdWU6ICckJF9fbnpfZXhjZWVkZWRfaXRlbScsXG4gICAgICAgICAgbnpEaXNhYmxlZDogdHJ1ZSxcbiAgICAgICAgICBjb250ZW50VGVtcGxhdGVPdXRsZXQ6IHRoaXMubWF4VGFnUGxhY2Vob2xkZXIsXG4gICAgICAgICAgY29udGVudFRlbXBsYXRlT3V0bGV0Q29udGV4dDogbGlzdE9mU2VsZWN0ZWRWYWx1ZS5zbGljZSh0aGlzLm1heFRhZ0NvdW50KVxuICAgICAgICB9O1xuICAgICAgICBsaXN0T2ZTbGljZWRJdGVtLnB1c2goZXhjZWVkZWRJdGVtKTtcbiAgICAgIH1cbiAgICAgIHRoaXMubGlzdE9mU2xpY2VkSXRlbSA9IGxpc3RPZlNsaWNlZEl0ZW07XG4gICAgfVxuICB9XG59XG4iXX0=