angular2-collapsible
Version:
Angular collapsible component styled with Materialize CSS.
486 lines • 53.1 kB
JavaScript
/**
* @fileoverview added by tsickle
* Generated from: lib/collapsible-table-row/collapsible-table-row.component.ts
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Component, Input, HostBinding, HostListener, ElementRef } from '@angular/core';
import { DomSanitizer } from '@angular/platform-browser';
import { CollapsibleTableRowDetailComponent } from '../collapsible-table-row-detail/collapsible-table-row-detail.component';
import { CollapsibleService } from '../services/collapsible.service';
var CollapsibleTableRowComponent = /** @class */ (function () {
function CollapsibleTableRowComponent(el, sanitizer, collapsibleService) {
this.el = el;
this.sanitizer = sanitizer;
this.collapsibleService = collapsibleService;
this.backgroundTransitionDuration = '0.3s';
// transition-timing-function: easeInQuad
this.backgroundTransitionTimingFunction = this.sanitizer
.bypassSecurityTrustStyle(CollapsibleTableRowComponent.EASE_OUT_QUAD);
this.isHeadRow = false;
this.isBodyRow = false;
this.isOddRow = false;
this.isEvenRow = false;
this.isParentStriped = false;
this.isParentHighlight = false;
this.parentAllowsSelect = false;
this.parentAllowsSelectMultipleRows = false;
this.parentAllowsDeselectingRows = false;
this.dragSelection = false;
}
/**
* @return {?}
*/
CollapsibleTableRowComponent.prototype.ngOnInit = /**
* @return {?}
*/
function () {
/** @type {?} */
var elem = this.el.nativeElement;
/** @type {?} */
var tbody = elem.parentElement;
if (tbody.tagName === 'TBODY') {
/** @type {?} */
var collapsibleTableRows = tbody.querySelectorAll('collapsible-table-row');
for (var i = 0; i < collapsibleTableRows.length; i++) {
/** @type {?} */
var collapsibleTableRow = collapsibleTableRows[i];
if (collapsibleTableRow === elem) {
this.index = i + 1;
break;
}
}
}
// retrieve parent CollapsibleTableComponent through the CollapsibleService
this.parentCollapsibleTable = this.collapsibleService.getCollapsibleTable();
if (this.parentCollapsibleTable != null) {
// check if collapsible-table is marked to show striped table
this.isParentStriped = this.parentCollapsibleTable.striped;
// check if collapsible-table is marked to highlight current row
this.isParentHighlight = this.parentCollapsibleTable.highlight;
this.parentHighlightRowBackgroundColor = this.parentCollapsibleTable.highlightColor ||
CollapsibleTableRowComponent.DEFAULT_HIGHLIGHT_ROW_COLOR;
this.parentHighlightRowTextColor = this.parentCollapsibleTable.highlightTextColor ||
CollapsibleTableRowComponent.DEFAULT_ROW_TEXT_COLOR;
// check if collapsible-table specifies the active row color
this.activeRowBackgroundColor = this.parentCollapsibleTable.activeColor ||
CollapsibleTableRowComponent.DEFAULT_ACTIVE_ROW_COLOR;
this.activeRowTextColor = this.parentCollapsibleTable.activeTextColor ||
CollapsibleTableRowComponent.DEFAULT_ROW_TEXT_COLOR;
// check if collapsible-table allows selecting rows
this.parentAllowsSelect = this.parentCollapsibleTable.select;
this.parentAllowsSelectMultipleRows = this.parentCollapsibleTable.selectMultipleRows;
// check if collapsible-table specifies a color for the selected row
this.selectedRowBackgroundColor = this.parentCollapsibleTable.selectColor ||
CollapsibleTableRowComponent.DEFAULT_SELECTED_ROW_COLOR;
this.selectedRowTextColor = this.parentCollapsibleTable.selectTextColor ||
CollapsibleTableRowComponent.DEFAULT_ROW_TEXT_COLOR;
// check if collapsible-table allows to deselect rows
this.parentAllowsDeselectingRows = this.parentCollapsibleTable.allowDeselectingRows != null ?
this.parentCollapsibleTable.allowDeselectingRows : false;
}
};
/**
* @return {?}
*/
CollapsibleTableRowComponent.prototype.ngAfterContentInit = /**
* @return {?}
*/
function () {
this.updateRow();
};
/**
* @return {?}
*/
CollapsibleTableRowComponent.prototype.updateRow = /**
* @return {?}
*/
function () {
/** @type {?} */
var elem = this.el.nativeElement;
// determine if the row is inside the 'thead'
/** @type {?} */
var th = elem.querySelector('th');
if (th != null) {
this.isHeadRow = true;
}
// determine if the row is inside the 'tbody'
/** @type {?} */
var td = elem.querySelector('td');
if (td != null) {
this.isBodyRow = true;
// determine if the row is 'odd' or 'event'
if (this.index % 2 === 0) {
this.isEvenRow = true;
this.parentStripedRowBackgroundColor = this.parentCollapsibleTable.stripedEvenColor ||
CollapsibleTableRowComponent.DEFAULT_STRIPED_EVEN_ROW_COLOR;
this.parentStripedRowTextColor = this.parentCollapsibleTable.stripedEvenTextColor ||
CollapsibleTableRowComponent.DEFAULT_ROW_TEXT_COLOR;
}
else {
this.isOddRow = true;
this.parentStripedRowBackgroundColor = this.parentCollapsibleTable.stripedOddColor ||
CollapsibleTableRowComponent.DEFAULT_STRIPED_ODD_ROW_COLOR;
this.parentStripedRowTextColor = this.parentCollapsibleTable.stripedOddTextColor ||
CollapsibleTableRowComponent.DEFAULT_ROW_TEXT_COLOR;
}
switch (true) {
case this.parentAllowsSelect && this.selected:
this.rowBackgroundColor = this.selectedRowBackgroundColor;
this.rowTextColor = this.selectedRowTextColor;
break;
case this.isParentStriped:
this.rowBackgroundColor = this.parentStripedRowBackgroundColor;
this.rowTextColor = this.parentStripedRowTextColor;
break;
}
}
};
/**
* @return {?}
*/
CollapsibleTableRowComponent.prototype.getHeight = /**
* @return {?}
*/
function () {
return this.el.nativeElement.offsetHeight;
};
/**
* @private
* @param {?} event
* @return {?}
*/
CollapsibleTableRowComponent.prototype.isLeftMouseButton = /**
* @private
* @param {?} event
* @return {?}
*/
function (event) {
/** @type {?} */
var button = event.button;
/** @type {?} */
var which = event['which'];
/** @type {?} */
var target = (/** @type {?} */ ((event.target || event.srcElement || event.currentTarget)));
if (['TR', 'TD'].indexOf(target.tagName) > -1) {
if ('button' in event) {
return button === 0;
}
else {
return (which || button) === 1;
}
}
return false;
};
/**
* @param {?} event
* @return {?}
*/
CollapsibleTableRowComponent.prototype.mousedown = /**
* @param {?} event
* @return {?}
*/
function (event) {
// handle only if the Left mouse button pressed
// and the row is a body row
if (this.isLeftMouseButton(event) && this.isBodyRow) {
if (this.parentCollapsibleTable.noTextSelect) {
event.preventDefault();
}
if (this.isBodyRow) {
if (this.parentAllowsSelect && !this.parentAllowsDeselectingRows) {
this.prevSelectedRows = this.parentCollapsibleTable.selectedRows;
this.parentCollapsibleTable.clearSelectedRows();
this.parentCollapsibleTable.deselectAllRows();
}
this.rowBackgroundColor = this.activeRowBackgroundColor;
this.rowTextColor = this.activeRowTextColor;
}
}
};
/**
* @param {?} event
* @return {?}
*/
CollapsibleTableRowComponent.prototype.mouseup = /**
* @param {?} event
* @return {?}
*/
function (event) {
// handle only if the Left mouse button pressed
// and the row is a body row
if (this.isLeftMouseButton(event) && this.isBodyRow) {
// handle selection
if (this.parentAllowsSelect) {
if (!this.parentAllowsDeselectingRows) {
this.parentCollapsibleTable.selectRow(this.index);
}
else {
if (!this.dragSelection) {
this.parentCollapsibleTable.toggleRowSelection(this.index);
}
}
}
// check row state
this.parentCollapsibleTable.updateTable();
/*switch (true) {
// parent allows selecting rows and the row is selected
case this.parentAllowsSelect && this.selected:
this.rowBackgroundColor = this.selectedRowBackgroundColor;
this.rowTextColor = this.selectedRowTextColor;
this.parentCollapsibleTable.updateTable();
break;
// highlighted
case this.isParentHighlight:
this.rowBackgroundColor = this.parentHighlightRowBackgroundColor;
this.rowTextColor = this.parentHighlightRowTextColor;
break;
// striped
case this.isParentStriped:
this.rowBackgroundColor = this.parentStripedRowBackgroundColor;
this.rowTextColor = this.parentStripedRowTextColor;
break;
default:
this.rowBackgroundColor = undefined;
this.rowTextColor = undefined;
break;
}*/
// select multiple rows using the 'Shift' key
if (this.parentAllowsSelect &&
this.parentAllowsSelectMultipleRows &&
event != null && event.shiftKey) {
if (this.prevSelectedRows != null &&
this.prevSelectedRows.length > 0 &&
this.parentCollapsibleTable.selectedRows.length > 0) {
/** @type {?} */
var rangeSelectedRows = this.prevSelectedRows.concat(this.parentCollapsibleTable.selectedRows);
rangeSelectedRows.sort((/**
* @param {?} a
* @param {?} b
* @return {?}
*/
function (a, b) { return a - b; }));
/** @type {?} */
var firstRowIndex = Math.min.apply(null, rangeSelectedRows);
/** @type {?} */
var lastRowIndex = Math.max.apply(null, rangeSelectedRows);
this.parentCollapsibleTable.selectRows(firstRowIndex, lastRowIndex);
}
}
// set dragSelection flag to false. Prevents selection drag behavior
this.dragSelection = false;
// focus the collapsible table
this.parentCollapsibleTable.focus();
}
};
/**
* @param {?} event
* @return {?}
*/
CollapsibleTableRowComponent.prototype.mouseenter = /**
* @param {?} event
* @return {?}
*/
function (event) {
// handle only if the row is a body row
if (this.isBodyRow) {
switch (true) {
// the use is trying to select multiple rows by holding a mouse button
case this.parentAllowsSelect && this.parentAllowsSelectMultipleRows && this.parentCollapsibleTable.mouseDownHold:
this.parentCollapsibleTable.selectRow(this.index);
this.dragSelection = true;
break;
// parent allows selecting rows and the row is selected
case this.parentAllowsSelect && this.selected:
break;
// highlighted
case this.isParentHighlight:
this.rowBackgroundColor = this.parentHighlightRowBackgroundColor;
this.rowTextColor = this.parentHighlightRowTextColor;
break;
}
}
};
/**
* @param {?} event
* @return {?}
*/
CollapsibleTableRowComponent.prototype.mouseleave = /**
* @param {?} event
* @return {?}
*/
function (event) {
// handle only if the row is a body row
if (this.isBodyRow) {
// check row state
switch (true) {
// the use is trying to select multiple rows by holding a mouse button
case this.parentAllowsSelect && this.parentAllowsSelectMultipleRows && this.parentCollapsibleTable.mouseDownHold:
this.parentCollapsibleTable.selectRow(this.index);
this.dragSelection = false;
break;
// parent allows selecting rows and the row is selected
case this.parentAllowsSelect && this.selected:
break;
// stripped
case this.isParentStriped:
this.rowBackgroundColor = this.parentStripedRowBackgroundColor;
this.rowTextColor = this.parentStripedRowTextColor;
break;
default:
this.rowBackgroundColor = undefined;
this.rowTextColor = undefined;
break;
}
}
};
/**
* @param {?} event
* @return {?}
*/
CollapsibleTableRowComponent.prototype.click = /**
* @param {?} event
* @return {?}
*/
function (event) {
if (this.detail != null) {
/** @type {?} */
var target = (/** @type {?} */ ((event.target || event.srcElement || event.currentTarget)));
if (target != null && ['TR', 'TD'].indexOf(target.tagName) > -1) {
this.detail.subject.next();
}
}
};
CollapsibleTableRowComponent.EASE_OUT_QUAD = 'cubic-bezier(0.25, 0.46, 0.45, 0.94)';
CollapsibleTableRowComponent.DEFAULT_STRIPED_ODD_ROW_COLOR = 'rgba(242,242,242,0.8)';
CollapsibleTableRowComponent.DEFAULT_STRIPED_EVEN_ROW_COLOR = 'transparent';
CollapsibleTableRowComponent.DEFAULT_HIGHLIGHT_ROW_COLOR = 'rgba(222,222,222, 0.8)';
CollapsibleTableRowComponent.DEFAULT_ACTIVE_ROW_COLOR = 'rgba(212,212,212, 0.8)';
CollapsibleTableRowComponent.DEFAULT_SELECTED_ROW_COLOR = 'rgba(212,212,212, 0.8)';
CollapsibleTableRowComponent.DEFAULT_ROW_TEXT_COLOR = 'black';
CollapsibleTableRowComponent.decorators = [
{ type: Component, args: [{
selector: 'collapsible-table-row',
template: "<ng-content></ng-content>",
styles: ["\n :host {\n display: table-row;\n transition-property: background-color, color;\n }\n "]
}] }
];
/** @nocollapse */
CollapsibleTableRowComponent.ctorParameters = function () { return [
{ type: ElementRef },
{ type: DomSanitizer },
{ type: CollapsibleService }
]; };
CollapsibleTableRowComponent.propDecorators = {
detail: [{ type: Input }],
rowTextColor: [{ type: HostBinding, args: ['style.color',] }],
rowBackgroundColor: [{ type: HostBinding, args: ['style.background-color',] }],
backgroundTransitionDuration: [{ type: HostBinding, args: ['style.transition-duration',] }],
backgroundTransitionTimingFunction: [{ type: HostBinding, args: ['style.transition-timing-function',] }],
selected: [{ type: HostBinding, args: ['class.selected',] }],
mousedown: [{ type: HostListener, args: ['mousedown', ['$event'],] }],
mouseup: [{ type: HostListener, args: ['mouseup', ['$event'],] }],
mouseenter: [{ type: HostListener, args: ['mouseenter', ['$event'],] }],
mouseleave: [{ type: HostListener, args: ['mouseleave', ['$event'],] }],
click: [{ type: HostListener, args: ['click', ['$event'],] }]
};
return CollapsibleTableRowComponent;
}());
export { CollapsibleTableRowComponent };
if (false) {
/**
* @type {?}
* @private
*/
CollapsibleTableRowComponent.EASE_OUT_QUAD;
/** @type {?} */
CollapsibleTableRowComponent.DEFAULT_STRIPED_ODD_ROW_COLOR;
/** @type {?} */
CollapsibleTableRowComponent.DEFAULT_STRIPED_EVEN_ROW_COLOR;
/** @type {?} */
CollapsibleTableRowComponent.DEFAULT_HIGHLIGHT_ROW_COLOR;
/** @type {?} */
CollapsibleTableRowComponent.DEFAULT_ACTIVE_ROW_COLOR;
/** @type {?} */
CollapsibleTableRowComponent.DEFAULT_SELECTED_ROW_COLOR;
/** @type {?} */
CollapsibleTableRowComponent.DEFAULT_ROW_TEXT_COLOR;
/** @type {?} */
CollapsibleTableRowComponent.prototype.detail;
/** @type {?} */
CollapsibleTableRowComponent.prototype.rowTextColor;
/** @type {?} */
CollapsibleTableRowComponent.prototype.rowBackgroundColor;
/** @type {?} */
CollapsibleTableRowComponent.prototype.backgroundTransitionDuration;
/** @type {?} */
CollapsibleTableRowComponent.prototype.backgroundTransitionTimingFunction;
/** @type {?} */
CollapsibleTableRowComponent.prototype.selected;
/** @type {?} */
CollapsibleTableRowComponent.prototype.isHeadRow;
/** @type {?} */
CollapsibleTableRowComponent.prototype.isBodyRow;
/** @type {?} */
CollapsibleTableRowComponent.prototype.isOddRow;
/** @type {?} */
CollapsibleTableRowComponent.prototype.isEvenRow;
/** @type {?} */
CollapsibleTableRowComponent.prototype.isParentStriped;
/** @type {?} */
CollapsibleTableRowComponent.prototype.isParentHighlight;
/** @type {?} */
CollapsibleTableRowComponent.prototype.parentAllowsSelect;
/** @type {?} */
CollapsibleTableRowComponent.prototype.parentAllowsSelectMultipleRows;
/** @type {?} */
CollapsibleTableRowComponent.prototype.parentStripedRowBackgroundColor;
/** @type {?} */
CollapsibleTableRowComponent.prototype.parentStripedRowTextColor;
/** @type {?} */
CollapsibleTableRowComponent.prototype.parentHighlightRowBackgroundColor;
/** @type {?} */
CollapsibleTableRowComponent.prototype.parentHighlightRowTextColor;
/** @type {?} */
CollapsibleTableRowComponent.prototype.activeRowBackgroundColor;
/** @type {?} */
CollapsibleTableRowComponent.prototype.activeRowTextColor;
/** @type {?} */
CollapsibleTableRowComponent.prototype.selectedRowBackgroundColor;
/** @type {?} */
CollapsibleTableRowComponent.prototype.selectedRowTextColor;
/** @type {?} */
CollapsibleTableRowComponent.prototype.parentAllowsDeselectingRows;
/** @type {?} */
CollapsibleTableRowComponent.prototype.index;
/**
* @type {?}
* @private
*/
CollapsibleTableRowComponent.prototype.parentCollapsibleTable;
/**
* @type {?}
* @private
*/
CollapsibleTableRowComponent.prototype.prevSelectedRows;
/**
* @type {?}
* @private
*/
CollapsibleTableRowComponent.prototype.dragSelection;
/**
* @type {?}
* @private
*/
CollapsibleTableRowComponent.prototype.el;
/**
* @type {?}
* @private
*/
CollapsibleTableRowComponent.prototype.sanitizer;
/**
* @type {?}
* @private
*/
CollapsibleTableRowComponent.prototype.collapsibleService;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sbGFwc2libGUtdGFibGUtcm93LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2FuZ3VsYXIyLWNvbGxhcHNpYmxlLyIsInNvdXJjZXMiOlsibGliL2NvbGxhcHNpYmxlLXRhYmxlLXJvdy9jb2xsYXBzaWJsZS10YWJsZS1yb3cuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUNILFNBQVMsRUFFVCxLQUFLLEVBQUUsV0FBVyxFQUFFLFlBQVksRUFDaEMsVUFBVSxFQUNiLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUV6RCxPQUFPLEVBQUUsa0NBQWtDLEVBQUUsTUFBTSx3RUFBd0UsQ0FBQztBQUU1SCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUVyRTtJQTZESSxzQ0FDWSxFQUFjLEVBQ2QsU0FBdUIsRUFDdkIsa0JBQXNDO1FBRnRDLE9BQUUsR0FBRixFQUFFLENBQVk7UUFDZCxjQUFTLEdBQVQsU0FBUyxDQUFjO1FBQ3ZCLHVCQUFrQixHQUFsQixrQkFBa0IsQ0FBb0I7UUFwQ1IsaUNBQTRCLEdBQUcsTUFBTSxDQUFDOztRQUdoRix1Q0FBa0MsR0FBRyxJQUFJLENBQUMsU0FBUzthQUM5Qyx3QkFBd0IsQ0FBQyw0QkFBNEIsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUkxRSxjQUFTLEdBQUcsS0FBSyxDQUFDO1FBQ2xCLGNBQVMsR0FBRyxLQUFLLENBQUM7UUFDbEIsYUFBUSxHQUFHLEtBQUssQ0FBQztRQUNqQixjQUFTLEdBQUcsS0FBSyxDQUFDO1FBQ2xCLG9CQUFlLEdBQUcsS0FBSyxDQUFDO1FBQ3hCLHNCQUFpQixHQUFHLEtBQUssQ0FBQztRQUMxQix1QkFBa0IsR0FBRyxLQUFLLENBQUM7UUFDM0IsbUNBQThCLEdBQUcsS0FBSyxDQUFDO1FBVXZDLGdDQUEyQixHQUFHLEtBQUssQ0FBQztRQU01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WSxTQUFDLFdBQVcsRUFBRSxDQUFDLFFBQVEsQ0FBQzswQkFvQnBDLFlBQVksU0FBQyxTQUFTLEVBQUUsQ0FBQyxRQUFRLENBQUM7NkJBaUVsQyxZQUFZLFNBQUMsWUFBWSxFQUFFLENBQUMsUUFBUSxDQUFDOzZCQXNCckMsWUFBWSxTQUFDLFlBQVksRUFBRSxDQUFDLFFBQVEsQ0FBQzt3QkEyQnJDLFlBQVksU0FBQyxPQUFPLEVBQUUsQ0FBQyxRQUFRLENBQUM7O0lBV3JDLG1DQUFDO0NBQUEsQUF2VUQsSUF1VUM7U0E3VFksNEJBQTRCOzs7Ozs7SUFFckMsMkNBQXNFOztJQUV0RSwyREFBc0U7O0lBQ3RFLDREQUE2RDs7SUFDN0QseURBQXFFOztJQUNyRSxzREFBa0U7O0lBQ2xFLHdEQUFvRTs7SUFFcEUsb0RBQStDOztJQUUvQyw4Q0FBb0Q7O0lBRXBELG9EQUFpRDs7SUFFakQsMERBQWtFOztJQUVsRSxvRUFBZ0Y7O0lBRWhGLDBFQUUwRTs7SUFFMUUsZ0RBQWlEOztJQUVqRCxpREFBa0I7O0lBQ2xCLGlEQUFrQjs7SUFDbEIsZ0RBQWlCOztJQUNqQixpREFBa0I7O0lBQ2xCLHVEQUF3Qjs7SUFDeEIseURBQTBCOztJQUMxQiwwREFBMkI7O0lBQzNCLHNFQUF1Qzs7SUFFdkMsdUVBQXdDOztJQUN4QyxpRUFBa0M7O0lBQ2xDLHlFQUEwQzs7SUFDMUMsbUVBQW9DOztJQUNwQyxnRUFBaUM7O0lBQ2pDLDBEQUEyQjs7SUFDM0Isa0VBQW1DOztJQUNuQyw0REFBNkI7O0lBQzdCLG1FQUFvQzs7SUFFcEMsNkNBQWM7Ozs7O0lBRWQsOERBQTBEOzs7OztJQUMxRCx3REFBd0M7Ozs7O0lBQ3hDLHFEQUE4Qjs7Ozs7SUFHMUIsMENBQXNCOzs7OztJQUN0QixpREFBK0I7Ozs7O0lBQy9CLDBEQUE4QyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgICBDb21wb25lbnQsXHJcbiAgICBPbkluaXQsIEFmdGVyQ29udGVudEluaXQsXHJcbiAgICBJbnB1dCwgSG9zdEJpbmRpbmcsIEhvc3RMaXN0ZW5lcixcclxuICAgIEVsZW1lbnRSZWZcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRG9tU2FuaXRpemVyIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XHJcblxyXG5pbXBvcnQgeyBDb2xsYXBzaWJsZVRhYmxlUm93RGV0YWlsQ29tcG9uZW50IH0gZnJvbSAnLi4vY29sbGFwc2libGUtdGFibGUtcm93LWRldGFpbC9jb2xsYXBzaWJsZS10YWJsZS1yb3ctZGV0YWlsLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IENvbGxhcHNpYmxlVGFibGVDb21wb25lbnQgfSBmcm9tICcuLi9jb2xsYXBzaWJsZS10YWJsZS9jb2xsYXBzaWJsZS10YWJsZS5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBDb2xsYXBzaWJsZVNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9jb2xsYXBzaWJsZS5zZXJ2aWNlJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gICAgc2VsZWN0b3I6ICdjb2xsYXBzaWJsZS10YWJsZS1yb3cnLFxyXG4gICAgdGVtcGxhdGU6IGA8bmctY29udGVudD48L25nLWNvbnRlbnQ+YCxcclxuICAgIHN0eWxlczogW2BcclxuICAgICAgICA6aG9zdCB7XHJcbiAgICAgICAgICAgIGRpc3BsYXk6IHRhYmxlLXJvdztcclxuICAgICAgICAgICAgdHJhbnNpdGlvbi1wcm9wZXJ0eTogYmFja2dyb3VuZC1jb2xvciwgY29sb3I7XHJcbiAgICAgICAgfVxyXG4gICAgYF0sXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBDb2xsYXBzaWJsZVRhYmxlUm93Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBBZnRlckNvbnRlbnRJbml0IHtcclxuXHJcbiAgICBwcml2YXRlIHN0YXRpYyBFQVNFX09VVF9RVUFEID0gJ2N1YmljLWJlemllcigwLjI1LCAwLjQ2LCAwLjQ1LCAwLjk0KSc7XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBERUZBVUxUX1NUUklQRURfT0REX1JPV19DT0xPUiA9ICdyZ2JhKDI0MiwyNDIsMjQyLDAuOCknO1xyXG4gICAgcHVibGljIHN0YXRpYyBERUZBVUxUX1NUUklQRURfRVZFTl9ST1dfQ09MT1IgPSAndHJhbnNwYXJlbnQnO1xyXG4gICAgcHVibGljIHN0YXRpYyBERUZBVUxUX0hJR0hMSUdIVF9ST1dfQ09MT1IgPSAncmdiYSgyMjIsMjIyLDIyMiwgMC44KSc7XHJcbiAgICBwdWJsaWMgc3RhdGljIERFRkFVTFRfQUNUSVZFX1JPV19DT0xPUiA9ICdyZ2JhKDIxMiwyMTIsMjEyLCAwLjgpJztcclxuICAgIHB1YmxpYyBzdGF0aWMgREVGQVVMVF9TRUxFQ1RFRF9ST1dfQ09MT1IgPSAncmdiYSgyMTIsMjEyLDIxMiwgMC44KSc7XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBERUZBVUxUX1JPV19URVhUX0NPTE9SID0gJ2JsYWNrJztcclxuXHJcbiAgICBASW5wdXQoKSBkZXRhaWw6IENvbGxhcHNpYmxlVGFibGVSb3dEZXRhaWxDb21wb25lbnQ7XHJcblxyXG4gICAgQEhvc3RCaW5kaW5nKCdzdHlsZS5jb2xvcicpIHJvd1RleHRDb2xvcjogc3RyaW5nO1xyXG5cclxuICAgIEBIb3N0QmluZGluZygnc3R5bGUuYmFja2dyb3VuZC1jb2xvcicpIHJvd0JhY2tncm91bmRDb2xvcjogc3RyaW5nO1xyXG5cclxuICAgIEBIb3N0QmluZGluZygnc3R5bGUudHJhbnNpdGlvbi1kdXJhdGlvbicpIGJhY2tncm91bmRUcmFuc2l0aW9uRHVyYXRpb24gPSAnMC4zcyc7XHJcbiAgICAvLyB0cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjogZWFzZUluUXVhZFxyXG4gICAgQEhvc3RCaW5kaW5nKCdzdHlsZS50cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbicpXHJcbiAgICBiYWNrZ3JvdW5kVHJhbnNpdGlvblRpbWluZ0Z1bmN0aW9uID0gdGhpcy5zYW5pdGl6ZXJcclxuICAgICAgICAuYnlwYXNzU2VjdXJpdHlUcnVzdFN0eWxlKENvbGxhcHNpYmxlVGFibGVSb3dDb21wb25lbnQuRUFTRV9PVVRfUVVBRCk7XHJcblxyXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5zZWxlY3RlZCcpIHNlbGVjdGVkOiBib29sZWFuO1xyXG5cclxuICAgIGlzSGVhZFJvdyA9IGZhbHNlO1xyXG4gICAgaXNCb2R5Um93ID0gZmFsc2U7XHJcbiAgICBpc09kZFJvdyA9IGZhbHNlO1xyXG4gICAgaXNFdmVuUm93ID0gZmFsc2U7XHJcbiAgICBpc1BhcmVudFN0cmlwZWQgPSBmYWxzZTtcclxuICAgIGlzUGFyZW50SGlnaGxpZ2h0ID0gZmFsc2U7XHJcbiAgICBwYXJlbnRBbGxvd3NTZWxlY3QgPSBmYWxzZTtcclxuICAgIHBhcmVudEFsbG93c1NlbGVjdE11bHRpcGxlUm93cyA9IGZhbHNlO1xyXG5cclxuICAgIHBhcmVudFN0cmlwZWRSb3dCYWNrZ3JvdW5kQ29sb3I6IHN0cmluZztcclxuICAgIHBhcmVudFN0cmlwZWRSb3dUZXh0Q29sb3I6IHN0cmluZztcclxuICAgIHBhcmVudEhpZ2hsaWdodFJvd0JhY2tncm91bmRDb2xvcjogc3RyaW5nO1xyXG4gICAgcGFyZW50SGlnaGxpZ2h0Um93VGV4dENvbG9yOiBzdHJpbmc7XHJcbiAgICBhY3RpdmVSb3dCYWNrZ3JvdW5kQ29sb3I6IHN0cmluZztcclxuICAgIGFjdGl2ZVJvd1RleHRDb2xvcjogc3RyaW5nO1xyXG4gICAgc2VsZWN0ZWRSb3dCYWNrZ3JvdW5kQ29sb3I6IHN0cmluZztcclxuICAgIHNlbGVjdGVkUm93VGV4dENvbG9yOiBzdHJpbmc7XHJcbiAgICBwYXJlbnRBbGxvd3NEZXNlbGVjdGluZ1Jvd3MgPSBmYWxzZTtcclxuXHJcbiAgICBpbmRleDogbnVtYmVyO1xyXG5cclxuICAgIHByaXZhdGUgcGFyZW50Q29sbGFwc2libGVUYWJsZTogQ29sbGFwc2libGVUYWJsZUNvbXBvbmVudDtcclxuICAgIHByaXZhdGUgcHJldlNlbGVjdGVkUm93czogQXJyYXk8bnVtYmVyPjtcclxuICAgIHByaXZhdGUgZHJhZ1NlbGVjdGlvbiA9IGZhbHNlO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIHByaXZhdGUgZWw6IEVsZW1lbnRSZWYsXHJcbiAgICAgICAgcHJpdmF0ZSBzYW5pdGl6ZXI6IERvbVNhbml0aXplcixcclxuICAgICAgICBwcml2YXRlIGNvbGxhcHNpYmxlU2VydmljZTogQ29sbGFwc2libGVTZXJ2aWNlKSB7IH1cclxuXHJcbiAgICBuZ09uSW5pdCgpIHtcclxuICAgICAgICBjb25zdCBlbGVtOiBFbGVtZW50ID0gdGhpcy5lbC5uYXRpdmVFbGVtZW50O1xyXG4gICAgICAgIGNvbnN0IHRib2R5OiBFbGVtZW50ID0gZWxlbS5wYXJlbnRFbGVtZW50O1xyXG4gICAgICAgIGlmICh0Ym9keS50YWdOYW1lID09PSAnVEJPRFknKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbGxhcHNpYmxlVGFibGVSb3dzOiBOb2RlTGlzdE9mPEVsZW1lbnQ+ID0gdGJvZHkucXVlcnlTZWxlY3RvckFsbCgnY29sbGFwc2libGUtdGFibGUtcm93Jyk7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29sbGFwc2libGVUYWJsZVJvd3MubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNvbGxhcHNpYmxlVGFibGVSb3c6IEVsZW1lbnQgPSBjb2xsYXBzaWJsZVRhYmxlUm93c1tpXTtcclxuICAgICAgICAgICAgICAgIGlmIChjb2xsYXBzaWJsZVRhYmxlUm93ID09PSBlbGVtKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbmRleCA9IGkgKyAxO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyByZXRyaWV2ZSBwYXJlbnQgQ29sbGFwc2libGVUYWJsZUNvbXBvbmVudCB0aHJvdWdoIHRoZSBDb2xsYXBzaWJsZVNlcnZpY2VcclxuICAgICAgICB0aGlzLnBhcmVudENvbGxhcHNpYmxlVGFibGUgPSB0aGlzLmNvbGxhcHNpYmxlU2VydmljZS5nZXRDb2xsYXBzaWJsZVRhYmxlKCk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnBhcmVudENvbGxhcHNpYmxlVGFibGUgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAvLyBjaGVjayBpZiBjb2xsYXBzaWJsZS10YWJsZSBpcyBtYXJrZWQgdG8gc2hvdyBzdHJpcGVkIHRhYmxlXHJcbiAgICAgICAgICAgIHRoaXMuaXNQYXJlbnRTdHJpcGVkID0gdGhpcy5wYXJlbnRDb2xsYXBzaWJsZVRhYmxlLnN0cmlwZWQ7XHJcblxyXG4gICAgICAgICAgICAvLyBjaGVjayBpZiBjb2xsYXBzaWJsZS10YWJsZSBpcyBtYXJrZWQgdG8gaGlnaGxpZ2h0IGN1cnJlbnQgcm93XHJcbiAgICAgICAgICAgIHRoaXMuaXNQYXJlbnRIaWdobGlnaHQgPSB0aGlzLnBhcmVudENvbGxhcHNpYmxlVGFibGUuaGlnaGxpZ2h0O1xyXG4gICAgICAgICAgICB0aGlzLnBhcmVudEhpZ2hsaWdodFJvd0JhY2tncm91bmRDb2xvciA9IHRoaXMucGFyZW50Q29sbGFwc2libGVUYWJsZS5oaWdobGlnaHRDb2xvciB8fFxyXG4gICAgICAgICAgICAgICAgQ29sbGFwc2libGVUYWJsZVJvd0NvbXBvbmVudC5ERUZBVUxUX0hJR0hMSUdIVF9ST1dfQ09MT1I7XHJcbiAgICAgICAgICAgIHRoaXMucGFyZW50SGlnaGxpZ2h0Um93VGV4dENvbG9yID0gdGhpcy5wYXJlbnRDb2xsYXBzaWJsZVRhYmxlLmhpZ2hsaWdodFRleHRDb2xvciB8fFxyXG4gICAgICAgICAgICAgICAgQ29sbGFwc2libGVUYWJsZVJvd0NvbXBvbmVudC5ERUZBVUxUX1JPV19URVhUX0NPTE9SO1xyXG5cclxuICAgICAgICAgICAgLy8gY2hlY2sgaWYgY29sbGFwc2libGUtdGFibGUgc3BlY2lmaWVzIHRoZSBhY3RpdmUgcm93IGNvbG9yXHJcbiAgICAgICAgICAgIHRoaXMuYWN0aXZlUm93QmFja2dyb3VuZENvbG9yID0gdGhpcy5wYXJlbnRDb2xsYXBzaWJsZVRhYmxlLmFjdGl2ZUNvbG9yIHx8XHJcbiAgICAgICAgICAgICAgICBDb2xsYXBzaWJsZVRhYmxlUm93Q29tcG9uZW50LkRFRkFVTFRfQUNUSVZFX1JPV19DT0xPUjtcclxuICAgICAgICAgICAgdGhpcy5hY3RpdmVSb3dUZXh0Q29sb3IgPSB0aGlzLnBhcmVudENvbGxhcHNpYmxlVGFibGUuYWN0aXZlVGV4dENvbG9yIHx8XHJcbiAgICAgICAgICAgICAgICBDb2xsYXBzaWJsZVRhYmxlUm93Q29tcG9uZW50LkRFRkFVTFRfUk9XX1RFWFRfQ09MT1I7XHJcblxyXG4gICAgICAgICAgICAvLyBjaGVjayBpZiBjb2xsYXBzaWJsZS10YWJsZSBhbGxvd3Mgc2VsZWN0aW5nIHJvd3NcclxuICAgICAgICAgICAgdGhpcy5wYXJlbnRBbGxvd3NTZWxlY3QgPSB0aGlzLnBhcmVudENvbGxhcHNpYmxlVGFibGUuc2VsZWN0O1xyXG4gICAgICAgICAgICB0aGlzLnBhcmVudEFsbG93c1NlbGVjdE11bHRpcGxlUm93cyA9IHRoaXMucGFyZW50Q29sbGFwc2libGVUYWJsZS5zZWxlY3RNdWx0aXBsZVJvd3M7XHJcblxyXG4gICAgICAgICAgICAvLyBjaGVjayBpZiBjb2xsYXBzaWJsZS10YWJsZSBzcGVjaWZpZXMgYSBjb2xvciBmb3IgdGhlIHNlbGVjdGVkIHJvd1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkUm93QmFja2dyb3VuZENvbG9yID0gdGhpcy5wYXJlbnRDb2xsYXBzaWJsZVRhYmxlLnNlbGVjdENvbG9yIHx8XHJcbiAgICAgICAgICAgICAgICBDb2xsYXBzaWJsZVRhYmxlUm93Q29tcG9uZW50LkRFRkFVTFRfU0VMRUNURURfUk9XX0NPTE9SO1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkUm93VGV4dENvbG9yID0gdGhpcy5wYXJlbnRDb2xsYXBzaWJsZVRhYmxlLnNlbGVjdFRleHRDb2xvciB8fFxyXG4gICAgICAgICAgICAgICAgQ29sbGFwc2libGVUYWJsZVJvd0NvbXBvbmVudC5ERUZBVUxUX1JPV19URVhUX0NPTE9SO1xyXG5cclxuICAgICAgICAgICAgLy8gY2hlY2sgaWYgY29sbGFwc2libGUtdGFibGUgYWxsb3dzIHRvIGRlc2VsZWN0IHJvd3NcclxuICAgICAgICAgICAgdGhpcy5wYXJlbnRBbGxvd3NEZXNlbGVjdGluZ1Jvd3MgPSB0aGlzLnBhcmVudENvbGxhcHNpYmxlVGFibGUuYWxsb3dEZXNlbGVjdGluZ1Jvd3MgIT0gbnVsbCA/XHJcbiAgICAgICAgICAgICAgICB0aGlzLnBhcmVudENvbGxhcHNpYmxlVGFibGUuYWxsb3dEZXNlbGVjdGluZ1Jvd3MgOiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgbmdBZnRlckNvbnRlbnRJbml0KCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMudXBkYXRlUm93KCk7XHJcbiAgICB9XHJcblxyXG4gICAgdXBkYXRlUm93KCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IGVsZW06IEVsZW1lbnQgPSB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQ7XHJcblxyXG4gICAgICAgIC8vIGRldGVybWluZSBpZiB0aGUgcm93IGlzIGluc2lkZSB0aGUgJ3RoZWFkJ1xyXG4gICAgICAgIGNvbnN0IHRoID0gZWxlbS5xdWVyeVNlbGVjdG9yKCd0aCcpO1xyXG4gICAgICAgIGlmICh0aCAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaXNIZWFkUm93ID0gdHJ1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIGRldGVybWluZSBpZiB0aGUgcm93IGlzIGluc2lkZSB0aGUgJ3Rib2R5J1xyXG4gICAgICAgIGNvbnN0IHRkID0gZWxlbS5xdWVyeVNlbGVjdG9yKCd0ZCcpO1xyXG4gICAgICAgIGlmICh0ZCAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaXNCb2R5Um93ID0gdHJ1ZTtcclxuICAgICAgICAgICAgLy8gZGV0ZXJtaW5lIGlmIHRoZSByb3cgaXMgJ29kZCcgb3IgJ2V2ZW50J1xyXG4gICAgICAgICAgICBpZiAodGhpcy5pbmRleCAlIDIgPT09IDApIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaXNFdmVuUm93ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIHRoaXMucGFyZW50U3RyaXBlZFJvd0JhY2tncm91bmRDb2xvciA9IHRoaXMucGFyZW50Q29sbGFwc2libGVUYWJsZS5zdHJpcGVkRXZlbkNvbG9yIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgQ29sbGFwc2libGVUYWJsZVJvd0NvbXBvbmVudC5ERUZBVUxUX1NUUklQRURfRVZFTl9ST1dfQ09MT1I7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnBhcmVudFN0cmlwZWRSb3dUZXh0Q29sb3IgPSB0aGlzLnBhcmVudENvbGxhcHNpYmxlVGFibGUuc3RyaXBlZEV2ZW5UZXh0Q29sb3IgfHxcclxuICAgICAgICAgICAgICAgICAgICBDb2xsYXBzaWJsZVRhYmxlUm93Q29tcG9uZW50LkRFRkFVTFRfUk9XX1RFWFRfQ09MT1I7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmlzT2RkUm93ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIHRoaXMucGFyZW50U3RyaXBlZFJvd0JhY2tncm91bmRDb2xvciA9IHRoaXMucGFyZW50Q29sbGFwc2libGVUYWJsZS5zdHJpcGVkT2RkQ29sb3IgfHxcclxuICAgICAgICAgICAgICAgICAgICBDb2xsYXBzaWJsZVRhYmxlUm93Q29tcG9uZW50LkRFRkFVTFRfU1RSSVBFRF9PRERfUk9XX0NPTE9SO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5wYXJlbnRTdHJpcGVkUm93VGV4dENvbG9yID0gdGhpcy5wYXJlbnRDb2xsYXBzaWJsZVRhYmxlLnN0cmlwZWRPZGRUZXh0Q29sb3IgfHxcclxuICAgICAgICAgICAgICAgICAgICBDb2xsYXBzaWJsZVRhYmxlUm93Q29tcG9uZW50LkRFRkFVTFRfUk9XX1RFWFRfQ09MT1I7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHN3aXRjaCAodHJ1ZSkge1xyXG4gICAgICAgICAgICAgICAgY2FzZSB0aGlzLnBhcmVudEFsbG93c1NlbGVjdCAmJiB0aGlzLnNlbGVjdGVkOlxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucm93QmFja2dyb3VuZENvbG9yID0gdGhpcy5zZWxlY3RlZFJvd0JhY2tncm91bmRDb2xvcjtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJvd1RleHRDb2xvciA9IHRoaXMuc2VsZWN0ZWRSb3dUZXh0Q29sb3I7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIHRoaXMuaXNQYXJlbnRTdHJpcGVkOlxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucm93QmFja2dyb3VuZENvbG9yID0gdGhpcy5wYXJlbnRTdHJpcGVkUm93QmFja2dyb3VuZENvbG9yO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucm93VGV4dENvbG9yID0gdGhpcy5wYXJlbnRTdHJpcGVkUm93VGV4dENvbG9yO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZXRIZWlnaHQoKTogbnVtYmVyIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5lbC5uYXRpdmVFbGVtZW50Lm9mZnNldEhlaWdodDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGlzTGVmdE1vdXNlQnV0dG9uKGV2ZW50OiBNb3VzZUV2ZW50KTogYm9vbGVhbiB7XHJcbiAgICAgICAgY29uc3QgYnV0dG9uOiBudW1iZXIgPSBldmVudC5idXR0b247XHJcbiAgICAgICAgY29uc3Qgd2hpY2g6IG51bWJlciA9IGV2ZW50Wyd3aGljaCddO1xyXG4gICAgICAgIGNvbnN0IHRhcmdldCA9IDxIVE1MRWxlbWVudD4oZXZlbnQudGFyZ2V0IHx8IGV2ZW50LnNyY0VsZW1lbnQgfHwgZXZlbnQuY3VycmVudFRhcmdldCk7XHJcblxyXG4gICAgICAgIGlmIChbJ1RSJywgJ1REJ10uaW5kZXhPZih0YXJnZXQudGFnTmFtZSkgPiAtMSkge1xyXG4gICAgICAgICAgICBpZiAoJ2J1dHRvbicgaW4gZXZlbnQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBidXR0b24gPT09IDA7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gKHdoaWNoIHx8IGJ1dHRvbikgPT09IDE7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBASG9zdExpc3RlbmVyKCdtb3VzZWRvd24nLCBbJyRldmVudCddKVxyXG4gICAgbW91c2Vkb3duKGV2ZW50OiBNb3VzZUV2ZW50KSB7XHJcbiAgICAgICAgLy8gaGFuZGxlIG9ubHkgaWYgdGhlIExlZnQgbW91c2UgYnV0dG9uIHByZXNzZWRcclxuICAgICAgICAvLyBhbmQgdGhlIHJvdyBpcyBhIGJvZHkgcm93XHJcbiAgICAgICAgaWYgKHRoaXMuaXNMZWZ0TW91c2VCdXR0b24oZXZlbnQpICYmIHRoaXMuaXNCb2R5Um93KSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnBhcmVudENvbGxhcHNpYmxlVGFibGUubm9UZXh0U2VsZWN0KSB7XHJcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmlzQm9keVJvdykge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucGFyZW50QWxsb3dzU2VsZWN0ICYmICF0aGlzLnBhcmVudEFsbG93c0Rlc2VsZWN0aW5nUm93cykge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJldlNlbGVjdGVkUm93cyA9IHRoaXMucGFyZW50Q29sbGFwc2libGVUYWJsZS5zZWxlY3RlZFJvd3M7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXJlbnRDb2xsYXBzaWJsZVRhYmxlLmNsZWFyU2VsZWN0ZWRSb3dzKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXJlbnRDb2xsYXBzaWJsZVRhYmxlLmRlc2VsZWN0QWxsUm93cygpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5yb3dCYWNrZ3JvdW5kQ29sb3IgPSB0aGlzLmFjdGl2ZVJvd0JhY2tncm91bmRDb2xvcjtcclxuICAgICAgICAgICAgICAgIHRoaXMucm93VGV4dENvbG9yID0gdGhpcy5hY3RpdmVSb3dUZXh0Q29sb3I7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgQEhvc3RMaXN0ZW5lcignbW91c2V1cCcsIFsnJGV2ZW50J10pXHJcbiAgICBtb3VzZXVwKGV2ZW50OiBNb3VzZUV2ZW50KSB7XHJcbiAgICAgICAgLy8gaGFuZGxlIG9ubHkgaWYgdGhlIExlZnQgbW91c2UgYnV0dG9uIHByZXNzZWRcclxuICAgICAgICAvLyBhbmQgdGhlIHJvdyBpcyBhIGJvZHkgcm93XHJcbiAgICAgICAgaWYgKHRoaXMuaXNMZWZ0TW91c2VCdXR0b24oZXZlbnQpICYmIHRoaXMuaXNCb2R5Um93KSB7XHJcbiAgICAgICAgICAgIC8vIGhhbmRsZSBzZWxlY3Rpb25cclxuICAgICAgICAgICAgaWYgKHRoaXMucGFyZW50QWxsb3dzU2VsZWN0KSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMucGFyZW50QWxsb3dzRGVzZWxlY3RpbmdSb3dzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXJlbnRDb2xsYXBzaWJsZVRhYmxlLnNlbGVjdFJvdyh0aGlzLmluZGV4KTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLmRyYWdTZWxlY3Rpb24pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXJlbnRDb2xsYXBzaWJsZVRhYmxlLnRvZ2dsZVJvd1NlbGVjdGlvbih0aGlzLmluZGV4KTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIGNoZWNrIHJvdyBzdGF0ZVxyXG4gICAgICAgICAgICB0aGlzLnBhcmVudENvbGxhcHNpYmxlVGFibGUudXBkYXRlVGFibGUoKTtcclxuICAgICAgICAgICAgLypzd2l0Y2ggKHRydWUpIHtcclxuICAgICAgICAgICAgICAgIC8vIHBhcmVudCBhbGxvd3Mgc2VsZWN0aW5nIHJvd3MgYW5kIHRoZSByb3cgaXMgc2VsZWN0ZWRcclxuICAgICAgICAgICAgICAgIGNhc2UgdGhpcy5wYXJlbnRBbGxvd3NTZWxlY3QgJiYgdGhpcy5zZWxlY3RlZDpcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJvd0JhY2tncm91bmRDb2xvciA9IHRoaXMuc2VsZWN0ZWRSb3dCYWNrZ3JvdW5kQ29sb3I7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yb3dUZXh0Q29sb3IgPSB0aGlzLnNlbGVjdGVkUm93VGV4dENvbG9yO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGFyZW50Q29sbGFwc2libGVUYWJsZS51cGRhdGVUYWJsZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgLy8gaGlnaGxpZ2h0ZWRcclxuICAgICAgICAgICAgICAgIGNhc2UgdGhpcy5pc1BhcmVudEhpZ2hsaWdodDpcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJvd0JhY2tncm91bmRDb2xvciA9IHRoaXMucGFyZW50SGlnaGxpZ2h0Um93QmFja2dyb3VuZENvbG9yO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucm93VGV4dENvbG9yID0gdGhpcy5wYXJlbnRIaWdobGlnaHRSb3dUZXh0Q29sb3I7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAvLyBzdHJpcGVkXHJcbiAgICAgICAgICAgICAgICBjYXNlIHRoaXMuaXNQYXJlbnRTdHJpcGVkOlxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucm93QmFja2dyb3VuZENvbG9yID0gdGhpcy5wYXJlbnRTdHJpcGVkUm93QmFja2dyb3VuZENvbG9yO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucm93VGV4dENvbG9yID0gdGhpcy5wYXJlbnRTdHJpcGVkUm93VGV4dENvbG9yO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJvd0JhY2tncm91bmRDb2xvciA9IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJvd1RleHRDb2xvciA9IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfSovXHJcblxyXG4gICAgICAgICAgICAvLyBzZWxlY3QgbXVsdGlwbGUgcm93cyB1c2luZyB0aGUgJ1NoaWZ0JyBrZXlcclxuICAgICAgICAgICAgaWYgKHRoaXMucGFyZW50QWxsb3dzU2VsZWN0ICYmXHJcbiAgICAgICAgICAgICAgICB0aGlzLnBhcmVudEFsbG93c1NlbGVjdE11bHRpcGxlUm93cyAmJlxyXG4gICAgICAgICAgICAgICAgZXZlbnQgIT0gbnVsbCAmJiBldmVudC5zaGlmdEtleSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucHJldlNlbGVjdGVkUm93cyAhPSBudWxsICYmXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wcmV2U2VsZWN0ZWRSb3dzLmxlbmd0aCA+IDAgJiZcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnBhcmVudENvbGxhcHNpYmxlVGFibGUuc2VsZWN0ZWRSb3dzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCByYW5nZVNlbGVjdGVkUm93cyA9IHRoaXMucHJldlNlbGVjdGVkUm93cy5jb25jYXQodGhpcy5wYXJlbnRDb2xsYXBzaWJsZVRhYmxlLnNlbGVjdGVkUm93cyk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmFuZ2VTZWxlY3RlZFJvd3Muc29ydCgoYSwgYikgPT4gYSAtIGIpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZpcnN0Um93SW5kZXggPSBNYXRoLm1pbi5hcHBseShudWxsLCByYW5nZVNlbGVjdGVkUm93cyk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFzdFJvd0luZGV4ID0gTWF0aC5tYXguYXBwbHkobnVsbCwgcmFuZ2VTZWxlY3RlZFJvd3MpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnBhcmVudENvbGxhcHNpYmxlVGFibGUuc2VsZWN0Um93cyhmaXJzdFJvd0luZGV4LCBsYXN0Um93SW5kZXgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBzZXQgZHJhZ1NlbGVjdGlvbiBmbGFnIHRvIGZhbHNlLiBQcmV2ZW50cyBzZWxlY3Rpb24gZHJhZyBiZWhhdmlvclxyXG4gICAgICAgICAgICB0aGlzLmRyYWdTZWxlY3Rpb24gPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgIC8vIGZvY3VzIHRoZSBjb2xsYXBzaWJsZSB0YWJsZVxyXG4gICAgICAgICAgICB0aGlzLnBhcmVudENvbGxhcHNpYmxlVGFibGUuZm9jdXMoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgQEhvc3RMaXN0ZW5lcignbW91c2VlbnRlcicsIFsnJGV2ZW50J10pXHJcbiAgICBtb3VzZWVudGVyKGV2ZW50OiBNb3VzZUV2ZW50KSB7XHJcbiAgICAgICAgLy8gaGFuZGxlIG9ubHkgaWYgdGhlIHJvdyBpcyBhIGJvZHkgcm93XHJcbiAgICAgICAgaWYgKHRoaXMuaXNCb2R5Um93KSB7XHJcbiAgICAgICAgICAgIHN3aXRjaCAodHJ1ZSkge1xyXG4gICAgICAgICAgICAgICAgLy8gdGhlIHVzZSBpcyB0cnlpbmcgdG8gc2VsZWN0IG11bHRpcGxlIHJvd3MgYnkgaG9sZGluZyBhIG1vdXNlIGJ1dHRvblxyXG4gICAgICAgICAgICAgICAgY2FzZSB0aGlzLnBhcmVudEFsbG93c1NlbGVjdCAmJiB0aGlzLnBhcmVudEFsbG93c1NlbGVjdE11bHRpcGxlUm93cyAmJiB0aGlzLnBhcmVudENvbGx