jw-bootstrap-switch-ng2
Version:
Bootstrap Switch for Angular 2+
926 lines • 66.3 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Component, ElementRef, Input, Output, HostListener, forwardRef, EventEmitter, ViewChild, Renderer2, ChangeDetectorRef } from '@angular/core';
import { NG_VALUE_ACCESSOR } from '@angular/forms';
/** @type {?} */
var callback = function () {
};
var ɵ0 = callback;
/** @type {?} */
var CUSTOM_INPUT = {
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(function () { return JwBootstrapSwitchNg2Component; }),
multi: true
};
var JwBootstrapSwitchNg2Component = /** @class */ (function () {
function JwBootstrapSwitchNg2Component(cd, render) {
this.cd = cd;
this.render = render;
// Defining Default Options for Switch
this.handleWidth = 0;
this.labelWidth = 0;
this.labelText = '';
this.inverse = false;
this.baseClass = 'bootstrap-switch';
this.onText = 'ON';
this.offText = 'OFF';
this.disabled = false;
this.readonly = false;
this._focused = false;
this._size = 'normal';
this._animate = true;
this._innerAnimate = true;
this._indeterminate = false;
this._onColor = 'primary';
this._offColor = 'default';
this._wrapperClass = 'wrapper';
this._innerState = false;
this._innerHandleWidth = 'auto';
this._innerLabelWidth = 'auto';
this._dragStart = null;
this._dragEnd = null;
this._onTouchedCallback = callback;
this._onChangeCallback = callback;
this.changeState = new EventEmitter();
}
/**
* @private
* @return {?}
*/
JwBootstrapSwitchNg2Component.prototype.$on = /**
* @private
* @return {?}
*/
function () {
return this.on.nativeElement;
};
/**
* @private
* @return {?}
*/
JwBootstrapSwitchNg2Component.prototype.$off = /**
* @private
* @return {?}
*/
function () {
return this.off.nativeElement;
};
/**
* @private
* @return {?}
*/
JwBootstrapSwitchNg2Component.prototype.$label = /**
* @private
* @return {?}
*/
function () {
return this.label.nativeElement;
};
/**
* @private
* @return {?}
*/
JwBootstrapSwitchNg2Component.prototype.$container = /**
* @private
* @return {?}
*/
function () {
return this.container.nativeElement;
};
/**
* @description: Function to set the Classes for the Wrapper Div
* @returns string
*/
/**
* \@description: Function to set the Classes for the Wrapper Div
* @return {?} string
*/
JwBootstrapSwitchNg2Component.prototype.getWrapperClasses = /**
* \@description: Function to set the Classes for the Wrapper Div
* @return {?} string
*/
function () {
/** @type {?} */
var output = this.baseClass + ' ' + this.baseClass + '-' + this._wrapperClass;
if (this._focused) {
output += ' ' + this.baseClass + '-focused';
}
if (this.readonly) {
output += ' ' + this.baseClass + '-readonly';
}
if (this._size != null) {
output += ' ' + this.baseClass + '-' + this._size;
}
if (this._innerState) {
output += ' ' + this.baseClass + '-on';
}
else {
output += ' ' + this.baseClass + '-off';
}
if (this._animate) {
output += ' ' + this.baseClass + '-animate';
}
if (this.disabled) {
output += ' ' + this.baseClass + '-disabled';
}
if (this._indeterminate || this._innerState === null || typeof this._innerState === 'undefined') {
output += ' ' + this.baseClass + '-indeterminate';
}
if (this.inverse) {
output += ' ' + this.baseClass + '-inverse';
}
return output;
};
/**
* @description Function to set the css classes for #on
* @returns string
*/
/**
* \@description Function to set the css classes for #on
* @return {?} string
*/
JwBootstrapSwitchNg2Component.prototype.getOnClasses = /**
* \@description Function to set the css classes for #on
* @return {?} string
*/
function () {
/** @type {?} */
var output = this.baseClass + '-handle-on';
if (this._onColor) {
output += ' ' + this.baseClass + '-' + this._onColor;
}
return output;
};
/**
* @description Function to set the css classes for #off
* @returns string
*/
/**
* \@description Function to set the css classes for #off
* @return {?} string
*/
JwBootstrapSwitchNg2Component.prototype.getOffClasses = /**
* \@description Function to set the css classes for #off
* @return {?} string
*/
function () {
/** @type {?} */
var output = this.baseClass + '-handle-off';
if (this._offColor) {
output += ' ' + this.baseClass + '-' + this._offColor;
}
return output;
};
/**
* @description Function set the marging of the #label when change the state
* @returns string
*/
/**
* \@description Function set the marging of the #label when change the state
* @return {?} string
*/
JwBootstrapSwitchNg2Component.prototype.getLabelMarginLeft = /**
* \@description Function set the marging of the #label when change the state
* @return {?} string
*/
function () {
/** @type {?} */
var width = (this.inverse) ? -this.handleWidth : 0;
if (this._indeterminate || this._innerState === null || typeof this._innerState === 'undefined') {
width = -(this.handleWidth / 2);
}
else if (this._dragEnd) {
width = this._dragEnd;
}
else if (!this._innerState) {
if (!this.inverse) {
width = -this.handleWidth;
}
else {
width = 0;
}
}
return width + 'px';
};
/**
* @param {?} changes
* @return {?}
*/
JwBootstrapSwitchNg2Component.prototype.ngOnChanges = /**
* @param {?} changes
* @return {?}
*/
function (changes) {
if (changes['setLabelText'] ||
changes['setOnText'] ||
changes['setHandleWidth'] ||
changes['setLabelWidth'] ||
changes['setOffText'] ||
changes['setSize']) {
this.calculateWith(true);
}
};
/**
* @return {?}
*/
JwBootstrapSwitchNg2Component.prototype.ngAfterViewInit = /**
* @return {?}
*/
function () {
this.calculateWith();
};
/**
* @return {?}
*/
JwBootstrapSwitchNg2Component.prototype.onClick = /**
* @return {?}
*/
function () {
if (!this.disabled && !this.readonly && !this._dragEnd) {
this.setStateValue(!this._innerState);
}
else if (this._dragEnd) {
this._dragEnd = null;
}
};
/**
* @param {?} e
* @return {?}
*/
JwBootstrapSwitchNg2Component.prototype.onKeyDown = /**
* @param {?} e
* @return {?}
*/
function (e) {
if (!e.which || this.disabled || this.readonly) {
return;
}
switch (e.which) {
case 37:
e.preventDefault();
e.stopImmediatePropagation();
this.setStateValue(false);
break;
case 39:
e.preventDefault();
e.stopImmediatePropagation();
this.setStateValue(true);
break;
}
};
/**
* @private
* @param {?} e
* @return {?}
*/
JwBootstrapSwitchNg2Component.prototype.onDragStart = /**
* @private
* @param {?} e
* @return {?}
*/
function (e) {
if (e.target === this.$label()) {
if (this._dragStart || this.disabled || this.readonly) {
return;
}
e.preventDefault();
e.stopPropagation();
this._dragStart = (e.pageX || e.touches[0].pageX) - parseInt(this.$container().style.marginLeft, 10);
if (this._animate) {
this._animate = !this._animate;
}
}
};
/**
* @private
* @param {?} e
* @return {?}
*/
JwBootstrapSwitchNg2Component.prototype.onDragMove = /**
* @private
* @param {?} e
* @return {?}
*/
function (e) {
if (this._dragStart) {
e.preventDefault();
/** @type {?} */
var difference = (e.pageX || e.touches[0].pageX) - this._dragStart;
if (difference < -Number(this.handleWidth) || difference > 0) {
return;
}
this._dragEnd = difference;
}
};
/**
* @private
* @param {?} e
* @param {?=} removeDragEnd
* @return {?}
*/
JwBootstrapSwitchNg2Component.prototype.onDragEnd = /**
* @private
* @param {?} e
* @param {?=} removeDragEnd
* @return {?}
*/
function (e, removeDragEnd) {
if (removeDragEnd === void 0) { removeDragEnd = false; }
if (this._dragStart) {
e.preventDefault();
e.stopPropagation();
if (this._dragEnd) {
/** @type {?} */
var state = this._dragEnd > -(Number(this.handleWidth) / 2);
this.setStateValue((this.inverse) ? !state : state);
}
this._dragStart = null;
if (removeDragEnd) {
this._dragEnd = null;
}
if (this._innerAnimate) {
this._animate = true;
}
}
};
/**
* @param {?} e
* @return {?}
*/
JwBootstrapSwitchNg2Component.prototype.onTouchStart = /**
* @param {?} e
* @return {?}
*/
function (e) {
this.onDragStart(e);
};
/**
* @param {?} e
* @return {?}
*/
JwBootstrapSwitchNg2Component.prototype.onMouseDown = /**
* @param {?} e
* @return {?}
*/
function (e) {
this.onDragStart(e);
};
/**
* @param {?} e
* @return {?}
*/
JwBootstrapSwitchNg2Component.prototype.onTouchMove = /**
* @param {?} e
* @return {?}
*/
function (e) {
this.onDragMove(e);
};
/**
* @param {?} e
* @return {?}
*/
JwBootstrapSwitchNg2Component.prototype.onMouseMove = /**
* @param {?} e
* @return {?}
*/
function (e) {
this.onDragMove(e);
};
/**
* @param {?} e
* @return {?}
*/
JwBootstrapSwitchNg2Component.prototype.onMouseUp = /**
* @param {?} e
* @return {?}
*/
function (e) {
this.onDragEnd(e);
};
/**
* @param {?} e
* @return {?}
*/
JwBootstrapSwitchNg2Component.prototype.onTouchEnd = /**
* @param {?} e
* @return {?}
*/
function (e) {
this.onDragEnd(e, true);
};
/**
* @param {?} e
* @return {?}
*/
JwBootstrapSwitchNg2Component.prototype.onMouseLeave = /**
* @param {?} e
* @return {?}
*/
function (e) {
this.onDragEnd(e, true);
};
/**
* @return {?}
*/
JwBootstrapSwitchNg2Component.prototype.onFocus = /**
* @return {?}
*/
function () {
this._focused = true;
};
/**
* @return {?}
*/
JwBootstrapSwitchNg2Component.prototype.onBlur = /**
* @return {?}
*/
function () {
this._focused = false;
this._onTouchedCallback();
};
/**
* @description Function to make recalculate the size of the elements when options change
* @param disableAnimation
*/
/**
* \@description Function to make recalculate the size of the elements when options change
* @private
* @param {?=} disableAnimation
* @return {?}
*/
JwBootstrapSwitchNg2Component.prototype.calculateWith = /**
* \@description Function to make recalculate the size of the elements when options change
* @private
* @param {?=} disableAnimation
* @return {?}
*/
function (disableAnimation) {
var _this = this;
if (disableAnimation === void 0) { disableAnimation = false; }
if (disableAnimation && this._innerAnimate) {
this._animate = false;
}
setTimeout(function () {
_this.render.setStyle(_this.$on(), 'width', 'auto');
_this.render.setStyle(_this.$off(), 'width', 'auto');
_this.render.setStyle(_this.$label(), 'width', 'auto');
/** @type {?} */
var width = (_this._innerHandleWidth === 'auto')
? Math.max(_this.$on().offsetWidth, _this.$off().offsetWidth)
: _this._innerHandleWidth;
if (_this.$label().offsetWidth < width) {
if (_this._innerLabelWidth === 'auto') {
_this.labelWidth = Number(width);
}
else {
_this.labelWidth = Number(_this._innerLabelWidth);
}
}
else {
if (_this._innerLabelWidth === 'auto') {
_this.labelWidth = _this.$label().offsetWidth;
}
else {
_this.labelWidth = Number(_this._innerLabelWidth);
}
}
_this.handleWidth = Number(width);
_this.render.setStyle(_this.$label(), 'width', _this.labelWidth + 'px');
_this.render.setStyle(_this.$on(), 'width', _this.handleWidth + 'px');
_this.render.setStyle(_this.$off(), 'width', _this.handleWidth + 'px');
setTimeout(function () {
if (disableAnimation && _this._innerAnimate) {
_this._animate = true;
}
});
_this.cd.markForCheck();
});
};
Object.defineProperty(JwBootstrapSwitchNg2Component.prototype, "setBaseClass", {
// Functions to set inputs and the private variables of the Switch
set:
// Functions to set inputs and the private variables of the Switch
/**
* @param {?} value
* @return {?}
*/
function (value) {
this.baseClass = value;
},
enumerable: true,
configurable: true
});
Object.defineProperty(JwBootstrapSwitchNg2Component.prototype, "setWrapperClass", {
set: /**
* @param {?} value
* @return {?}
*/
function (value) {
this._wrapperClass = value;
},
enumerable: true,
configurable: true
});
Object.defineProperty(JwBootstrapSwitchNg2Component.prototype, "setOffText", {
set: /**
* @param {?} value
* @return {?}
*/
function (value) {
this.offText = (value) ? value : 'OFF';
},
enumerable: true,
configurable: true
});
Object.defineProperty(JwBootstrapSwitchNg2Component.prototype, "setLabelText", {
set: /**
* @param {?} value
* @return {?}
*/
function (value) {
this.labelText = value;
},
enumerable: true,
configurable: true
});
Object.defineProperty(JwBootstrapSwitchNg2Component.prototype, "setOnText", {
set: /**
* @param {?} value
* @return {?}
*/
function (value) {
this.onText = (value) ? value : 'ON';
},
enumerable: true,
configurable: true
});
Object.defineProperty(JwBootstrapSwitchNg2Component.prototype, "setSize", {
set: /**
* @param {?} value
* @return {?}
*/
function (value) {
if (value) {
this._size = value;
}
},
enumerable: true,
configurable: true
});
Object.defineProperty(JwBootstrapSwitchNg2Component.prototype, "setAnimate", {
set: /**
* @param {?} value
* @return {?}
*/
function (value) {
this._animate = value;
this._innerAnimate = value;
},
enumerable: true,
configurable: true
});
Object.defineProperty(JwBootstrapSwitchNg2Component.prototype, "setOnColor", {
set: /**
* @param {?} value
* @return {?}
*/
function (value) {
if (value) {
this._onColor = value;
}
},
enumerable: true,
configurable: true
});
Object.defineProperty(JwBootstrapSwitchNg2Component.prototype, "setOffColor", {
set: /**
* @param {?} value
* @return {?}
*/
function (value) {
if (value) {
this._offColor = value;
}
},
enumerable: true,
configurable: true
});
Object.defineProperty(JwBootstrapSwitchNg2Component.prototype, "setDisabled", {
set: /**
* @param {?} value
* @return {?}
*/
function (value) {
this.disabled = value;
},
enumerable: true,
configurable: true
});
Object.defineProperty(JwBootstrapSwitchNg2Component.prototype, "setReadOnly", {
set: /**
* @param {?} value
* @return {?}
*/
function (value) {
this.readonly = value;
},
enumerable: true,
configurable: true
});
Object.defineProperty(JwBootstrapSwitchNg2Component.prototype, "setIndeterminate", {
set: /**
* @param {?} value
* @return {?}
*/
function (value) {
this._indeterminate = value;
},
enumerable: true,
configurable: true
});
Object.defineProperty(JwBootstrapSwitchNg2Component.prototype, "setInverse", {
set: /**
* @param {?} value
* @return {?}
*/
function (value) {
this.inverse = value;
},
enumerable: true,
configurable: true
});
Object.defineProperty(JwBootstrapSwitchNg2Component.prototype, "setHandleWidth", {
set: /**
* @param {?} value
* @return {?}
*/
function (value) {
this._innerHandleWidth = (typeof (value) !== 'undefined') ? value : 'auto';
},
enumerable: true,
configurable: true
});
Object.defineProperty(JwBootstrapSwitchNg2Component.prototype, "setLabelWidth", {
set: /**
* @param {?} value
* @return {?}
*/
function (value) {
this._innerLabelWidth = (typeof (value) !== 'undefined') ? value : 'auto';
},
enumerable: true,
configurable: true
});
Object.defineProperty(JwBootstrapSwitchNg2Component.prototype, "value", {
get: /**
* @return {?}
*/
function () {
return this._innerState;
},
set: /**
* @param {?} v
* @return {?}
*/
function (v) {
if (v === null || typeof v === 'undefined') {
this._indeterminate = true;
}
this.setStateValue(v);
},
enumerable: true,
configurable: true
});
/**
* @private
* @param {?} v
* @return {?}
*/
JwBootstrapSwitchNg2Component.prototype.setStateValue = /**
* @private
* @param {?} v
* @return {?}
*/
function (v) {
if (v !== this._innerState) {
this._onChangeCallback(v);
this.changeState.emit({
previousValue: this._innerState,
currentValue: v
});
this._innerState = v;
}
};
/**
* @param {?} value
* @return {?}
*/
JwBootstrapSwitchNg2Component.prototype.writeValue = /**
* @param {?} value
* @return {?}
*/
function (value) {
if (value !== this._innerState) {
this._innerState = value;
this.cd.markForCheck();
}
};
/**
* @param {?} isDisabled
* @return {?}
*/
JwBootstrapSwitchNg2Component.prototype.setDisabledState = /**
* @param {?} isDisabled
* @return {?}
*/
function (isDisabled) {
this.disabled = isDisabled;
};
/**
* @param {?} fn
* @return {?}
*/
JwBootstrapSwitchNg2Component.prototype.registerOnChange = /**
* @param {?} fn
* @return {?}
*/
function (fn) {
this._onChangeCallback = fn;
};
/**
* @param {?} fn
* @return {?}
*/
JwBootstrapSwitchNg2Component.prototype.registerOnTouched = /**
* @param {?} fn
* @return {?}
*/
function (fn) {
this._onTouchedCallback = fn;
};
JwBootstrapSwitchNg2Component.decorators = [
{ type: Component, args: [{
selector: 'bSwitch',
providers: [CUSTOM_INPUT],
template: "\n <div [ngClass]=\"getWrapperClasses()\" [style.width]=\"(handleWidth + labelWidth ) +'px'\">\n <div #container [ngClass]=\"baseClass + '-container'\"\n [style.width]=\"((handleWidth * 2) + labelWidth) +'px'\"\n [style.margin-left]=\"getLabelMarginLeft()\"><!--\n --><span #on [innerHTML]=\"(inverse) ? offText : onText\"\n [ngClass]=\"(inverse) ? getOffClasses() : getOnClasses()\"></span><!--\n --><span #label [ngClass]=\"baseClass + '-label'\"> {{ labelText }}</span><!--\n --><span #off [innerHTML]=\"(inverse) ? onText : offText\"\n [ngClass]=\"(inverse) ? getOnClasses() : getOffClasses()\"></span><!--\n --><input type=\"checkbox\" [(ngModel)]=\"value\" [readonly]=\"readonly\" [disabled]=\"disabled\"\n (focus)=\"onFocus()\" (blur)=\"onBlur()\">\n </div>\n </div>"
},] },
];
/** @nocollapse */
JwBootstrapSwitchNg2Component.ctorParameters = function () { return [
{ type: ChangeDetectorRef },
{ type: Renderer2 }
]; };
JwBootstrapSwitchNg2Component.propDecorators = {
changeState: [{ type: Output }],
container: [{ type: ViewChild, args: ['container',] }],
on: [{ type: ViewChild, args: ['on',] }],
label: [{ type: ViewChild, args: ['label',] }],
off: [{ type: ViewChild, args: ['off',] }],
onClick: [{ type: HostListener, args: ['click',] }],
onKeyDown: [{ type: HostListener, args: ['keydown', ['$event'],] }],
onTouchStart: [{ type: HostListener, args: ['touchstart', ['$event'],] }],
onMouseDown: [{ type: HostListener, args: ['mousedown', ['$event'],] }],
onTouchMove: [{ type: HostListener, args: ['touchmove', ['$event'],] }],
onMouseMove: [{ type: HostListener, args: ['mousemove', ['$event'],] }],
onMouseUp: [{ type: HostListener, args: ['mouseup', ['$event'],] }],
onTouchEnd: [{ type: HostListener, args: ['touchend', ['$event'],] }],
onMouseLeave: [{ type: HostListener, args: ['mouseleave', ['$event'],] }],
setBaseClass: [{ type: Input, args: ['switch-base-class',] }],
setWrapperClass: [{ type: Input, args: ['switch-wrapper-class',] }],
setOffText: [{ type: Input, args: ['switch-off-text',] }],
setLabelText: [{ type: Input, args: ['switch-label-text',] }],
setOnText: [{ type: Input, args: ['switch-on-text',] }],
setSize: [{ type: Input, args: ['switch-size',] }],
setAnimate: [{ type: Input, args: ['switch-animate',] }],
setOnColor: [{ type: Input, args: ['switch-on-color',] }],
setOffColor: [{ type: Input, args: ['switch-off-color',] }],
setDisabled: [{ type: Input, args: ['switch-disabled',] }],
setReadOnly: [{ type: Input, args: ['switch-readonly',] }],
setIndeterminate: [{ type: Input, args: ['switch-indeterminate',] }],
setInverse: [{ type: Input, args: ['switch-inverse',] }],
setHandleWidth: [{ type: Input, args: ['switch-handle-width',] }],
setLabelWidth: [{ type: Input, args: ['switch-label-width',] }]
};
return JwBootstrapSwitchNg2Component;
}());
export { JwBootstrapSwitchNg2Component };
if (false) {
/** @type {?} */
JwBootstrapSwitchNg2Component.prototype.handleWidth;
/** @type {?} */
JwBootstrapSwitchNg2Component.prototype.labelWidth;
/** @type {?} */
JwBootstrapSwitchNg2Component.prototype.labelText;
/** @type {?} */
JwBootstrapSwitchNg2Component.prototype.inverse;
/** @type {?} */
JwBootstrapSwitchNg2Component.prototype.baseClass;
/** @type {?} */
JwBootstrapSwitchNg2Component.prototype.onText;
/** @type {?} */
JwBootstrapSwitchNg2Component.prototype.offText;
/** @type {?} */
JwBootstrapSwitchNg2Component.prototype.disabled;
/** @type {?} */
JwBootstrapSwitchNg2Component.prototype.readonly;
/**
* @type {?}
* @private
*/
JwBootstrapSwitchNg2Component.prototype._focused;
/**
* @type {?}
* @private
*/
JwBootstrapSwitchNg2Component.prototype._size;
/**
* @type {?}
* @private
*/
JwBootstrapSwitchNg2Component.prototype._animate;
/**
* @type {?}
* @private
*/
JwBootstrapSwitchNg2Component.prototype._innerAnimate;
/**
* @type {?}
* @private
*/
JwBootstrapSwitchNg2Component.prototype._indeterminate;
/**
* @type {?}
* @private
*/
JwBootstrapSwitchNg2Component.prototype._onColor;
/**
* @type {?}
* @private
*/
JwBootstrapSwitchNg2Component.prototype._offColor;
/**
* @type {?}
* @private
*/
JwBootstrapSwitchNg2Component.prototype._wrapperClass;
/**
* @type {?}
* @private
*/
JwBootstrapSwitchNg2Component.prototype._innerState;
/**
* @type {?}
* @private
*/
JwBootstrapSwitchNg2Component.prototype._innerHandleWidth;
/**
* @type {?}
* @private
*/
JwBootstrapSwitchNg2Component.prototype._innerLabelWidth;
/**
* @type {?}
* @private
*/
JwBootstrapSwitchNg2Component.prototype._dragStart;
/**
* @type {?}
* @private
*/
JwBootstrapSwitchNg2Component.prototype._dragEnd;
/**
* @type {?}
* @private
*/
JwBootstrapSwitchNg2Component.prototype._onTouchedCallback;
/**
* @type {?}
* @private
*/
JwBootstrapSwitchNg2Component.prototype._onChangeCallback;
/** @type {?} */
JwBootstrapSwitchNg2Component.prototype.changeState;
/** @type {?} */
JwBootstrapSwitchNg2Component.prototype.container;
/** @type {?} */
JwBootstrapSwitchNg2Component.prototype.on;
/** @type {?} */
JwBootstrapSwitchNg2Component.prototype.label;
/** @type {?} */
JwBootstrapSwitchNg2Component.prototype.off;
/**
* @type {?}
* @private
*/
JwBootstrapSwitchNg2Component.prototype.cd;
/**
* @type {?}
* @private
*/
JwBootstrapSwitchNg2Component.prototype.render;
}
export { ɵ0 };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoianctYm9vdHN0cmFwLXN3aXRjaC1uZzIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vanctYm9vdHN0cmFwLXN3aXRjaC1uZzIvIiwic291cmNlcyI6WyJsaWIvanctYm9vdHN0cmFwLXN3aXRjaC1uZzIuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQ0gsU0FBUyxFQUNULFVBQVUsRUFDVixLQUFLLEVBQ0wsTUFBTSxFQUNOLFlBQVksRUFFWixVQUFVLEVBRVYsWUFBWSxFQUNaLFNBQVMsRUFFVCxTQUFTLEVBQ1QsaUJBQWlCLEVBQ3BCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFFSCxpQkFBaUIsRUFDcEIsTUFBTSxnQkFBZ0IsQ0FBQzs7SUFFbEIsUUFBUSxHQUFHO0FBQ2pCLENBQUM7OztJQUVLLFlBQVksR0FBUTtJQUN0QixPQUFPLEVBQUUsaUJBQWlCO0lBQzFCLFdBQVcsRUFBRSxVQUFVLENBQUMsY0FBTSxPQUFBLDZCQUE2QixFQUE3QixDQUE2QixDQUFDO0lBQzVELEtBQUssRUFBRSxJQUFJO0NBQ2Q7QUFFRDtJQW9LSSx1Q0FBb0IsRUFBcUIsRUFBVSxNQUFpQjtRQUFoRCxPQUFFLEdBQUYsRUFBRSxDQUFtQjtRQUFVLFdBQU0sR0FBTixNQUFNLENBQVc7O1FBL0k3RCxnQkFBVyxHQUFXLENBQUMsQ0FBQztRQUN4QixlQUFVLEdBQVcsQ0FBQyxDQUFDO1FBQ3ZCLGNBQVMsR0FBVyxFQUFFLENBQUM7UUFDdkIsWUFBTyxHQUFZLEtBQUssQ0FBQztRQUN6QixjQUFTLEdBQVcsa0JBQWtCLENBQUM7UUFDdkMsV0FBTSxHQUFXLElBQUksQ0FBQztRQUN0QixZQUFPLEdBQVcsS0FBSyxDQUFDO1FBQ3hCLGFBQVEsR0FBWSxLQUFLLENBQUM7UUFDMUIsYUFBUSxHQUFZLEtBQUssQ0FBQztRQUV6QixhQUFRLEdBQVksS0FBSyxDQUFDO1FBQzFCLFVBQUssR0FBUSxRQUFRLENBQUM7UUFD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SUFDcEQseURBQW1EOzs7OztJQUVuRCxtREFBK0I7Ozs7O0lBQy9CLGlEQUE2Qjs7Ozs7SUFFN0IsMkRBQWtEOzs7OztJQUNsRCwwREFBdUQ7O0lBRXZELG9EQUFtRTs7SUFJbkUsa0RBQThDOztJQUM5QywyQ0FBZ0M7O0lBQ2hDLDhDQUFzQzs7SUFDdEMsNENBQWtDOzs7OztJQTRHdEIsMkNBQTZCOzs7OztJQUFFLCtDQUF5QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgICBDb21wb25lbnQsXHJcbiAgICBFbGVtZW50UmVmLFxyXG4gICAgSW5wdXQsXHJcbiAgICBPdXRwdXQsXHJcbiAgICBIb3N0TGlzdGVuZXIsXHJcbiAgICBBZnRlclZpZXdJbml0LFxyXG4gICAgZm9yd2FyZFJlZixcclxuICAgIFNpbXBsZUNoYW5nZXMsXHJcbiAgICBFdmVudEVtaXR0ZXIsXHJcbiAgICBWaWV3Q2hpbGQsXHJcbiAgICBPbkNoYW5nZXMsXHJcbiAgICBSZW5kZXJlcjIsXHJcbiAgICBDaGFuZ2VEZXRlY3RvclJlZlxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQge1xyXG4gICAgQ29udHJvbFZhbHVlQWNjZXNzb3IsXHJcbiAgICBOR19WQUxVRV9BQ0NFU1NPUlxyXG59IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuXHJcbmNvbnN0IGNhbGxiYWNrID0gKCkgPT4ge1xyXG59O1xyXG5cclxuY29uc3QgQ1VTVE9NX0lOUFVUOiBhbnkgPSB7XHJcbiAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcclxuICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IEp3Qm9vdHN0cmFwU3dpdGNoTmcyQ29tcG9uZW50KSxcclxuICAgIG11bHRpOiB0cnVlXHJcbn07XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICAgIHNlbGVjdG9yOiAnYlN3aXRjaCcsXHJcbiAgICBwcm92aWRlcnM6IFtDVVNUT01fSU5QVVRdLFxyXG4gICAgdGVtcGxhdGU6IGBcclxuICAgICAgPGRpdiBbbmdDbGFzc109XCJnZXRXcmFwcGVyQ2xhc3NlcygpXCIgW3N0eWxlLndpZHRoXT1cIihoYW5kbGVXaWR0aCAgKyBsYWJlbFdpZHRoICkgKydweCdcIj5cclxuICAgICAgICAgIDxkaXYgI2NvbnRhaW5lciBbbmdDbGFzc109XCJiYXNlQ2xhc3MgKyAnLWNvbnRhaW5lcidcIlxyXG4gICAgICAgICAgICAgICBbc3R5bGUud2lkdGhdPVwiKChoYW5kbGVXaWR0aCAqIDIpICsgbGFiZWxXaWR0aCkgKydweCdcIlxyXG4gICAgICAgICAgICAgICBbc3R5bGUubWFyZ2luLWxlZnRdPVwiZ2V0TGFiZWxNYXJnaW5MZWZ0KClcIj48IS0tXHJcbiAgICAgICAgICAgICAgLS0+PHNwYW4gI29uIFtpbm5lckhUTUxdPVwiKGludmVyc2UpID8gb2ZmVGV4dCA6IG9uVGV4dFwiXHJcbiAgICAgICAgICAgICAgICBbbmdDbGFzc109XCIoaW52ZXJzZSkgPyBnZXRPZmZDbGFzc2VzKCkgOiBnZXRPbkNsYXNzZXMoKVwiPjwvc3Bhbj48IS0tXHJcbiAgICAgICAgICAgICAgLS0+PHNwYW4gI2xhYmVsIFtuZ0NsYXNzXT1cImJhc2VDbGFzcyArICctbGFiZWwnXCI+Jm5ic3A7e3sgbGFiZWxUZXh0IH19PC9zcGFuPjwhLS1cclxuICAgICAgICAgICAgICAtLT48c3BhbiAjb2ZmIFtpbm5lckhUTUxdPVwiKGludmVyc2UpID8gb25UZXh0IDogb2ZmVGV4dFwiXHJcbiAgICAgICAgICAgICAgICBbbmdDbGFzc109XCIoaW52ZXJzZSkgPyBnZXRPbkNsYXNzZXMoKSA6IGdldE9mZkNsYXNzZXMoKVwiPjwvc3Bhbj48IS0tXHJcbiAgICAgICAgICAgICAgLS0+PGlucHV0IHR5cGU9XCJjaGVja2JveFwiIFsobmdNb2RlbCldPVwidmFsdWVcIiBbcmVhZG9ubHldPVwicmVhZG9ubHlcIiBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAoZm9jdXMpPVwib25Gb2N1cygpXCIgKGJsdXIpPVwib25CbHVyKClcIj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5gXHJcbn0pXHJcblxyXG5leHBvcnQgY2xhc3MgSndCb290c3RyYXBTd2l0Y2hOZzJDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBDb250cm9sVmFsdWVBY2Nlc3NvciwgT25DaGFuZ2VzIHtcclxuICAgIC8vIERlZmluaW5nIERlZmF1bHQgT3B0aW9ucyBmb3IgU3dpdGNoXHJcbiAgICBwdWJsaWMgaGFuZGxlV2lkdGg6IG51bWJlciA9IDA7XHJcbiAgICBwdWJsaWMgbGFiZWxXaWR0aDogbnVtYmVyID0gMDtcclxuICAgIHB1YmxpYyBsYWJlbFRleHQ6IHN0cmluZyA9ICcnO1xyXG4gICAgcHVibGljIGludmVyc2U6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIHB1YmxpYyBiYXNlQ2xhc3M6IHN0cmluZyA9ICdib290c3RyYXAtc3dpdGNoJztcclxuICAgIHB1YmxpYyBvblRleHQ6IHN0cmluZyA9ICdPTic7XHJcbiAgICBwdWJsaWMgb2ZmVGV4dDogc3RyaW5nID0gJ09GRic7XHJcbiAgICBwdWJsaWMgZGlzYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIHB1YmxpYyByZWFkb25seTogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIHByaXZhdGUgX2ZvY3VzZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIHByaXZhdGUgX3NpemU6IGFueSA9ICdub3JtYWwnO1xyXG4gICAgcHJpdmF0ZSBfYW5pbWF0ZTogYm9vbGVhbiA9IHRydWU7XHJcbiAgICBwcml2YXRlIF9pbm5lckFuaW1hdGU6IGJvb2xlYW4gPSB0cnVlO1xyXG4gICAgcHJpdmF0ZSBfaW5kZXRlcm1pbmF0ZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgcHJpdmF0ZSBfb25Db2xvcjogc3RyaW5nID0gJ3ByaW1hcnknO1xyXG4gICAgcHJpdmF0ZSBfb2ZmQ29sb3I6IHN0cmluZyA9ICdkZWZhdWx0JztcclxuICAgIHByaXZhdGUgX3dyYXBwZXJDbGFzczogc3RyaW5nID0gJ3dyYXBwZXInO1xyXG4gICAgcHJpdmF0ZSBfaW5uZXJTdGF0ZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgcHJpdmF0ZSBfaW5uZXJIYW5kbGVXaWR0aDogc3RyaW5nIHwgbnVtYmVyID0gJ2F1dG8nO1xyXG4gICAgcHJpdmF0ZSBfaW5uZXJMYWJlbFdpZHRoOiBzdHJpbmcgfCBudW1iZXIgPSAnYXV0byc7XHJcblxyXG4gICAgcHJpdmF0ZSBfZHJhZ1N0YXJ0OiBhbnkgPSBudWxsO1xyXG4gICAgcHJpdmF0ZSBfZHJhZ0VuZDogYW55ID0gbnVsbDtcclxuXHJcbiAgICBwcml2YXRlIF9vblRvdWNoZWRDYWxsYmFjazogKCkgPT4gdm9pZCA9IGNhbGxiYWNrO1xyXG4gICAgcHJpdmF0ZSBfb25DaGFuZ2VDYWxsYmFjazogKF86IGFueSkgPT4gdm9pZCA9IGNhbGxiYWNrO1xyXG5cclxuICAgIEBPdXRwdXQoKSBjaGFuZ2VTdGF0ZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuXHJcblxyXG4gICAgLy8gRGVmaW5pbmcgRE9NIEVsZW1lbnRzXHJcbiAgICBAVmlld0NoaWxkKCdjb250YWluZXInKSBjb250YWluZXI6IEVsZW1lbnRSZWY7XHJcbiAgICBAVmlld0NoaWxkKCdvbicpIG9uOiBFbGVtZW50UmVmO1xyXG4gICAgQFZpZXdDaGlsZCgnbGFiZWwnKSBsYWJlbDogRWxlbWVudFJlZjtcclxuICAgIEBWaWV3Q2hpbGQoJ29mZicpIG9mZjogRWxlbW