@gmerabishvili/ngx-picklist
Version:
Angular picklist component
272 lines • 52.3 kB
JavaScript
import { Component, EventEmitter, Input, Output } from '@angular/core';
import { moveItemInArray, transferArrayItem } from "@angular/cdk/drag-drop";
import * as i0 from "@angular/core";
import * as i1 from "@angular/common";
import * as i2 from "@angular/cdk/drag-drop";
export class NgxPicklistComponent {
constructor() {
this.selectedItemsSource = [];
this.selectedItemsTarget = [];
this.SOURCE_LIST = -1;
this.TARGET_LIST = 1;
this.showControls = true;
this.showResetControl = false;
this.disabled = false;
this.dragdropDisabled = false;
this.trackBy = (index, item) => item;
this.movedToTarget = new EventEmitter();
this.movedAllToTarget = new EventEmitter();
this.movedToSource = new EventEmitter();
this.movedAllToSource = new EventEmitter();
this.targetReordered = new EventEmitter();
this.sourceReordered = new EventEmitter();
this.targetSelected = new EventEmitter();
this.sourceSelected = new EventEmitter();
this.reset = new EventEmitter();
}
ngOnInit() {
}
// Controls
moveToTarget() {
if (this.selectedItemsSource && this.selectedItemsSource.length) {
for (let i = 0; i < this.selectedItemsSource.length; i++) {
let selectedItem = this.selectedItemsSource[i];
if (this.findIndexInList(selectedItem, this.target) == -1) {
this.target.push(this.source.splice(this.findIndexInList(selectedItem, this.source), 1)[0]);
}
}
this.movedToTarget.emit({
items: this.selectedItemsSource
});
this.selectedItemsSource = [];
}
}
moveAllToTarget() {
if (this.source) {
let movedItems = [];
for (let i = 0; i < this.source.length; i++) {
let removedItem = this.source.splice(i, 1)[0];
this.target.push(removedItem);
movedItems.push(removedItem);
i--;
}
this.movedAllToTarget.emit({
items: movedItems
});
this.selectedItemsSource = [];
}
}
moveToSource() {
if (this.selectedItemsTarget && this.selectedItemsTarget.length) {
for (let i = 0; i < this.selectedItemsTarget.length; i++) {
let selectedItem = this.selectedItemsTarget[i];
if (this.findIndexInList(selectedItem, this.source) == -1) {
this.source.push(this.target.splice(this.findIndexInList(selectedItem, this.target), 1)[0]);
}
}
this.movedToSource.emit({
items: this.selectedItemsTarget
});
this.selectedItemsTarget = [];
}
}
moveAllToSource() {
if (this.target) {
let movedItems = [];
for (let i = 0; i < this.target.length; i++) {
let removedItem = this.target.splice(i, 1)[0];
this.source.push(removedItem);
movedItems.push(removedItem);
i--;
}
this.movedAllToSource.emit({
items: movedItems
});
this.selectedItemsTarget = [];
}
}
resetItems() {
this.reset.emit();
}
// Events
onItemClick(event, item, selectedItems, callback) {
if (this.disabled) {
return;
}
let index = this.findIndexInSelection(item, selectedItems);
let selected = (index != -1);
let metaKey = (event.metaKey || event.ctrlKey || event.shiftKey);
if (selected && metaKey) {
selectedItems.splice(index, 1);
}
else {
if (!metaKey) {
selectedItems.length = 0;
}
selectedItems.push(item);
}
callback.emit({ originalEvent: event, items: selectedItems });
}
onItemKeydown(event, item, selectedItems, callback) {
let listItem = event.currentTarget;
switch (event.which) {
//down
case 40:
var nextItem = listItem.nextElementSibling;
if (nextItem) {
nextItem.focus();
}
event.preventDefault();
break;
//up
case 38:
var prevItem = listItem.previousElementSibling;
if (prevItem) {
prevItem.focus();
}
event.preventDefault();
break;
//enter
case 13:
this.onItemClick(event, item, selectedItems, callback);
event.preventDefault();
break;
}
}
onSourceItemDblClick() {
if (this.disabled) {
return;
}
this.moveToTarget();
}
onTargetItemDblClick() {
if (this.disabled) {
return;
}
this.moveToSource();
}
// Drag n Drop
onDrop(event, listType) {
const isTransfer = event.previousContainer !== event.container;
if (listType === this.SOURCE_LIST) {
if (isTransfer) {
transferArrayItem(event.previousContainer.data, event.container.data, event.previousIndex, event.currentIndex);
let selectedItemIndex = this.findIndexInList(event.item.data, this.selectedItemsTarget);
if (selectedItemIndex != -1) {
this.selectedItemsTarget.splice(selectedItemIndex, 1);
}
this.movedToSource.emit({ items: [event.item.data] });
}
else {
moveItemInArray(event.container.data, event.previousIndex, event.currentIndex);
this.sourceReordered.emit({ items: [event.item.data] });
}
}
else {
if (isTransfer) {
transferArrayItem(event.previousContainer.data, event.container.data, event.previousIndex, event.currentIndex);
let selectedItemIndex = this.findIndexInList(event.item.data, this.selectedItemsSource);
if (selectedItemIndex != -1) {
this.selectedItemsSource.splice(selectedItemIndex, 1);
}
this.movedToTarget.emit({ items: [event.item.data] });
}
else {
moveItemInArray(event.container.data, event.previousIndex, event.currentIndex);
this.targetReordered.emit({ items: [event.item.data] });
}
}
}
// Validations
sourceMoveDisabled() {
if (this.disabled || !this.selectedItemsSource.length) {
return true;
}
}
moveToTargetDisabled() {
return this.disabled || this.isEmpty(this.selectedItemsSource);
}
moveAllToTargetDisabled() {
return this.disabled || this.isEmpty(this.source);
}
moveToSourceDisabled() {
return this.disabled || this.isEmpty(this.selectedItemsTarget);
}
moveAllToSourceDisabled() {
return this.disabled || this.isEmpty(this.target);
}
resetDisabled() {
return this.disabled;
}
// Utils
isSelected(item, selectedItems) {
return this.findIndexInSelection(item, selectedItems) != -1;
}
findIndexInSelection(item, selectedItems) {
return this.findIndexInList(item, selectedItems);
}
findIndexInList(item, list) {
let index = -1;
if (list) {
for (let i = 0; i < list.length; i++) {
if (list[i] == item) {
index = i;
break;
}
}
}
return index;
}
isEmpty(value) {
return (value === null || value === undefined || value === '' ||
(Array.isArray(value) && value.length === 0) ||
(!(value instanceof Date) && typeof value === 'object' && Object.keys(value).length === 0));
}
}
NgxPicklistComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.4", ngImport: i0, type: NgxPicklistComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
NgxPicklistComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.4", type: NgxPicklistComponent, selector: "ngx-picklist", inputs: { source: "source", target: "target", sourceHeaderTemplate: "sourceHeaderTemplate", targetHeaderTemplate: "targetHeaderTemplate", itemTemplate: "itemTemplate", showControls: "showControls", showResetControl: "showResetControl", styleClass: "styleClass", disabled: "disabled", dragdropDisabled: "dragdropDisabled", trackBy: "trackBy" }, outputs: { movedToTarget: "movedToTarget", movedAllToTarget: "movedAllToTarget", movedToSource: "movedToSource", movedAllToSource: "movedAllToSource", targetReordered: "targetReordered", sourceReordered: "sourceReordered", targetSelected: "targetSelected", sourceSelected: "sourceSelected", reset: "reset" }, ngImport: i0, template: "<div class=\"ngx-picklist\" [class]=\"styleClass\" cdkDropListGroup>\n <div class=\"ngx-picklist-list-wrapper source-wrapper\">\n <div class=\"ngx-picklist-header\" *ngIf=\"sourceHeaderTemplate\">\n <ng-container *ngTemplateOutlet=\"sourceHeaderTemplate\"></ng-container>\n </div>\n <ul class=\"ngx-picklist-list source\"\n cdkDropList\n [cdkDropListData]=\"source\"\n (cdkDropListDropped)=\"onDrop($event, SOURCE_LIST)\"\n role=\"listbox\"\n aria-multiselectable=\"multiple\">\n <ng-template ngFor let-item [ngForOf]=\"source\" [ngForTrackBy]=\"trackBy\" let-i=\"index\">\n <li\n [ngClass]=\"{'ngx-picklist-item':true, 'highlight':isSelected(item,selectedItemsSource), 'disabled': disabled}\"\n cdkDrag [cdkDragData]=\"item\" [cdkDragDisabled]=\"dragdropDisabled || disabled\"\n (click)=\"onItemClick($event, item, selectedItemsSource, sourceSelected)\"\n (dblclick)=\"onSourceItemDblClick()\"\n (keydown)=\"onItemKeydown($event, item, selectedItemsSource, sourceSelected)\"\n tabindex=\"0\" role=\"option\"\n [attr.aria-selected]=\"isSelected(item, selectedItemsSource)\">\n <ng-container *ngTemplateOutlet=\"itemTemplate; context: {$implicit: item, index: i}\"></ng-container>\n </li>\n </ng-template>\n </ul>\n </div>\n\n <div class=\"ngx-picklist-buttons\" *ngIf=\"showControls\">\n <button type=\"button\" class=\"move-to-target\" aria-label=\"Move to target\"\n [disabled]=\"moveToTargetDisabled()\"\n (click)=\"moveToTarget()\">\n <i class=\"material-icons\" aria-label=\"chevron_right\">chevron_right</i>\n </button>\n <button type=\"button\" class=\"move-all-to-target\" aria-label=\"Move all to target\"\n [disabled]=\"moveAllToTargetDisabled()\"\n (click)=\"moveAllToTarget()\">\n <i class=\"material-icons\" aria-label=\"chevron_right\">keyboard_double_arrow_right</i>\n </button>\n <button type=\"button\" class=\"move-to-source\" aria-label=\"Move to source\"\n [disabled]=\"moveToSourceDisabled()\"\n (click)=\"moveToSource()\">\n <i class=\"material-icons\" aria-label=\"chevron_right\">chevron_left</i>\n </button>\n <button type=\"button\" class=\"move-all-to-source\" aria-label=\"Move all to source\"\n [disabled]=\"moveAllToSourceDisabled()\"\n (click)=\"moveAllToSource()\">\n <i class=\"material-icons\" aria-label=\"chevron_right\">keyboard_double_arrow_left</i>\n </button>\n <button type=\"button\" class=\"reset\" aria-label=\"Reset\" *ngIf=\"showResetControl\"\n [disabled]=\"resetDisabled()\"\n (click)=\"resetItems()\">\n <i class=\"material-icons\" aria-label=\"refresh\">refresh</i>\n </button>\n </div>\n\n <div class=\"ngx-picklist-list-wrapper target-wrapper\">\n <div class=\"ngx-picklist-header\" *ngIf=\"targetHeaderTemplate\">\n <ng-container *ngTemplateOutlet=\"targetHeaderTemplate\"></ng-container>\n </div>\n <ul class=\"ngx-picklist-list target\"\n cdkDropList\n [cdkDropListData]=\"target\"\n (cdkDropListDropped)=\"onDrop($event, TARGET_LIST)\"\n role=\"listbox\"\n aria-multiselectable=\"multiple\">\n <ng-template ngFor let-item [ngForOf]=\"target\" [ngForTrackBy]=\"trackBy\" let-i=\"index\">\n <li\n [ngClass]=\"{'ngx-picklist-item':true, 'highlight':isSelected(item, selectedItemsTarget),'disabled': disabled}\"\n cdkDrag [cdkDragData]=\"item\" [cdkDragDisabled]=\"dragdropDisabled || disabled\"\n (click)=\"onItemClick($event, item, selectedItemsTarget, targetSelected)\"\n (dblclick)=\"onTargetItemDblClick()\"\n (keydown)=\"onItemKeydown($event, item, selectedItemsTarget, targetSelected)\"\n tabindex=\"0\" role=\"option\"\n [attr.aria-selected]=\"isSelected(item, selectedItemsTarget)\">\n <ng-container *ngTemplateOutlet=\"itemTemplate; context: {$implicit: item, index: i}\"></ng-container>\n </li>\n </ng-template>\n </ul>\n </div>\n</div>\n", styles: ["@import\"https://fonts.googleapis.com/icon?family=Material+Icons\";.ngx-picklist{display:flex}.ngx-picklist .ngx-picklist-list-wrapper{flex:1 1 50%}.ngx-picklist .ngx-picklist-list-wrapper.source-wrapper{margin-right:20px}.ngx-picklist .ngx-picklist-list-wrapper.target-wrapper{margin-left:20px}.ngx-picklist .ngx-picklist-list{list-style-type:none;background:#ffffff;border:1px solid #dee2e6;padding:.75rem 0;border-bottom-right-radius:6px;border-bottom-left-radius:6px;margin:0;height:30rem;min-height:12rem;overflow:auto}.ngx-picklist .ngx-picklist-buttons{display:flex;flex-direction:column;justify-content:center}.ngx-picklist .ngx-picklist-buttons button{color:#fff;background:#306bff;border:1px solid #306bff;padding:.3rem .4rem;border-radius:6px;margin-bottom:.5rem;cursor:pointer}.ngx-picklist .ngx-picklist-buttons button.reset{background:#f44336;border:1px solid #f44336}.ngx-picklist .ngx-picklist-buttons button.reset:hover:not(:disabled){background:#ea1c0d;color:#fff}.ngx-picklist .ngx-picklist-buttons button:hover:not(:disabled,.reset){background:#0048fc;color:#fff}.ngx-picklist .ngx-picklist-buttons button:disabled{opacity:.6;cursor:default}.ngx-picklist .ngx-picklist-item{display:flex;flex-direction:row;align-items:center;justify-content:space-between;padding:.75rem 1.25rem;margin:0;color:#495057;background:#ffffff;overflow:hidden;box-sizing:border-box}.ngx-picklist .ngx-picklist-item:hover:not(.disabled,.highlight){background:#e9ecef;color:#495057}.ngx-picklist .ngx-picklist-item.disabled{opacity:.6}.ngx-picklist .ngx-picklist-item.highlight{color:#306bff;background:#EFF6FF}.ngx-picklist-list.cdk-drop-list-dragging .ngx-picklist-item:not(.cdk-drag-placeholder){transition:transform .25s cubic-bezier(0,0,.2,1)}.ngx-picklist-item:not(.cdk-drag-disabled){cursor:move}.cdk-drag-placeholder{opacity:0}.cdk-drag-animating{transition:transform .25s cubic-bezier(0,0,.2,1)}.cdk-drag-preview{list-style:none;padding:.75rem 1.25rem;margin:0;box-sizing:border-box;border-radius:4px;box-shadow:0 5px 5px -3px #0003,0 8px 10px 1px #00000024,0 3px 14px 2px #0000001f}\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"] }, { kind: "directive", type: i2.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i2.CdkDropListGroup, selector: "[cdkDropListGroup]", inputs: ["cdkDropListGroupDisabled"], exportAs: ["cdkDropListGroup"] }, { kind: "directive", type: i2.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }] });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.4", ngImport: i0, type: NgxPicklistComponent, decorators: [{
type: Component,
args: [{ selector: 'ngx-picklist', template: "<div class=\"ngx-picklist\" [class]=\"styleClass\" cdkDropListGroup>\n <div class=\"ngx-picklist-list-wrapper source-wrapper\">\n <div class=\"ngx-picklist-header\" *ngIf=\"sourceHeaderTemplate\">\n <ng-container *ngTemplateOutlet=\"sourceHeaderTemplate\"></ng-container>\n </div>\n <ul class=\"ngx-picklist-list source\"\n cdkDropList\n [cdkDropListData]=\"source\"\n (cdkDropListDropped)=\"onDrop($event, SOURCE_LIST)\"\n role=\"listbox\"\n aria-multiselectable=\"multiple\">\n <ng-template ngFor let-item [ngForOf]=\"source\" [ngForTrackBy]=\"trackBy\" let-i=\"index\">\n <li\n [ngClass]=\"{'ngx-picklist-item':true, 'highlight':isSelected(item,selectedItemsSource), 'disabled': disabled}\"\n cdkDrag [cdkDragData]=\"item\" [cdkDragDisabled]=\"dragdropDisabled || disabled\"\n (click)=\"onItemClick($event, item, selectedItemsSource, sourceSelected)\"\n (dblclick)=\"onSourceItemDblClick()\"\n (keydown)=\"onItemKeydown($event, item, selectedItemsSource, sourceSelected)\"\n tabindex=\"0\" role=\"option\"\n [attr.aria-selected]=\"isSelected(item, selectedItemsSource)\">\n <ng-container *ngTemplateOutlet=\"itemTemplate; context: {$implicit: item, index: i}\"></ng-container>\n </li>\n </ng-template>\n </ul>\n </div>\n\n <div class=\"ngx-picklist-buttons\" *ngIf=\"showControls\">\n <button type=\"button\" class=\"move-to-target\" aria-label=\"Move to target\"\n [disabled]=\"moveToTargetDisabled()\"\n (click)=\"moveToTarget()\">\n <i class=\"material-icons\" aria-label=\"chevron_right\">chevron_right</i>\n </button>\n <button type=\"button\" class=\"move-all-to-target\" aria-label=\"Move all to target\"\n [disabled]=\"moveAllToTargetDisabled()\"\n (click)=\"moveAllToTarget()\">\n <i class=\"material-icons\" aria-label=\"chevron_right\">keyboard_double_arrow_right</i>\n </button>\n <button type=\"button\" class=\"move-to-source\" aria-label=\"Move to source\"\n [disabled]=\"moveToSourceDisabled()\"\n (click)=\"moveToSource()\">\n <i class=\"material-icons\" aria-label=\"chevron_right\">chevron_left</i>\n </button>\n <button type=\"button\" class=\"move-all-to-source\" aria-label=\"Move all to source\"\n [disabled]=\"moveAllToSourceDisabled()\"\n (click)=\"moveAllToSource()\">\n <i class=\"material-icons\" aria-label=\"chevron_right\">keyboard_double_arrow_left</i>\n </button>\n <button type=\"button\" class=\"reset\" aria-label=\"Reset\" *ngIf=\"showResetControl\"\n [disabled]=\"resetDisabled()\"\n (click)=\"resetItems()\">\n <i class=\"material-icons\" aria-label=\"refresh\">refresh</i>\n </button>\n </div>\n\n <div class=\"ngx-picklist-list-wrapper target-wrapper\">\n <div class=\"ngx-picklist-header\" *ngIf=\"targetHeaderTemplate\">\n <ng-container *ngTemplateOutlet=\"targetHeaderTemplate\"></ng-container>\n </div>\n <ul class=\"ngx-picklist-list target\"\n cdkDropList\n [cdkDropListData]=\"target\"\n (cdkDropListDropped)=\"onDrop($event, TARGET_LIST)\"\n role=\"listbox\"\n aria-multiselectable=\"multiple\">\n <ng-template ngFor let-item [ngForOf]=\"target\" [ngForTrackBy]=\"trackBy\" let-i=\"index\">\n <li\n [ngClass]=\"{'ngx-picklist-item':true, 'highlight':isSelected(item, selectedItemsTarget),'disabled': disabled}\"\n cdkDrag [cdkDragData]=\"item\" [cdkDragDisabled]=\"dragdropDisabled || disabled\"\n (click)=\"onItemClick($event, item, selectedItemsTarget, targetSelected)\"\n (dblclick)=\"onTargetItemDblClick()\"\n (keydown)=\"onItemKeydown($event, item, selectedItemsTarget, targetSelected)\"\n tabindex=\"0\" role=\"option\"\n [attr.aria-selected]=\"isSelected(item, selectedItemsTarget)\">\n <ng-container *ngTemplateOutlet=\"itemTemplate; context: {$implicit: item, index: i}\"></ng-container>\n </li>\n </ng-template>\n </ul>\n </div>\n</div>\n", styles: ["@import\"https://fonts.googleapis.com/icon?family=Material+Icons\";.ngx-picklist{display:flex}.ngx-picklist .ngx-picklist-list-wrapper{flex:1 1 50%}.ngx-picklist .ngx-picklist-list-wrapper.source-wrapper{margin-right:20px}.ngx-picklist .ngx-picklist-list-wrapper.target-wrapper{margin-left:20px}.ngx-picklist .ngx-picklist-list{list-style-type:none;background:#ffffff;border:1px solid #dee2e6;padding:.75rem 0;border-bottom-right-radius:6px;border-bottom-left-radius:6px;margin:0;height:30rem;min-height:12rem;overflow:auto}.ngx-picklist .ngx-picklist-buttons{display:flex;flex-direction:column;justify-content:center}.ngx-picklist .ngx-picklist-buttons button{color:#fff;background:#306bff;border:1px solid #306bff;padding:.3rem .4rem;border-radius:6px;margin-bottom:.5rem;cursor:pointer}.ngx-picklist .ngx-picklist-buttons button.reset{background:#f44336;border:1px solid #f44336}.ngx-picklist .ngx-picklist-buttons button.reset:hover:not(:disabled){background:#ea1c0d;color:#fff}.ngx-picklist .ngx-picklist-buttons button:hover:not(:disabled,.reset){background:#0048fc;color:#fff}.ngx-picklist .ngx-picklist-buttons button:disabled{opacity:.6;cursor:default}.ngx-picklist .ngx-picklist-item{display:flex;flex-direction:row;align-items:center;justify-content:space-between;padding:.75rem 1.25rem;margin:0;color:#495057;background:#ffffff;overflow:hidden;box-sizing:border-box}.ngx-picklist .ngx-picklist-item:hover:not(.disabled,.highlight){background:#e9ecef;color:#495057}.ngx-picklist .ngx-picklist-item.disabled{opacity:.6}.ngx-picklist .ngx-picklist-item.highlight{color:#306bff;background:#EFF6FF}.ngx-picklist-list.cdk-drop-list-dragging .ngx-picklist-item:not(.cdk-drag-placeholder){transition:transform .25s cubic-bezier(0,0,.2,1)}.ngx-picklist-item:not(.cdk-drag-disabled){cursor:move}.cdk-drag-placeholder{opacity:0}.cdk-drag-animating{transition:transform .25s cubic-bezier(0,0,.2,1)}.cdk-drag-preview{list-style:none;padding:.75rem 1.25rem;margin:0;box-sizing:border-box;border-radius:4px;box-shadow:0 5px 5px -3px #0003,0 8px 10px 1px #00000024,0 3px 14px 2px #0000001f}\n"] }]
}], ctorParameters: function () { return []; }, propDecorators: { source: [{
type: Input
}], target: [{
type: Input
}], sourceHeaderTemplate: [{
type: Input
}], targetHeaderTemplate: [{
type: Input
}], itemTemplate: [{
type: Input
}], showControls: [{
type: Input
}], showResetControl: [{
type: Input
}], styleClass: [{
type: Input
}], disabled: [{
type: Input
}], dragdropDisabled: [{
type: Input
}], trackBy: [{
type: Input
}], movedToTarget: [{
type: Output
}], movedAllToTarget: [{
type: Output
}], movedToSource: [{
type: Output
}], movedAllToSource: [{
type: Output
}], targetReordered: [{
type: Output
}], sourceReordered: [{
type: Output
}], targetSelected: [{
type: Output
}], sourceSelected: [{
type: Output
}], reset: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LXBpY2tsaXN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1waWNrbGlzdC9zcmMvbGliL25neC1waWNrbGlzdC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtcGlja2xpc3Qvc3JjL2xpYi9uZ3gtcGlja2xpc3QuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBYyxNQUFNLGVBQWUsQ0FBQztBQUMxRixPQUFPLEVBQWMsZUFBZSxFQUFFLGlCQUFpQixFQUFDLE1BQU0sd0JBQXdCLENBQUM7Ozs7QUFPdkYsTUFBTSxPQUFPLG9CQUFvQjtJQXNDL0I7UUFyQ0Esd0JBQW1CLEdBQVUsRUFBRSxDQUFDO1FBQ2hDLHdCQUFtQixHQUFVLEVBQUUsQ0FBQztRQUV2QixnQkFBVyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ2pCLGdCQUFXLEdBQUcsQ0FBQyxDQUFDO1FBU2hCLGlCQUFZLEdBQVksSUFBSSxDQUFDO1FBQzdCLHFCQUFnQixHQUFZLEtBQUssQ0FBQztRQUlsQyxhQUFRLEdBQVksS0FBSyxDQUFDO1FBQzFCLHFCQUFnQixHQUFZLEtBQUssQ0FBQztRQUVsQyxZQUFPLEdBQVEsQ0FBQyxLQUFhLEVBQUUsSUFBUyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUM7UUFFakQsa0JBQWEsR0FBc0IsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUN0RCxxQkFBZ0IsR0FBc0IsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUV6RCxrQkFBYSxHQUFzQixJQUFJLFlBQVksRUFBRSxDQUFDO1FBQ3RELHFCQUFnQixHQUFzQixJQUFJLFlBQVksRUFBRSxDQUFDO1FBRXpELG9CQUFlLEdBQXNCLElBQUksWUFBWSxFQUFFLENBQUM7UUFDeEQsb0JBQWUsR0FBc0IsSUFBSSxZ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LGdCQUFnQjtzQkFBekIsTUFBTTtnQkFFRyxhQUFhO3NCQUF0QixNQUFNO2dCQUNHLGdCQUFnQjtzQkFBekIsTUFBTTtnQkFFRyxlQUFlO3NCQUF4QixNQUFNO2dCQUNHLGVBQWU7c0JBQXhCLE1BQU07Z0JBRUcsY0FBYztzQkFBdkIsTUFBTTtnQkFDRyxjQUFjO3NCQUF2QixNQUFNO2dCQUVHLEtBQUs7c0JBQWQsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Q29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkluaXQsIE91dHB1dCwgVGVtcGxhdGVSZWZ9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtDZGtEcmFnRHJvcCwgbW92ZUl0ZW1JbkFycmF5LCB0cmFuc2ZlckFycmF5SXRlbX0gZnJvbSBcIkBhbmd1bGFyL2Nkay9kcmFnLWRyb3BcIjtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbmd4LXBpY2tsaXN0JyxcbiAgdGVtcGxhdGVVcmw6ICcuL25neC1waWNrbGlzdC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL25neC1waWNrbGlzdC5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIE5neFBpY2tsaXN0Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgc2VsZWN0ZWRJdGVtc1NvdXJjZTogYW55W10gPSBbXTtcbiAgc2VsZWN0ZWRJdGVtc1RhcmdldDogYW55W10gPSBbXTtcblxuICByZWFkb25seSBTT1VSQ0VfTElTVCA9IC0xO1xuICByZWFkb25seSBUQVJHRVRfTElTVCA9IDE7XG5cbiAgQElucHV0KCkgc291cmNlITogYW55W107XG4gIEBJbnB1dCgpIHRhcmdldCE6IGFueVtdO1xuXG4gIEBJbnB1dCgpIHNvdXJjZUhlYWRlclRlbXBsYXRlITogVGVtcGxhdGVSZWY8YW55PjtcbiAgQElucHV0KCkgdGFyZ2V0SGVhZGVyVGVtcGxhdGUhOiBUZW1wbGF0ZVJlZjxhbnk+O1xuICBASW5wdXQoKSBpdGVtVGVtcGxhdGUhOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gIEBJbnB1dCgpIHNob3dDb250cm9sczogYm9vbGVhbiA9IHRydWU7XG4gIEBJbnB1dCgpIHNob3dSZXNldENvbnRyb2w6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBASW5wdXQoKSBzdHlsZUNsYXNzITogc3RyaW5nO1xuXG4gIEBJbnB1dCgpIGRpc2FibGVkOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIGRyYWdkcm9wRGlzYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBASW5wdXQoKSB0cmFja0J5OiBhbnkgPSAoaW5kZXg6IG51bWJlciwgaXRlbTogYW55KSA9PiBpdGVtO1xuXG4gIEBPdXRwdXQoKSBtb3ZlZFRvVGFyZ2V0OiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIG1vdmVkQWxsVG9UYXJnZXQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIEBPdXRwdXQoKSBtb3ZlZFRvU291cmNlOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIG1vdmVkQWxsVG9Tb3VyY2U6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIEBPdXRwdXQoKSB0YXJnZXRSZW9yZGVyZWQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgc291cmNlUmVvcmRlcmVkOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBAT3V0cHV0KCkgdGFyZ2V0U2VsZWN0ZWQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgc291cmNlU2VsZWN0ZWQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIEBPdXRwdXQoKSByZXNldDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgfVxuXG4gIC8vIENvbnRyb2xzXG5cbiAgbW92ZVRvVGFyZ2V0KCkge1xuICAgIGlmICh0aGlzLnNlbGVjdGVkSXRlbXNTb3VyY2UgJiYgdGhpcy5zZWxlY3RlZEl0ZW1zU291cmNlLmxlbmd0aCkge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnNlbGVjdGVkSXRlbXNTb3VyY2UubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbGV0IHNlbGVjdGVkSXRlbSA9IHRoaXMuc2VsZWN0ZWRJdGVtc1NvdXJjZVtpXTtcbiAgICAgICAgaWYgKHRoaXMuZmluZEluZGV4SW5MaXN0KHNlbGVjdGVkSXRlbSwgdGhpcy50YXJnZXQpID09IC0xKSB7XG4gICAgICAgICAgdGhpcy50YXJnZXQucHVzaCh0aGlzLnNvdXJjZS5zcGxpY2UodGhpcy5maW5kSW5kZXhJbkxpc3Qoc2VsZWN0ZWRJdGVtLCB0aGlzLnNvdXJjZSksIDEpWzBdKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0aGlzLm1vdmVkVG9UYXJnZXQuZW1pdCh7XG4gICAgICAgIGl0ZW1zOiB0aGlzLnNlbGVjdGVkSXRlbXNTb3VyY2VcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLnNlbGVjdGVkSXRlbXNTb3VyY2UgPSBbXTtcbiAgICB9XG4gIH1cblxuICBtb3ZlQWxsVG9UYXJnZXQoKSB7XG4gICAgaWYgKHRoaXMuc291cmNlKSB7XG4gICAgICBsZXQgbW92ZWRJdGVtcyA9IFtdO1xuXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc291cmNlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGxldCByZW1vdmVkSXRlbSA9IHRoaXMuc291cmNlLnNwbGljZShpLCAxKVswXTtcbiAgICAgICAgdGhpcy50YXJnZXQucHVzaChyZW1vdmVkSXRlbSk7XG4gICAgICAgIG1vdmVkSXRlbXMucHVzaChyZW1vdmVkSXRlbSk7XG4gICAgICAgIGktLTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5tb3ZlZEFsbFRvVGFyZ2V0LmVtaXQoe1xuICAgICAgICBpdGVtczogbW92ZWRJdGVtc1xuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtc1NvdXJjZSA9IFtdO1xuICAgIH1cbiAgfVxuXG4gIG1vdmVUb1NvdXJjZSgpIHtcbiAgICBpZiAodGhpcy5zZWxlY3RlZEl0ZW1zVGFyZ2V0ICYmIHRoaXMuc2VsZWN0ZWRJdGVtc1RhcmdldC5sZW5ndGgpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5zZWxlY3RlZEl0ZW1zVGFyZ2V0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGxldCBzZWxlY3RlZEl0ZW0gPSB0aGlzLnNlbGVjdGVkSXRlbXNUYXJnZXRbaV07XG4gICAgICAgIGlmICh0aGlzLmZpbmRJbmRleEluTGlzdChzZWxlY3RlZEl0ZW0sIHRoaXMuc291cmNlKSA9PSAtMSkge1xuICAgICAgICAgIHRoaXMuc291cmNlLnB1c2godGhpcy50YXJnZXQuc3BsaWNlKHRoaXMuZmluZEluZGV4SW5MaXN0KHNlbGVjdGVkSXRlbSwgdGhpcy50YXJnZXQpLCAxKVswXSk7XG5cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0aGlzLm1vdmVkVG9Tb3VyY2UuZW1pdCh7XG4gICAgICAgIGl0ZW1zOiB0aGlzLnNlbGVjdGVkSXRlbXNUYXJnZXRcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLnNlbGVjdGVkSXRlbXNUYXJnZXQgPSBbXTtcbiAgICB9XG4gIH1cblxuICBtb3ZlQWxsVG9Tb3VyY2UoKSB7XG4gICAgaWYgKHRoaXMudGFyZ2V0KSB7XG4gICAgICBsZXQgbW92ZWRJdGVtcyA9IFtdO1xuXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMudGFyZ2V0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGxldCByZW1vdmVkSXRlbSA9IHRoaXMudGFyZ2V0LnNwbGljZShpLCAxKVswXTtcbiAgICAgICAgdGhpcy5zb3VyY2UucHVzaChyZW1vdmVkSXRlbSk7XG4gICAgICAgIG1vdmVkSXRlbXMucHVzaChyZW1vdmVkSXRlbSk7XG4gICAgICAgIGktLTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5tb3ZlZEFsbFRvU291cmNlLmVtaXQoe1xuICAgICAgICBpdGVtczogbW92ZWRJdGVtc1xuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtc1RhcmdldCA9IFtdO1xuICAgIH1cbiAgfVxuXG4gIHJlc2V0SXRlbXMoKSB7XG4gICAgdGhpcy5yZXNldC5lbWl0KCk7XG4gIH1cblxuICAvLyBFdmVudHNcblxuICBvbkl0ZW1DbGljayhldmVudDogYW55LCBpdGVtOiBhbnksIHNlbGVjdGVkSXRlbXM6IGFueVtdLCBjYWxsYmFjazogRXZlbnRFbWl0dGVyPGFueT4pIHtcbiAgICBpZiAodGhpcy5kaXNhYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCBpbmRleCA9IHRoaXMuZmluZEluZGV4SW5TZWxlY3Rpb24oaXRlbSwgc2VsZWN0ZWRJdGVtcyk7XG4gICAgbGV0IHNlbGVjdGVkID0gKGluZGV4ICE9IC0xKTtcblxuICAgIGxldCBtZXRhS2V5ID0gKGV2ZW50Lm1ldGFLZXkgfHwgZXZlbnQuY3RybEtleSB8fCBldmVudC5zaGlmdEtleSk7XG5cbiAgICBpZiAoc2VsZWN0ZWQgJiYgbWV0YUtleSkge1xuICAgICAgc2VsZWN0ZWRJdGVtcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoIW1ldGFLZXkpIHtcbiAgICAgICAgc2VsZWN0ZWRJdGVtcy5sZW5ndGggPSAwO1xuICAgICAgfVxuICAgICAgc2VsZWN0ZWRJdGVtcy5wdXNoKGl0ZW0pO1xuICAgIH1cblxuICAgIGNhbGxiYWNrLmVtaXQoe29yaWdpbmFsRXZlbnQ6IGV2ZW50LCBpdGVtczogc2VsZWN0ZWRJdGVtc30pO1xuICB9XG5cbiAgb25JdGVtS2V5ZG93bihldmVudDogS2V5Ym9hcmRFdmVudCwgaXRlbTogYW55LCBzZWxlY3RlZEl0ZW1zOiBhbnlbXSwgY2FsbGJhY2s6IEV2ZW50RW1pdHRlcjxhbnk+KSB7XG4gICAgbGV0IGxpc3RJdGVtID0gPGFueT5ldmVudC5jdXJyZW50VGFyZ2V0O1xuXG4gICAgc3dpdGNoIChldmVudC53aGljaCkge1xuICAgICAgLy9kb3duXG4gICAgICBjYXNlIDQwOlxuICAgICAgICB2YXIgbmV4dEl0ZW0gPSBsaXN0SXRlbS5uZXh0RWxlbWVudFNpYmxpbmc7XG4gICAgICAgIGlmIChuZXh0SXRlbSkge1xuICAgICAgICAgIG5leHRJdGVtLmZvY3VzKCk7XG4gICAgICAgIH1cblxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBicmVhaztcblxuICAgICAgLy91cFxuICAgICAgY2FzZSAzODpcbiAgICAgICAgdmFyIHByZXZJdGVtID0gbGlzdEl0ZW0ucHJldmlvdXNFbGVtZW50U2libGluZztcbiAgICAgICAgaWYgKHByZXZJdGVtKSB7XG4gICAgICAgICAgcHJldkl0ZW0uZm9jdXMoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICAvL2VudGVyXG4gICAgICBjYXNlIDEzOlxuICAgICAgICB0aGlzLm9uSXRlbUNsaWNrKGV2ZW50LCBpdGVtLCBzZWxlY3RlZEl0ZW1zLCBjYWxsYmFjayk7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIG9uU291cmNlSXRlbURibENsaWNrKCkge1xuICAgIGlmICh0aGlzLmRpc2FibGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5tb3ZlVG9UYXJnZXQoKTtcbiAgfVxuXG4gIG9uVGFyZ2V0SXRlbURibENsaWNrKCkge1xuICAgIGlmICh0aGlzLmRpc2FibGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5tb3ZlVG9Tb3VyY2UoKTtcbiAgfVxuXG4gIC8vIERyYWcgbiBEcm9wXG5cbiAgb25Ecm9wKGV2ZW50OiBDZGtEcmFnRHJvcDxzdHJpbmdbXT4sIGxpc3RUeXBlOiBudW1iZXIpIHtcbiAgICBjb25zdCBpc1RyYW5zZmVyID0gZXZlbnQucHJldmlvdXNDb250YWluZXIgIT09IGV2ZW50LmNvbnRhaW5lcjtcblxuICAgIGlmIChsaXN0VHlwZSA9PT0gdGhpcy5TT1VSQ0VfTElTVCkge1xuICAgICAgaWYgKGlzVHJhbnNmZXIpIHtcbiAgICAgICAgdHJhbnNmZXJBcnJheUl0ZW0oZXZlbnQucHJldmlvdXNDb250YWluZXIuZGF0YSwgZXZlbnQuY29udGFpbmVyLmRhdGEsIGV2ZW50LnByZXZpb3VzSW5kZXgsIGV2ZW50LmN1cnJlbnRJbmRleCk7XG4gICAgICAgIGxldCBzZWxlY3RlZEl0ZW1JbmRleCA9IHRoaXMuZmluZEluZGV4SW5MaXN0KGV2ZW50Lml0ZW0uZGF0YSwgdGhpcy5zZWxlY3RlZEl0ZW1zVGFyZ2V0KTtcblxuICAgICAgICBpZiAoc2VsZWN0ZWRJdGVtSW5kZXggIT0gLTEpIHtcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkSXRlbXNUYXJnZXQuc3BsaWNlKHNlbGVjdGVkSXRlbUluZGV4LCAxKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubW92ZWRUb1NvdXJjZS5lbWl0KHtpdGVtczogW2V2ZW50Lml0ZW0uZGF0YV19KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG1vdmVJdGVtSW5BcnJheShldmVudC5jb250YWluZXIuZGF0YSwgZXZlbnQucHJldmlvdXNJbmRleCwgZXZlbnQuY3VycmVudEluZGV4KTtcbiAgICAgICAgdGhpcy5zb3VyY2VSZW9yZGVyZWQuZW1pdCh7aXRlbXM6IFtldmVudC5pdGVtLmRhdGFdfSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChpc1RyYW5zZmVyKSB7XG4gICAgICAgIHRyYW5zZmVyQXJyYXlJdGVtKGV2ZW50LnByZXZpb3VzQ29udGFpbmVyLmRhdGEsIGV2ZW50LmNvbnRhaW5lci5kYXRhLCBldmVudC5wcmV2aW91c0luZGV4LCBldmVudC5jdXJyZW50SW5kZXgpO1xuXG4gICAgICAgIGxldCBzZWxlY3RlZEl0ZW1JbmRleCA9IHRoaXMuZmluZEluZGV4SW5MaXN0KGV2ZW50Lml0ZW0uZGF0YSwgdGhpcy5zZWxlY3RlZEl0ZW1zU291cmNlKTtcblxuICAgICAgICBpZiAoc2VsZWN0ZWRJdGVtSW5kZXggIT0gLTEpIHtcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkSXRlbXNTb3VyY2Uuc3BsaWNlKHNlbGVjdGVkSXRlbUluZGV4LCAxKTtcbiAgICAgICAgfVxuXG5cbiAgICAgICAgdGhpcy5tb3ZlZFRvVGFyZ2V0LmVtaXQoe2l0ZW1zOiBbZXZlbnQuaXRlbS5kYXRhXX0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbW92ZUl0ZW1JbkFycmF5KGV2ZW50LmNvbnRhaW5lci5kYXRhLCBldmVudC5wcmV2aW91c0luZGV4LCBldmVudC5jdXJyZW50SW5kZXgpO1xuICAgICAgICB0aGlzLnRhcmdldFJlb3JkZXJlZC5lbWl0KHtpdGVtczogW2V2ZW50Lml0ZW0uZGF0YV19KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBWYWxpZGF0aW9uc1xuXG4gIHNvdXJjZU1vdmVEaXNhYmxlZCgpOiBhbnkge1xuICAgIGlmICh0aGlzLmRpc2FibGVkIHx8ICF0aGlzLnNlbGVjdGVkSXRlbXNTb3VyY2UubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBtb3ZlVG9UYXJnZXREaXNhYmxlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5kaXNhYmxlZCB8fCB0aGlzLmlzRW1wdHkodGhpcy5zZWxlY3RlZEl0ZW1zU291cmNlKTtcbiAgfVxuXG4gIG1vdmVBbGxUb1RhcmdldERpc2FibGVkKCkge1xuICAgIHJldHVybiB0aGlzLmRpc2FibGVkIHx8IHRoaXMuaXNFbXB0eSh0aGlzLnNvdXJjZSk7XG4gIH1cblxuICBtb3ZlVG9Tb3VyY2VEaXNhYmxlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5kaXNhYmxlZCB8fCB0aGlzLmlzRW1wdHkodGhpcy5zZWxlY3RlZEl0ZW1zVGFyZ2V0KTtcbiAgfVxuXG4gIG1vdmVBbGxUb1NvdXJjZURpc2FibGVkKCkge1xuICAgIHJldHVybiB0aGlzLmRpc2FibGVkIHx8IHRoaXMuaXNFbXB0eSh0aGlzLnRhcmdldCk7XG4gIH1cblxuICByZXNldERpc2FibGVkKCkge1xuICAgIHJldHVybiB0aGlzLmRpc2FibGVkO1xuICB9XG5cbiAgLy8gVXRpbHNcblxuICBpc1NlbGVjdGVkKGl0ZW06IGFueSwgc2VsZWN0ZWRJdGVtczogYW55W10pIHtcbiAgICByZXR1cm4gdGhpcy5maW5kSW5kZXhJblNlbGVjdGlvbihpdGVtLCBzZWxlY3RlZEl0ZW1zKSAhPSAtMTtcbiAgfVxuXG4gIGZpbmRJbmRleEluU2VsZWN0aW9uKGl0ZW06IGFueSwgc2VsZWN0ZWRJdGVtczogYW55W10pOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmZpbmRJbmRleEluTGlzdChpdGVtLCBzZWxlY3RlZEl0ZW1zKTtcbiAgfVxuXG4gIGZpbmRJbmRleEluTGlzdChpdGVtOiBhbnksIGxpc3Q6IGFueSk6IG51bWJlciB7XG4gICAgbGV0IGluZGV4OiBudW1iZXIgPSAtMTtcblxuICAgIGlmIChsaXN0KSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGxpc3RbaV0gPT0gaXRlbSkge1xuICAgICAgICAgIGluZGV4ID0gaTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBpbmRleDtcbiAgfVxuXG4gIGlzRW1wdHkodmFsdWU6IGFueSkge1xuICAgIHJldHVybiAoXG4gICAgICB2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSAnJyB8fFxuICAgICAgKEFycmF5LmlzQXJyYXkodmFsdWUpICYmIHZhbHVlLmxlbmd0aCA9PT0gMCkgfHxcbiAgICAgICghKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiBPYmplY3Qua2V5cyh2YWx1ZSkubGVuZ3RoID09PSAwKVxuICAgICk7XG4gIH1cblxufVxuIiwiPGRpdiBjbGFzcz1cIm5neC1waWNrbGlzdFwiIFtjbGFzc109XCJzdHlsZUNsYXNzXCIgY2RrRHJvcExpc3RHcm91cD5cbiAgPGRpdiBjbGFzcz1cIm5neC1waWNrbGlzdC1saXN0LXdyYXBwZXIgc291cmNlLXdyYXBwZXJcIj5cbiAgICA8ZGl2IGNsYXNzPVwibmd4LXBpY2tsaXN0LWhlYWRlclwiICpuZ0lmPVwic291cmNlSGVhZGVyVGVtcGxhdGVcIj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJzb3VyY2VIZWFkZXJUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuICAgIDx1bCBjbGFzcz1cIm5neC1waWNrbGlzdC1saXN0IHNvdXJjZVwiXG4gICAgICAgIGNka0Ryb3BMaXN0XG4gICAgICAgIFtjZGtEcm9wTGlzdERhdGFdPVwic291cmNlXCJcbiAgICAgICAgKGNka0Ryb3BMaXN0RHJvcHBlZCk9XCJvbkRyb3AoJGV2ZW50LCBTT1VSQ0VfTElTVClcIlxuICAgICAgICByb2xlPVwibGlzdGJveFwiXG4gICAgICAgIGFyaWEtbXVsdGlzZWxlY3RhYmxlPVwibXVsdGlwbGVcIj5cbiAgICAgIDxuZy10ZW1wbGF0ZSBuZ0ZvciBsZXQtaXRlbSBbbmdGb3JPZl09XCJzb3VyY2VcIiBbbmdGb3JUcmFja0J5XT1cInRyYWNrQnlcIiBsZXQtaT1cImluZGV4XCI+XG4gICAgICAgIDxsaVxuICAgICAgICAgIFtuZ0NsYXNzXT1cInsnbmd4LXBpY2tsaXN0LWl0ZW0nOnRydWUsICdoaWdobGlnaHQnOmlzU2VsZWN0ZWQoaXRlbSxzZWxlY3RlZEl0ZW1zU291cmNlKSwgJ2Rpc2FibGVkJzogZGlzYWJsZWR9XCJcbiAgICAgICAgICBjZGtEcmFnIFtjZGtEcmFnRGF0YV09XCJpdGVtXCIgW2Nka0RyYWdEaXNhYmxlZF09XCJkcmFnZHJvcERpc2FibGVkIHx8IGRpc2FibGVkXCJcbiAgICAgICAgICAoY2xpY2spPVwib25JdGVtQ2xpY2soJGV2ZW50LCBpdGVtLCBzZWxlY3RlZEl0ZW1zU291cmNlLCBzb3VyY2VTZWxlY3RlZClcIlxuICAgICAgICAgIChkYmxjbGljayk9XCJvblNvdXJjZUl0ZW1EYmxDbGljaygpXCJcbiAgICAgICAgICAoa2V5ZG93bik9XCJvbkl0ZW1LZXlkb3duKCRldmVudCwgaXRlbSwgc2VsZWN0ZWRJdGVtc1NvdXJjZSwgc291cmNlU2VsZWN0ZWQpXCJcbiAgICAgICAgICB0YWJpbmRleD1cIjBcIiByb2xlPVwib3B0aW9uXCJcbiAgICAgICAgICBbYXR0ci5hcmlhLXNlbGVjdGVkXT1cImlzU2VsZWN0ZWQoaXRlbSwgc2VsZWN0ZWRJdGVtc1NvdXJjZSlcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiaXRlbVRlbXBsYXRlOyBjb250ZXh0OiB7JGltcGxpY2l0OiBpdGVtLCBpbmRleDogaX1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9saT5cbiAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPC91bD5cbiAgPC9kaXY+XG5cbiAgPGRpdiBjbGFzcz1cIm5neC1waWNrbGlzdC1idXR0b25zXCIgKm5nSWY9XCJzaG93Q29udHJvbHNcIj5cbiAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cIm1vdmUtdG8tdGFyZ2V0XCIgYXJpYS1sYWJlbD1cIk1vdmUgdG8gdGFyZ2V0XCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJtb3ZlVG9UYXJnZXREaXNhYmxlZCgpXCJcbiAgICAgICAgICAgIChjbGljayk9XCJtb3ZlVG9UYXJnZXQoKVwiPlxuICAgICAgPGkgY2xhc3M9XCJtYXRlcmlhbC1pY29uc1wiIGFyaWEtbGFiZWw9XCJjaGV2cm9uX3JpZ2h0XCI+Y2hldnJvbl9yaWdodDwvaT5cbiAgICA8L2J1dHRvbj5cbiAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cIm1vdmUtYWxsLXRvLXRhcmdldFwiIGFyaWEtbGFiZWw9XCJNb3ZlIGFsbCB0byB0YXJnZXRcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cIm1vdmVBbGxUb1RhcmdldERpc2FibGVkKClcIlxuICAgICAgICAgICAgKGNsaWNrKT1cIm1vdmVBbGxUb1RhcmdldCgpXCI+XG4gICAgICA8aSBjbGFzcz1cIm1hdGVyaWFsLWljb25zXCIgYXJpYS1sYWJlbD1cImNoZXZyb25fcmlnaHRcIj5rZXlib2FyZF9kb3VibGVfYXJyb3dfcmlnaHQ8L2k+XG4gICAgPC9idXR0b24+XG4gICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJtb3ZlLXRvLXNvdXJjZVwiIGFyaWEtbGFiZWw9XCJNb3ZlIHRvIHNvdXJjZVwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwibW92ZVRvU291cmNlRGlzYWJsZWQoKVwiXG4gICAgICAgICAgICAoY2xpY2spPVwibW92ZVRvU291cmNlKClcIj5cbiAgICAgIDxpIGNsYXNzPVwibWF0ZXJpYWwtaWNvbnNcIiBhcmlhLWxhYmVsPVwiY2hldnJvbl9yaWdodFwiPmNoZXZyb25fbGVmdDwvaT5cbiAgICA8L2J1dHRvbj5cbiAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cIm1vdmUtYWxsLXRvLXNvdXJjZVwiIGFyaWEtbGFiZWw9XCJNb3ZlIGFsbCB0byBzb3VyY2VcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cIm1vdmVBbGxUb1NvdXJjZURpc2FibGVkKClcIlxuICAgICAgICAgICAgKGNsaWNrKT1cIm1vd