UNPKG

nge-facturaperu

Version:

nge-facturaperu. Es un proyecto de libreria javascript que contiene componentes reutilizables para el proyectos web de [facturación electrónica](http://svs.factura-peru.com/) u [algún otro proyecto web](http://hotelparis.pe/).

452 lines 38.1 kB
/** * @fileoverview added by tsickle * Generated from: lib/components/steps/steps.component.ts * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Component, Input, QueryList, Directive, ContentChild, ContentChildren, TemplateRef, Output, EventEmitter, } from '@angular/core'; import { slideOfRight } from './animations/slide-of-right.animation'; import { ConfigNames, NgeStepConfig } from './step-config'; var NgeStepTitleDirective = /** @class */ (function () { function NgeStepTitleDirective(templateRef) { this.templateRef = templateRef; } NgeStepTitleDirective.decorators = [ { type: Directive, args: [{ selector: 'ng-template[ngeStepTitle]', },] } ]; /** @nocollapse */ NgeStepTitleDirective.ctorParameters = function () { return [ { type: TemplateRef } ]; }; return NgeStepTitleDirective; }()); export { NgeStepTitleDirective }; if (false) { /** @type {?} */ NgeStepTitleDirective.prototype.templateRef; } var NgeStepContentDirective = /** @class */ (function () { function NgeStepContentDirective(templateRef) { this.templateRef = templateRef; } NgeStepContentDirective.decorators = [ { type: Directive, args: [{ selector: 'ng-template[ngeStepContent]', },] } ]; /** @nocollapse */ NgeStepContentDirective.ctorParameters = function () { return [ { type: TemplateRef } ]; }; return NgeStepContentDirective; }()); export { NgeStepContentDirective }; if (false) { /** @type {?} */ NgeStepContentDirective.prototype.templateRef; } /** @type {?} */ var nextId = 0; var NgeStepDirective = /** @class */ (function () { function NgeStepDirective() { this.id = "nge-step-" + nextId++; this.disabled = false; // @Input() disabled = true; this.isValidStep = true; } Object.defineProperty(NgeStepDirective.prototype, "validStep", { // public isValidStep: boolean = false; set: // public isValidStep: boolean = false; /** * @param {?} value * @return {?} */ function (value) { this.isValidStep = (value === 'true' || value === true) ? true : false; }, enumerable: true, configurable: true }); NgeStepDirective.decorators = [ { type: Directive, args: [{ // tslint:disable-next-line:directive-selector selector: 'nge-step', },] } ]; NgeStepDirective.propDecorators = { id: [{ type: Input }], title: [{ type: Input }], icon: [{ type: Input }], data: [{ type: Input }], disabled: [{ type: Input }], validStep: [{ type: Input }], titleTemplate: [{ type: ContentChild, args: [NgeStepTitleDirective, { static: false },] }], contentTemplate: [{ type: ContentChild, args: [NgeStepContentDirective, { static: false },] }] }; return NgeStepDirective; }()); export { NgeStepDirective }; if (false) { /** @type {?} */ NgeStepDirective.prototype.id; /** @type {?} */ NgeStepDirective.prototype.title; /** @type {?} */ NgeStepDirective.prototype.icon; /** * Guarda Cualquier dato. Creado por el Equipo Lamb. * @type {?} */ NgeStepDirective.prototype.data; /** @type {?} */ NgeStepDirective.prototype.disabled; /** @type {?} */ NgeStepDirective.prototype.isValidStep; /** @type {?} */ NgeStepDirective.prototype.titleTemplate; /** @type {?} */ NgeStepDirective.prototype.contentTemplate; } /** * @record */ export function NgeStepChangeEvent() { } if (false) { /** * Id de la pestaña actualmente activa. * @type {?} */ NgeStepChangeEvent.prototype.activeId; /** * Id de la pestaña recién seleccionada. * @type {?} */ NgeStepChangeEvent.prototype.nextId; /** * data guardada en la pestaña actualmente activa. * @type {?} */ NgeStepChangeEvent.prototype.activeData; /** * Función que evitará el cambio de pertaña si se llama. * @type {?} */ NgeStepChangeEvent.prototype.preventDefault; } var NgeStepGroupComponent = /** @class */ (function () { function NgeStepGroupComponent(config) { this.config = config; this.hideContent = false; /** * Cuando cambia de step se destruira el contenido anterior o solo se oculatará? */ // @Input() destroyOnHide: boolean = true; this.destroyOnHide = false; /** * se va usar los botones en cada paso como: siguiente, atras, finalizar?, * se muestra por default */ // @Input() isShowButtons: boolean = true; this.isShowButtons = true; /** * Emite cuando hay cambios de steps. */ this.stepChange = new EventEmitter(); // tslint:disable-next-line: no-output-on-prefix this.onComplete = new EventEmitter(); this.type = this.config.type; this.justify = this.config.justify; this.orientation = this.config.orientation; this.iConfigNames = this.config.configNames; } Object.defineProperty(NgeStepGroupComponent.prototype, "configNames", { set: /** * @param {?} confign * @return {?} */ function (confign) { this.iConfigNames.buttonBack = confign.buttonBack || this.iConfigNames.buttonBack; this.iConfigNames.buttonNext = confign.buttonNext || this.iConfigNames.buttonNext; this.iConfigNames.buttonFinish = confign.buttonFinish || this.iConfigNames.buttonFinish; }, enumerable: true, configurable: true }); Object.defineProperty(NgeStepGroupComponent.prototype, "justify", { set: /** * @param {?} className * @return {?} */ function (className) { if (className === 'fill' || className === 'justified') { this.justifyClass = "nav-" + className; } else { this.justifyClass = "justify-content-" + className; } }, enumerable: true, configurable: true }); /** * @param {?} stepId * @return {?} */ NgeStepGroupComponent.prototype.onSelect = /** * @param {?} stepId * @return {?} */ function (stepId) { /** @type {?} */ var selectedStep = this.getStepById(stepId); /** @type {?} */ var selectedActive = this.getStepById(this.activeId); // console.log('selectedStep'); // console.log(selectedStep); if (selectedStep && !selectedStep.disabled && this.activeId !== selectedStep.id) { /** @type {?} */ var defaultPrevented_1 = false; this.stepChange.emit({ activeId: this.activeId, activeData: selectedActive.data || null, nextId: selectedStep.id, preventDefault: (/** * @return {?} */ function () { defaultPrevented_1 = true; }), }); if (!defaultPrevented_1) { this.activeId = selectedStep.id; } } }; /** * @return {?} */ NgeStepGroupComponent.prototype.ngOnInit = /** * @return {?} */ function () { }; /** * @return {?} */ NgeStepGroupComponent.prototype.ngAfterContentChecked = /** * @return {?} */ function () { /** @type {?} */ var activeStep = this.getStepById(this.activeId); this.activeId = activeStep ? activeStep.id : (this.steps.length ? this.steps.first.id : null); }; /** * @private * @param {?} id * @return {?} */ NgeStepGroupComponent.prototype.getStepById = /** * @private * @param {?} id * @return {?} */ function (id) { /** @type {?} */ var stepsWithId = this.steps.filter((/** * @param {?} step * @return {?} */ function (step) { return step.id === id; })); return stepsWithId.length ? stepsWithId[0] : null; }; /** * @return {?} */ NgeStepGroupComponent.prototype.back = /** * @return {?} */ function () { /** @type {?} */ var back = this.getStepIdSplice(-1); this.onSelect(back); }; /** * @return {?} */ NgeStepGroupComponent.prototype.next = /** * @return {?} */ function () { /** @type {?} */ var next = this.getStepIdSplice(+1); this.onSelect(next); }; /** * @return {?} */ NgeStepGroupComponent.prototype.complete = /** * @return {?} */ function () { this.onComplete.emit(); }; /** * @param {?} stepId * @return {?} */ NgeStepGroupComponent.prototype.current = /** * @param {?} stepId * @return {?} */ function (stepId) { this.onSelect(stepId); }; /** * @private * @param {?} condicion * @return {?} */ NgeStepGroupComponent.prototype.getStepIdSplice = /** * @private * @param {?} condicion * @return {?} */ function (condicion) { /** @type {?} */ var actual = this.activeId; /** @type {?} */ var splice = actual.slice(0, actual.length - 1); /** @type {?} */ var index = parseInt(actual.slice((actual.length - 1), actual.length), 10); /** @type {?} */ var next = "" + splice + (index + (condicion)); return next; }; Object.defineProperty(NgeStepGroupComponent.prototype, "hidePrevious", { get: /** * @return {?} */ function () { return this.activeId !== 'nge-step-0'; }, enumerable: true, configurable: true }); Object.defineProperty(NgeStepGroupComponent.prototype, "hideNext", { get: /** * @return {?} */ function () { /** @type {?} */ var allLength = (this.steps.length - 1); return this.activeId !== 'nge-step-' + allLength; }, enumerable: true, configurable: true }); /** * @param {?} stepId * @return {?} */ NgeStepGroupComponent.prototype.hideLineRight = /** * @param {?} stepId * @return {?} */ function (stepId) { /** @type {?} */ var step = parseInt(stepId.slice(stepId.length - 1, stepId.length), 10); return (this.steps.length !== (step + 1)); }; /** * @return {?} */ NgeStepGroupComponent.prototype.ngOnDestroy = /** * @return {?} */ function () { nextId = 0; }; NgeStepGroupComponent.decorators = [ { type: Component, args: [{ selector: 'nge-step-group', template: "<!-- <ul class=\"nav justify-content-center\" id=\"myStep\" role=\"steplist\"> -->\r\n<ul [class]=\"'nav nge-nav-tabs nav-' + type + (orientation == 'horizontal'? ' ' + justifyClass : ' flex-column' )\" id=\"myStep\"\r\n role=\"steplist\">\r\n\r\n <!-- <ng-template ngFor let-step [ngForOf]=\"steps\" *ngFor=\"let step of steps\"> -->\r\n <ng-template ngFor let-step [ngForOf]=\"steps\">\r\n <li class=\"nav-item\">\r\n <a [id]=\"step.id\" class=\"nav-link\" [class.active]=\"step.id === activeId\" [class.disabled]=\"step.disabled || !step.isValidStep\"\r\n role=\"step\" [attr.stepindex]=\"(step.disabled || !step.isValidStep ? '-1': undefined)\"\r\n [attr.aria-controls]=\"(!destroyOnHide || step.id === activeId ? step.id + '-panel': null)\" [attr.aria-expanded]=\"step.id === activeId\"\r\n [attr.aria-disabled]=\"step.disabled || !step.isValidStep\" (click)=\"current(step.id)\"><!---->\r\n <!-- (click)=\"!!onSelect(step.id)\" | Yo Guido declaro haber modificado el codigo de vitmar jhonson, pero si funciona la cosa...vamos con f\u00E9--> \r\n <!-- data-toggle=\"step\" aria-selected=\"true\" -->\r\n <ng-template [ngIf]=\"step.icon\">\r\n <span class=\"nge-round-tabs\" [title]=\"step.title\">\r\n <i class=\"{{ step.icon }} nge-icon\"></i>\r\n </span>\r\n </ng-template>\r\n <br>\r\n <span class=\"nge-round-text\">\r\n {{ step.title }}\r\n </span>\r\n <ng-template [ngTemplateOutlet]=\"step.titleTemplate?.templateRef\"></ng-template>\r\n </a>\r\n </li>\r\n <li class=\"nav-line\" *ngIf=\"hideLineRight(step.id)\">\r\n <div class=\"nge-liner\"></div>\r\n </li>\r\n </ng-template>\r\n\r\n <!-- <ng-content select=\"nge-step-head\"></ng-content> -->\r\n</ul>\r\n<div class=\"tab-content nge-content\" id=\"myStepContent\">\r\n <!-- <ng-content select=\"nge-step-body\"></ng-content> -->\r\n <ng-template ngFor let-step [ngForOf]=\"steps\">\r\n <!-- class=\"step-pane fade {{ step.id === activeId ? 'active': null }}\" -->\r\n <!--\r\n <div [@slideOfRight]=\"((step.id === activeId) && (status === 'next')) ? 'next': 'back'\" class=\"tab-pane {{ step.id === activeId ? 'active': 'active' }}\"\r\n *ngIf=\"!destroyOnHide || step.id === activeId\" role=\"steppanel\" [attr.aria-labelledby]=\"step.id\" id=\"{{ step.id }}-panel\"\r\n [attr.aria-expanded]=\"step.id === activeId\"> -->\r\n\r\n <div class=\"tab-pane {{ step.id === activeId ? 'active': null }}\" *ngIf=\"!destroyOnHide || step.id === activeId\" role=\"steppanel\"\r\n [attr.aria-labelledby]=\"step.id\" id=\"{{ step.id }}-panel\" [attr.aria-expanded]=\"step.id === activeId\">\r\n <div class=\"container\">\r\n <!---<div class=\"row\">\r\n <div class=\"col-md-12\">-->\r\n <ng-template [ngTemplateOutlet]=\"step.contentTemplate?.templateRef\"></ng-template>\r\n <!--</div>\r\n </div>-->\r\n </div>\r\n\r\n\r\n <div class=\"row nge-button-manage\" *ngIf=\"isShowButtons\">\r\n <div class=\"offset-md-4 col-md-4\">\r\n <div class=\"row\">\r\n <div class=\"col-md-6\" *ngIf=\"hidePrevious\">\r\n <div class=\"form-group text-center space-20\">\r\n <button class=\"btn btn-sm btn-block btn-outline-rounded btn-secondary\" (click)=\"back()\">\r\n <span style=\"margin-right:10px;\" class=\"fa fa-arrow-left\"></span>\r\n {{ iConfigNames.buttonBack }}\r\n </button>\r\n </div>\r\n </div>\r\n <div class=\"col-md-6\" *ngIf=\"hideNext\">\r\n <div class=\"form-group text-center space-20\">\r\n <button class=\"btn btn-sm btn-block btn-outline-rounded btn-info\" [disabled]=\"!step.isValidStep\" (click)=\"next()\">\r\n {{ iConfigNames.buttonNext }}\r\n <span style=\"margin-left:10px;\" class=\"fa fa-arrow-right\"></span>\r\n </button>\r\n </div>\r\n </div>\r\n <div class=\"col-md-6\" *ngIf=\"hidePrevious && !hideNext\">\r\n <div class=\"form-group text-center space-20\">\r\n <button class=\"btn btn-sm btn-block btn-outline-rounded btn-info\" [disabled]=\"!step.isValidStep\" (click)=\"complete()\">\r\n {{ iConfigNames.buttonFinish }}\r\n <span style=\"margin-left:10px;\" class=\"fa fa-check\"></span>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-template>\r\n</div>", // animations: [Animations.slideInOut, Animations.slideOfRight], animations: [slideOfRight], styles: [".nge-liner{height:2px;background:#ececec;position:relative;width:5rem;margin:0 auto;right:0;top:1.8rem;z-index:1;left:.5rem;color:#333}.tab-content{padding-top:.3rem}.nav-link{padding:0 0 5px}.nav-link .nge-round-text{color:#000;text-transform:uppercase;font-size:.7rem}@media (max-width:550px){.nge-liner{width:1rem}.nav-link .nge-round-text{display:none}}.nav-link.active span.nge-round-tabs{background:#2962ff;color:#fff}.nge-nav-tabs{border-bottom:transparent;position:relative;margin:0 auto;box-sizing:border-box;text-align:center;padding:0 1.5rem;background-color:#fff;border-radius:1px solid #ccc}.nge-nav-tabs li.nav-line{padding-left:0;padding-right:0}.nge-nav-tabs li a{text-decoration:none}.nge-content{text-align:justify}.nge-button-manage{margin-top:1.5rem}span.nge-round-tabs{width:40px;height:40px;line-height:40px;display:inline-block;border-radius:100px;background:#ececec;z-index:2;left:-1;text-align:center;font-size:1.3rem;position:relative;margin-top:.6rem;margin-bottom:0;color:#333}"] }] } ]; /** @nocollapse */ NgeStepGroupComponent.ctorParameters = function () { return [ { type: NgeStepConfig } ]; }; NgeStepGroupComponent.propDecorators = { steps: [{ type: ContentChildren, args: [NgeStepDirective,] }], activeId: [{ type: Input }], configNames: [{ type: Input }], destroyOnHide: [{ type: Input }], isShowButtons: [{ type: Input }], stepChange: [{ type: Output }], onComplete: [{ type: Output }], justify: [{ type: Input }], orientation: [{ type: Input }], type: [{ type: Input }] }; return NgeStepGroupComponent; }()); export { NgeStepGroupComponent }; if (false) { /** @type {?} */ NgeStepGroupComponent.prototype.justifyClass; /** @type {?} */ NgeStepGroupComponent.prototype.hideContent; /** @type {?} */ NgeStepGroupComponent.prototype.steps; /** * Id del step que saldrá activado por defecto. * @type {?} */ NgeStepGroupComponent.prototype.activeId; /** * Personalizar el nombre 'Anterior | siguiente y Finalizar' * Formato de variable : objecto * Ej. configNames: object = {buttonBack: 'Regresar', buttonNext: 'Grabar', buttonFinish: 'Fin'} * @type {?} */ NgeStepGroupComponent.prototype.iConfigNames; /** * Cuando cambia de step se destruira el contenido anterior o solo se oculatará? * @type {?} */ NgeStepGroupComponent.prototype.destroyOnHide; /** * se va usar los botones en cada paso como: siguiente, atras, finalizar?, * se muestra por default * @type {?} */ NgeStepGroupComponent.prototype.isShowButtons; /** * Emite cuando hay cambios de steps. * @type {?} */ NgeStepGroupComponent.prototype.stepChange; /** @type {?} */ NgeStepGroupComponent.prototype.onComplete; /** @type {?} */ NgeStepGroupComponent.prototype.orientation; /** @type {?} */ NgeStepGroupComponent.prototype.type; /** * @type {?} * @private */ NgeStepGroupComponent.prototype.config; } /** @type {?} */ export var APP_STEPS_COMPONENTS = [ NgeStepGroupComponent, NgeStepDirective, NgeStepTitleDirective, NgeStepContentDirective, ]; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcHMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmdlLWZhY3R1cmFwZXJ1LyIsInNvdXJjZXMiOlsibGliL2NvbXBvbmVudHMvc3RlcHMvc3RlcHMuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUNILFNBQVMsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUMzQixTQUFTLEVBQUUsWUFBWSxFQUN2QixlQUFlLEVBQUUsV0FBVyxFQUF1QixNQUFNLEVBQUUsWUFBWSxHQUMxRSxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDckUsT0FBTyxFQUFFLFdBQVcsRUFBRSxhQUFhLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFM0Q7SUFJSSwrQkFBbUIsV0FBNkI7UUFBN0IsZ0JBQVcsR0FBWCxXQUFXLENBQWtCO0lBQUksQ0FBQzs7Z0JBSnhELFNBQVMsU0FBQztvQkFDUCxRQUFRLEVBQUUsMkJBQTJCO2lCQUN4Qzs7OztnQkFQb0IsV0FBVzs7SUFVaEMsNEJBQUM7Q0FBQSxBQUxELElBS0M7U0FGWSxxQkFBcUI7OztJQUNsQiw0Q0FBb0M7O0FBR3BEO0lBSUksaUNBQW1CLFdBQTZCO1FBQTdCLGdCQUFXLEdBQVgsV0FBVyxDQUFrQjtJQUFJLENBQUM7O2dCQUp4RCxTQUFTLFNBQUM7b0JBQ1AsUUFBUSxFQUFFLDZCQUE2QjtpQkFDMUM7Ozs7Z0JBZG9CLFdBQVc7O0lBaUJoQyw4QkFBQztDQUFBLEFBTEQsSUFLQztTQUZZLHVCQUF1Qjs7O0lBQ3BCLDhDQUFvQzs7O0lBR2hELE1BQU0sR0FBRyxDQUFDO0FBRWQ7SUFBQTtRQU1hLE9BQUUsR0FBVyxjQUFZLE1BQU0sRUFBSSxDQUFDO1FBV3BDLGFBQVEsR0FBRyxLQUFLLENBQUM7O1FBR25CLGdCQUFXLEdBQVksSUFBSSxDQUFDO0lBVXZDLENBQUM7SUFQRyxzQkFDSSx1Q0FBUztRQUhiLHVDQUF1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QUVoRCxxQ0FBa0M7Ozs7O0lBWnRCLHVDQUE2Qjs7O0FBcUU3QyxNQUFNLEtBQU8sb0JBQW9CLEdBQUc7SUFDaEMscUJBQXFCO0lBQ3JCLGdCQUFnQjtJQUNoQixxQkFBcUI7SUFDckIsdUJBQXVCO0NBQzFCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICAgIENvbXBvbmVudCwgSW5wdXQsIFF1ZXJ5TGlzdCxcclxuICAgIERpcmVjdGl2ZSwgQ29udGVudENoaWxkLFxyXG4gICAgQ29udGVudENoaWxkcmVuLCBUZW1wbGF0ZVJlZiwgQWZ0ZXJDb250ZW50Q2hlY2tlZCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIE9uSW5pdCwgT25EZXN0cm95LFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBzbGlkZU9mUmlnaHQgfSBmcm9tICcuL2FuaW1hdGlvbnMvc2xpZGUtb2YtcmlnaHQuYW5pbWF0aW9uJztcclxuaW1wb3J0IHsgQ29uZmlnTmFtZXMsIE5nZVN0ZXBDb25maWcgfSBmcm9tICcuL3N0ZXAtY29uZmlnJztcclxuXHJcbkBEaXJlY3RpdmUoe1xyXG4gICAgc2VsZWN0b3I6ICduZy10ZW1wbGF0ZVtuZ2VTdGVwVGl0bGVdJyxcclxufSlcclxuZXhwb3J0IGNsYXNzIE5nZVN0ZXBUaXRsZURpcmVjdGl2ZSB7XHJcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgdGVtcGxhdGVSZWY6IFRlbXBsYXRlUmVmPGFueT4pIHsgfVxyXG59XHJcblxyXG5ARGlyZWN0aXZlKHtcclxuICAgIHNlbGVjdG9yOiAnbmctdGVtcGxhdGVbbmdlU3RlcENvbnRlbnRdJyxcclxufSlcclxuZXhwb3J0IGNsYXNzIE5nZVN0ZXBDb250ZW50RGlyZWN0aXZlIHtcclxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyB0ZW1wbGF0ZVJlZjogVGVtcGxhdGVSZWY8YW55PikgeyB9XHJcbn1cclxuXHJcbmxldCBuZXh0SWQgPSAwO1xyXG5cclxuQERpcmVjdGl2ZSh7XHJcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6ZGlyZWN0aXZlLXNlbGVjdG9yXHJcbiAgICBzZWxlY3RvcjogJ25nZS1zdGVwJyxcclxufSlcclxuZXhwb3J0IGNsYXNzIE5nZVN0ZXBEaXJlY3RpdmUge1xyXG5cclxuICAgIEBJbnB1dCgpIGlkOiBzdHJpbmcgPSBgbmdlLXN0ZXAtJHtuZXh0SWQrK31gO1xyXG5cclxuICAgIEBJbnB1dCgpIHRpdGxlOiBzdHJpbmc7XHJcblxyXG4gICAgQElucHV0KCkgaWNvbjogc3RyaW5nO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogR3VhcmRhIEN1YWxxdWllciBkYXRvLiBDcmVhZG8gcG9yIGVsIEVxdWlwbyBMYW1iLlxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBkYXRhOiBhbnk7XHJcblxyXG4gICAgQElucHV0KCkgZGlzYWJsZWQgPSBmYWxzZTtcclxuICAgIC8vIEBJbnB1dCgpIGRpc2FibGVkID0gdHJ1ZTtcclxuXHJcbiAgICBwdWJsaWMgaXNWYWxpZFN0ZXA6IGJvb2xlYW4gPSB0cnVlO1xyXG4gICAgLy8gcHVibGljIGlzVmFsaWRTdGVwOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgQElucHV0KClcclxuICAgIHNldCB2YWxpZFN0ZXAodmFsdWU6IHN0cmluZyB8IGJvb2xlYW4pIHtcclxuICAgICAgICB0aGlzLmlzVmFsaWRTdGVwID0gKHZhbHVlID09PSAndHJ1ZScgfHwgdmFsdWUgPT09IHRydWUpID8gdHJ1ZSA6IGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIEBDb250ZW50Q2hpbGQoTmdlU3RlcFRpdGxlRGlyZWN0aXZlLCB7c3RhdGljOiBmYWxzZX0pIHRpdGxlVGVtcGxhdGU6IE5nZVN0ZXBUaXRsZURpcmVjdGl2ZTtcclxuICAgIEBDb250ZW50Q2hpbGQoTmdlU3RlcENvbnRlbnREaXJlY3RpdmUsIHtzdGF0aWM6IGZhbHNlfSkgY29udGVudFRlbXBsYXRlOiBOZ2VTdGVwQ29udGVudERpcmVjdGl2ZTtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBOZ2VTdGVwQ2hhbmdlRXZlbnQge1xyXG4gICAgLyoqXHJcbiAgICAgKiBJZCBkZSBsYSBwZXN0YcOxYSBhY3R1YWxtZW50ZSBhY3RpdmEuXHJcbiAgICAgKi9cclxuICAgIGFjdGl2ZUlkOiBzdHJpbmc7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJZCBkZSBsYSBwZXN0YcOxYSByZWNpw6luIHNlbGVjY2lvbmFkYS5cclxuICAgICAqL1xyXG4gICAgbmV4dElkOiBzdHJpbmc7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBkYXRhIGd1YXJkYWRhIGVuIGxhIHBlc3Rhw7FhIGFjdHVhbG1lbnRlIGFjdGl2YS5cclxuICAgICAqL1xyXG4gICAgYWN0aXZlRGF0YTogYW55O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogRnVuY2nDs24gcXVlIGV2aXRhcsOhIGVsIGNhbWJpbyBkZSBwZXJ0YcOxYSBzaSBzZSBsbGFtYS5cclxuICAgICAqL1xyXG4gICAgcHJldmVudERlZmF1bHQ6ICgpID0+IHZvaWQ7XHJcblxyXG59XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICAgIHNlbGVjdG9yOiAnbmdlLXN0ZXAtZ3JvdXAnLFxyXG4gICAgdGVtcGxhdGVVcmw6ICcuL3N0ZXBzLmNvbXBvbmVudC5odG1sJyxcclxuICAgIHN0eWxlVXJsczogWycuL3N0ZXBzLmNvbXBvbmVudC5zY3NzJ10sXHJcbiAgICAvLyBhbmltYXRpb25zOiBbQW5pbWF0aW9ucy5zbGlkZUluT3V0LCBBbmltYXRpb25zLnNsaWRlT2ZSaWdodF0sXHJcbiAgICBhbmltYXRpb25zOiBbc2xpZGVPZlJpZ2h0XSxcclxufSlcclxuXHJcbmV4cG9ydCBjbGFzcyBOZ2VTdGVwR3JvdXBDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyQ29udGVudENoZWNrZWQsIE9uRGVzdHJveSB7XHJcbiAgICBqdXN0aWZ5Q2xhc3M6IHN0cmluZztcclxuICAgIHB1YmxpYyBoaWRlQ29udGVudDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIEBDb250ZW50Q2hpbGRyZW4oTmdlU3RlcERpcmVjdGl2ZSkgc3RlcHM6IFF1ZXJ5TGlzdDxOZ2VTdGVwRGlyZWN0aXZlPjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIElkIGRlbCBzdGVwIHF1ZSBzYWxkcsOhIGFjdGl2YWRvIHBvciBkZWZlY3RvLlxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBhY3RpdmVJZDogc3RyaW5nO1xyXG4gICAgLyoqXHJcbiAgICAgKiBQZXJzb25hbGl6YXIgZWwgbm9tYnJlICdBbnRlcmlvciB8IHNpZ3VpZW50ZSB5IEZpbmFsaXphcidcclxuICAgICAqIEZvcm1hdG8gZGUgdmFyaWFibGUgOiBvYmplY3RvXHJcbiAgICAgKiBFai4gY29uZmlnTmFtZXM6IG9iamVjdCA9IHtidXR0b25CYWNrOiAnUmVncmVzYXInLCBidXR0b25OZXh0OiAnR3JhYmFyJywgYnV0dG9uRmluaXNoOiAnRmluJ31cclxuICAgICAqL1xyXG4gICAgcHVibGljIGlDb25maWdOYW1lczogQ29uZmlnTmFtZXM7XHJcbiAgICBASW5wdXQoKVxyXG4gICAgc2V0IGNvbmZpZ05hbWVzKGNvbmZpZ246IENvbmZpZ05hbWVzKSB7XHJcbiAgICAgICAgdGhpcy5pQ29uZmlnTmFtZXMuYnV0dG9uQmFjayA9IGNvbmZpZ24uYnV0dG9uQmFjayB8fCB0aGlzLmlDb25maWdOYW1lcy5idXR0b25CYWNrO1xyXG4gICAgICAgIHRoaXMuaUNvbmZpZ05hbWVzLmJ1dHRvbk5leHQgPSBjb25maWduLmJ1dHRvbk5leHQgfHwgdGhpcy5pQ29uZmlnTmFtZXMuYnV0dG9uTmV4dDtcclxuICAgICAgICB0aGlzLmlDb25maWdOYW1lcy5idXR0b25GaW5pc2ggPSBjb25maWduLmJ1dHRvbkZpbmlzaCB8fCB0aGlzLmlDb25maWdOYW1lcy5idXR0b25GaW5pc2g7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDdWFuZG8gY2FtYmlhIGRlIHN0ZXAgc2UgZGVzdHJ1aXJhIGVsIGNvbnRlbmlkbyBhbnRlcmlvciBvIHNvbG8gc2Ugb2N1bGF0YXLDoT9cclxuICAgICAqL1xyXG4gICAgLy8gQElucHV0KCkgZGVzdHJveU9uSGlkZTogYm9vbGVhbiA9IHRydWU7XHJcbiAgICBASW5wdXQoKSBkZXN0cm95T25IaWRlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICAvKipcclxuICAgICAqIHNlIHZhIHVzYXIgbG9zIGJvdG9uZXMgZW4gY2FkYSBwYXNvIGNvbW86IHNpZ3VpZW50ZSwgYXRyYXMsIGZpbmFsaXphcj8sIFxyXG4gICAgICogc2UgbXVlc3RyYSBwb3IgZGVmYXVsdFxyXG4gICAgICovXHJcbiAgICAvLyBASW5wdXQoKSBpc1Nob3dCdXR0b25zOiBib29sZWFuID0gdHJ1ZTtcclxuICAgIEBJbnB1dCgpIGlzU2hvd0J1dHRvbnM6IGJvb2xlYW4gPSB0cnVlO1xyXG4gICAgXHJcbiAgICAvKipcclxuICAgICAqIEVtaXRlIGN1YW5kbyBoYXkgY2FtYmlvcyBkZSBzdGVwcy5cclxuICAgICAqL1xyXG4gICAgQE91dHB1dCgpIHN0ZXBDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPE5nZVN0ZXBDaGFuZ2VFdmVudD4oKTtcclxuXHJcbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tb3V0cHV0LW9uLXByZWZpeFxyXG4gICAgQE91dHB1dCgpIG9uQ29tcGxldGUgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuXHJcbiAgICBASW5wdXQoKVxyXG4gICAgc2V0IGp1c3RpZnkoY2xhc3NOYW1lOiAnc3RhcnQnIHwgJ2NlbnRlcicgfCAnZW5kJyB8ICdmaWxsJyB8ICdqdXN0aWZpZWQnKSB7XHJcbiAgICAgICAgaWYgKGNsYXNzTmFtZSA9PT0gJ2ZpbGwnIHx8IGNsYXNzTmFtZSA9PT0gJ2p1c3RpZmllZCcpIHtcclxuICAgICAgICAgICAgdGhpcy5qdXN0aWZ5Q2xhc3MgPSBgbmF2LSR7Y2xhc3NOYW1lfWA7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5qdXN0aWZ5Q2xhc3MgPSBganVzdGlmeS1jb250ZW50LSR7Y2xhc3NOYW1lfWA7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIG9uU2VsZWN0KHN0ZXBJZDogc3RyaW5nKSB7XHJcblxyXG4gICAgICAgIGNvbnN0IHNlbGVjdGVkU3RlcCA9IHRoaXMuZ2V0U3RlcEJ5SWQoc3RlcElkKTtcclxuICAgICAgICBjb25zdCBzZWxlY3RlZEFjdGl2ZSA9IHRoaXMuZ2V0U3RlcEJ5SWQodGhpcy5hY3RpdmVJZCk7XHJcbiAgICAgICAgLy8gY29uc29sZS5sb2coJ3NlbGVjdGVkU3RlcCcpO1xyXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKHNlbGVjdGVkU3RlcCk7XHJcblxyXG4gICAgICAgIGlmIChzZWxlY3RlZFN0ZXAgJiYgIXNlbGVjdGVkU3RlcC5kaXNhYmxlZCAmJiB0aGlzLmFjdGl2ZUlkICE9PSBzZWxlY3RlZFN0ZXAuaWQpIHtcclxuICAgICAgICAgICAgbGV0IGRlZmF1bHRQcmV2ZW50ZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy5zdGVwQ2hhbmdlLmVtaXQoXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgYWN0aXZlSWQ6IHRoaXMuYWN0aXZlSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgYWN0aXZlRGF0YTogc2VsZWN0ZWRBY3RpdmUuZGF0YSB8fCBudWxsLFxyXG4gICAgICAgICAgICAgICAgICAgIG5leHRJZDogc2VsZWN0ZWRTdGVwLmlkLFxyXG4gICAgICAgICAgICAgICAgICAgIHByZXZlbnREZWZhdWx0OiAoKSA9PiB7IGRlZmF1bHRQcmV2ZW50ZWQgPSB0cnVlOyB9LFxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgaWYgKCFkZWZhdWx0UHJldmVudGVkKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmFjdGl2ZUlkID0gc2VsZWN0ZWRTdGVwLmlkO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBjb25maWc6IE5nZVN0ZXBDb25maWcpIHtcclxuICAgICAgICB0aGlzLnR5cGUgPSB0aGlzLmNvbmZpZy50eXBlO1xyXG4gICAgICAgIHRoaXMuanVzdGlmeSA9IHRoaXMuY29uZmlnLmp1c3RpZnk7XHJcbiAgICAgICAgdGhpcy5vcmllbnRhdGlvbiA9IHRoaXMuY29uZmlnLm9yaWVudGF0aW9uO1xyXG4gICAgICAgIHRoaXMuaUNvbmZpZ05hbWVzID0gdGhpcy5jb25maWcuY29uZmlnTmFtZXM7XHJcbiAgICB9XHJcbiAgICBuZ09uSW5pdCgpIHtcclxuICAgIH1cclxuXHJcbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbWVtYmVyLW9yZGVyaW5nXHJcbiAgICBASW5wdXQoKSBvcmllbnRhdGlvbjogJ2hvcml6b250YWwnIHwgJ3ZlcnRpY2FsJztcclxuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBtZW1iZXItb3JkZXJpbmdcclxuICAgIEBJbnB1dCgpIHR5cGU6ICdzdGVwc3MnIHwgJ3BpbGxzJztcclxuXHJcbiAgICBuZ0FmdGVyQ29udGVudENoZWNrZWQoKSB7XHJcbiAgICAgICAgY29uc3QgYWN0aXZlU3RlcCA9IHRoaXMuZ2V0U3RlcEJ5SWQodGhpcy5hY3RpdmVJZCk7XHJcbiAgICAgICAgdGhpcy5hY3RpdmVJZCA9IGFjdGl2ZVN0ZXAgPyBhY3RpdmVTdGVwLmlkIDogKHRoaXMuc3RlcHMubGVuZ3RoID8gdGhpcy5zdGVwcy5maXJzdC5pZCA6IG51bGwpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZ2V0U3RlcEJ5SWQoaWQ6IHN0cmluZyk6IE5nZVN0ZXBEaXJlY3RpdmUge1xyXG4gICAgICAgIGNvbnN0IHN0ZXBzV2l0aElkOiBOZ2VTdGVwRGlyZWN0aXZlW10gPSB0aGlzLnN0ZXBzLmZpbHRlcihzdGVwID0+IHN0ZXAuaWQgPT09IGlkKTtcclxuICAgICAgICByZXR1cm4gc3RlcHNXaXRoSWQubGVuZ3RoID8gc3RlcHNXaXRoSWRbMF0gOiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBiYWNrKCkge1xyXG4gICAgICAgIGNvbnN0IGJhY2sgPSB0aGlzLmdldFN0ZXBJZFNwbGljZSgtMSk7XHJcbiAgICAgICAgdGhpcy5vblNlbGVjdChiYWNrKTtcclxuXHJcbiAgICB9XHJcbiAgICBwdWJsaWMgbmV4dCgpIHtcclxuICAgICAgICBjb25zdCBuZXh0ID0gdGhpcy5nZXRTdGVwSWRTcGxpY2UoKzEpO1xyXG5cclxuICAgICAgICB0aGlzLm9uU2VsZWN0KG5leHQpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBjb21wbGV0ZSgpIHtcclxuICAgICAgICB0aGlzLm9uQ29tcGxldGUuZW1pdCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBjdXJyZW50KHN0ZXBJZDogc3RyaW5nKSB7XHJcbiAgICAgICAgdGhpcy5vblNlbGVjdChzdGVwSWQpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZ2V0U3RlcElkU3BsaWNlKGNvbmRpY2lvbjogbnVtYmVyKSB7XHJcbiAgICAgICAgY29uc3QgYWN0dWFsID0gdGhpcy5hY3RpdmVJZDtcclxuICAgICAgICBjb25zdCBzcGxpY2UgPSBhY3R1YWwuc2xpY2UoMCwgYWN0dWFsLmxlbmd0aCAtIDEpO1xyXG4gICAgICAgIGNvbnN0IGluZGV4ID0gcGFyc2VJbnQoYWN0dWFsLnNsaWNlKChhY3R1YWwubGVuZ3RoIC0gMSksIGFjdHVhbC5sZW5ndGgpLCAxMCk7XHJcbiAgICAgICAgY29uc3QgbmV4dCA9IGAke3NwbGljZX0keyhpbmRleCArIChjb25kaWNpb24pKX1gO1xyXG4gICAgICAgIHJldHVybiBuZXh0O1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBoaWRlUHJldmlvdXMoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuYWN0aXZlSWQgIT09ICduZ2Utc3RlcC0wJztcclxuICAgIH1cclxuICAgIGdldCBoaWRlTmV4dCgpOiBib29sZWFuIHtcclxuICAgICAgICBjb25zdCBhbGxMZW5ndGggPSAodGhpcy5zdGVwcy5sZW5ndGggLSAxKTtcclxuICAgICAgICByZXR1cm4gdGhpcy5hY3RpdmVJZCAhPT0gJ25nZS1zdGVwLScgKyBhbGxMZW5ndGg7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGhpZGVMaW5lUmlnaHQoc3RlcElkKSB7XHJcbiAgICAgICAgY29uc3Qgc3RlcCA9IHBhcnNlSW50KHN0ZXBJZC5zbGljZShzdGVwSWQubGVuZ3RoIC0gMSwgc3RlcElkLmxlbmd0aCksIDEwKTtcclxuICAgICAgICByZXR1cm4gKHRoaXMuc3RlcHMubGVuZ3RoICE9PSAoc3RlcCArIDEpKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgbmdPbkRlc3Ryb3koKSB7XHJcbiAgICAgICAgbmV4dElkID0gMDtcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IEFQUF9TVEVQU19DT01QT05FTlRTID0gW1xyXG4gICAgTmdlU3RlcEdyb3VwQ29tcG9uZW50LFxyXG4gICAgTmdlU3RlcERpcmVjdGl2ZSxcclxuICAgIE5nZVN0ZXBUaXRsZURpcmVjdGl2ZSxcclxuICAgIE5nZVN0ZXBDb250ZW50RGlyZWN0aXZlLFxyXG5dO1xyXG5cclxuIl19