UNPKG

@edugouvfr/ngx-dsfr-ext

Version:

NgxDsfrExt est une extension au package @edugouvfr/ngx-dsfr (portage Angular des éléments DSFR)

201 lines 24 kB
import { Directive, ElementRef, inject, Input, Renderer2 } from '@angular/core'; import { DsfrDatePickerComponent } from '../datepicker.component'; import * as i0 from "@angular/core"; const MASK_DATE = '__/__/____'; /** * L'objectif de cette directive est de proposer un masque de saisie sous la forme dd/dd/ddddd. * @author pfontanet * @since 0.10 */ export class DateMaskDirective { constructor() { this.hostComponent = inject(DsfrDatePickerComponent); this.elementRef = inject(ElementRef); this.renderer = inject(Renderer2); } set dsfrDateMask(value) { this._dsfrDateMask = value; this.doHideShowMask(); } /** * NOTE : Pourquoi ngAfterViewInit plutôt que ngOnInit ? * Et bien, parce que dans ngOnInit, le DOM n'est pas encore construit et que l'ajout de listeners en fonction * de la valeur du masque ne marche pas car, this.elementRef.nativeElement.querySelector('.fr-input') === null * et du coup rien ne marche !!! */ ngAfterViewInit() { this.doHideShowMask(); } ngOnDestroy() { this.removeListeners(); } /** * Cache / affiche le masque en fonction de la propriété `mask`. * @private */ doHideShowMask() { const showMask = this._dsfrDateMask !== ''; if (showMask) { this.addListeners(); } else { this.removeListeners(); } } addListeners() { this.hostComponent.value = formatDateMaskValue(this.hostComponent.value); // NOTE : Pourquoi ne pas utiliser renderer.selectRootElement() ? // Parce que le setter de dsfrDateMask est invoqué lors de l'étape d'init, le DOM n'est pas construit // et que selectRootElement affiche une exception dans la console, contrairement à querySelector // A l'init inputElt === null const inputElt = this.elementRef.nativeElement.querySelector('.fr-input'); if (inputElt) { this.listenKeydown = this.renderer.listen(inputElt, 'keydown', onInputKeyDown); this.listenKeyup = this.renderer.listen(inputElt, 'keyup', onInputKeyUp); } } removeListeners() { if (this.listenKeydown) { this.listenKeydown(); } if (this.listenKeyup) { this.listenKeyup(); } } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DateMaskDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); } static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.13", type: DateMaskDirective, isStandalone: true, selector: "[dsfrDateMask]", inputs: { dsfrDateMask: "dsfrDateMask" }, ngImport: i0 }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DateMaskDirective, decorators: [{ type: Directive, args: [{ selector: '[dsfrDateMask]', standalone: true, }] }], propDecorators: { dsfrDateMask: [{ type: Input }] } }); /* -- Traitement du masque ------------------------------------------------------------------------------------------ */ /** * Traite les événements du clavier dans le champ date. * - Permet la saisie des chiffres de 0 à 9 * - Permet la tabulation avant / arrière dans les parties jour / mois / année * @param event */ function onInputKeyDown(event) { // Si ce n'est pas un nombre, on ne fait rien const inputElt = event.currentTarget; const isDigit = /\d/.test(event.key); if (isDigit) { doDigitKeyDown(inputElt); } else { switch (event.key) { case 'Tab': const eventProcessed = event.shiftKey ? doShiftTabKey(inputElt) : doTabKey(inputElt); if (eventProcessed) { event.preventDefault(); } break; default: { const isLetter = /[a-zA-Z]/.test(event.key); if (isLetter) { event.stopPropagation(); } } } } } /** * Finalise le traitement du clavier après insertion d'un digit. */ function onInputKeyUp(event) { // Si ce n'est pas un nombre, on ne fait rien const inputElt = event.currentTarget; const isDigit = /\d/.test(event.key); if (isDigit) { doDigitKeyUp(inputElt); } } /** * Traitement AVANT insertion d'un digit dans le champ date * - Suppression de '_' qui sera remplacé par le digit (le champ ne dépasse pas 10 caractères) * - On replace le curseur où il était */ function doDigitKeyDown(inputElt) { // Au cas où l'utilisateur a cliqué devant un séparateur, on le saute // Et ben NON, car si on a 1/1^/2024 (le chapeau représentant le point d'insertion), on laisse faire const value = inputElt.value || ''; let selStart = inputElt.selectionStart || 0; // On supprime le '_' afin de pouvoir insérer le digit à la place if (value[selStart] == '_') { inputElt.value = value.slice(0, selStart) + value.slice(selStart + 1); inputElt.selectionStart = selStart; inputElt.selectionEnd = selStart; } } /** * Traitement APRES insertion d'un caractère dans le champ date * - Saut d'un séparateur s'il y a lieu * - Reformatage du champ si l'utilisateur a supprimé des éléments du masque */ function doDigitKeyUp(inputElt) { // Au cas où l'utilisateur se retrouve devant un séparateur, on le saute const value = inputElt.value || ''; let selStart = inputElt.selectionStart || 0; if (value[selStart] === '/' && (selStart === 2 || selStart == 5)) { inputElt.selectionStart = ++selStart; } // On reformate si nécessaire if (value.length < 8) { inputElt.value = formatDateMaskValue(inputElt.value); } } /** * Tab AVANT dans le champ date * - Tabulation en avant de part en part (jour, mois, année), puis tabulation sur champ suivant */ function doTabKey(inputElt) { const value = inputElt.value || ''; const selEnd = inputElt.selectionEnd || 0; const pos = value.indexOf('/', selEnd); if (pos > -1) { inputElt.selectionStart = pos + 1; inputElt.selectionEnd = inputElt.selectionStart; } return pos > -1; } /** * Tab ARRIERE dans le champ date * - Tabulation en arrière de part en part (année, mois, jour), puis tabulation sur champ précédent */ function doShiftTabKey(inputElt) { const value = inputElt.value || ''; const selStart = inputElt.selectionStart || 0; const pos = value.substring(0, selStart).lastIndexOf('/'); if (pos > -1) { inputElt.selectionStart = pos; inputElt.selectionEnd = inputElt.selectionStart; } return pos > -1; } /** * Reformatage de la valeur, quelle que soit la saisie * @param input */ export function formatDateMaskValue(input) { const regexp = /^(?<day>[\d_]{0,2})(?<s1>\/?)(?<month>[\d_]{0,2})(?<s2>\/?)(?<year>[\d_]{0,4})$/; const reArr = regexp.exec(input || ''); const groups = reArr?.groups; let value = MASK_DATE; if (groups) { let day = groups['day'] || '__'; day = groups['s1'] ? day : day.padEnd(2, '_'); let month = groups['month'] || '__'; month = groups['s2'] ? month : month.padEnd(2, '_'); let year = groups['year'] || '____'; year = year.padEnd(4, '_'); value = day + '/' + month + '/' + year; } return value; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS1tYXNrLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1kc2ZyLWV4dC9zcmMvbGliL2RhdGVwaWNrZXIvbWFzay9kYXRlLW1hc2suZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBaUIsU0FBUyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFhLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMxRyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQzs7QUFFbEUsTUFBTSxTQUFTLEdBQUcsWUFBWSxDQUFDO0FBTS9COzs7O0dBSUc7QUFDSCxNQUFNLE9BQU8saUJBQWlCO0lBVDlCO1FBZW1CLGtCQUFhLEdBQTRCLE1BQU0sQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO1FBQ3pFLGVBQVUsR0FBZSxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDNUMsYUFBUSxHQUFjLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztLQXVEMUQ7SUFyREMsSUFBYSxZQUFZLENBQUMsS0FBYTtRQUNyQyxJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQztRQUMzQixJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7SUFDeEIsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsZUFBZTtRQUNiLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztJQUN4QixDQUFDO0lBRUQsV0FBVztRQUNULElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN6QixDQUFDO0lBRUQ7OztPQUdHO0lBQ0ssY0FBYztRQUNwQixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsYUFBYSxLQUFLLEVBQUUsQ0FBQztRQUMzQyxJQUFJLFFBQVEsRUFBRSxDQUFDO1lBQ2IsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ3RCLENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxD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QUUsTUFBTSxDQUFDO0lBQzdCLElBQUksS0FBSyxHQUFHLFNBQVMsQ0FBQztJQUN0QixJQUFJLE1BQU0sRUFBRSxDQUFDO1FBQ1gsSUFBSSxHQUFHLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQztRQUNoQyxHQUFHLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQzlDLElBQUksS0FBSyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxJQUFJLENBQUM7UUFDcEMsS0FBSyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNwRCxJQUFJLElBQUksR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksTUFBTSxDQUFDO1FBQ3BDLElBQUksR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUMzQixLQUFLLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxLQUFLLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQztJQUN6QyxDQUFDO0lBRUQsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWZ0ZXJWaWV3SW5pdCwgRGlyZWN0aXZlLCBFbGVtZW50UmVmLCBpbmplY3QsIElucHV0LCBPbkRlc3Ryb3ksIFJlbmRlcmVyMiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRHNmckRhdGVQaWNrZXJDb21wb25lbnQgfSBmcm9tICcuLi9kYXRlcGlja2VyLmNvbXBvbmVudCc7XG5cbmNvbnN0IE1BU0tfREFURSA9ICdfXy9fXy9fX19fJztcblxuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnW2RzZnJEYXRlTWFza10nLFxuICBzdGFuZGFsb25lOiB0cnVlLFxufSlcbi8qKlxuICogTCdvYmplY3RpZiBkZSBjZXR0ZSBkaXJlY3RpdmUgZXN0IGRlIHByb3Bvc2VyIHVuIG1hc3F1ZSBkZSBzYWlzaWUgc291cyBsYSBmb3JtZSBkZC9kZC9kZGRkZC5cbiAqIEBhdXRob3IgcGZvbnRhbmV0XG4gKiBAc2luY2UgMC4xMFxuICovXG5leHBvcnQgY2xhc3MgRGF0ZU1hc2tEaXJlY3RpdmUgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuICBwcml2YXRlIF9kc2ZyRGF0ZU1hc2s6IHN0cmluZztcblxuICBwcml2YXRlIGxpc3RlbktleXVwOiBhbnk7XG4gIHByaXZhdGUgbGlzdGVuS2V5ZG93bjogYW55O1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgaG9zdENvbXBvbmVudDogRHNmckRhdGVQaWNrZXJDb21wb25lbnQgPSBpbmplY3QoRHNmckRhdGVQaWNrZXJDb21wb25lbnQpO1xuICBwcml2YXRlIHJlYWRvbmx5IGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYgPSBpbmplY3QoRWxlbWVudFJlZik7XG4gIHByaXZhdGUgcmVhZG9ubHkgcmVuZGVyZXI6IFJlbmRlcmVyMiA9IGluamVjdChSZW5kZXJlcjIpO1xuXG4gIEBJbnB1dCgpIHNldCBkc2ZyRGF0ZU1hc2sodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX2RzZnJEYXRlTWFzayA9IHZhbHVlO1xuICAgIHRoaXMuZG9IaWRlU2hvd01hc2soKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBOT1RFIDogUG91cnF1b2kgbmdBZnRlclZpZXdJbml0IHBsdXTDtHQgcXVlIG5nT25Jbml0ID9cbiAgICogRXQgYmllbiwgcGFyY2UgcXVlIGRhbnMgbmdPbkluaXQsIGxlIERPTSBuJ2VzdCBwYXMgZW5jb3JlIGNvbnN0cnVpdCBldCBxdWUgbCdham91dCBkZSBsaXN0ZW5lcnMgZW4gZm9uY3Rpb25cbiAgICogZGUgbGEgdmFsZXVyIGR1IG1hc3F1ZSBuZSBtYXJjaGUgcGFzIGNhciwgdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignLmZyLWlucHV0JykgPT09IG51bGxcbiAgICogZXQgZHUgY291cCByaWVuIG5lIG1hcmNoZSAhISFcbiAgICovXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICB0aGlzLmRvSGlkZVNob3dNYXNrKCk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLnJlbW92ZUxpc3RlbmVycygpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhY2hlIC8gYWZmaWNoZSBsZSBtYXNxdWUgZW4gZm9uY3Rpb24gZGUgbGEgcHJvcHJpw6l0w6kgYG1hc2tgLlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBkb0hpZGVTaG93TWFzaygpIHtcbiAgICBjb25zdCBzaG93TWFzayA9IHRoaXMuX2RzZnJEYXRlTWFzayAhPT0gJyc7XG4gICAgaWYgKHNob3dNYXNrKSB7XG4gICAgICB0aGlzLmFkZExpc3RlbmVycygpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnJlbW92ZUxpc3RlbmVycygpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYWRkTGlzdGVuZXJzKCk6IHZvaWQge1xuICAgIHRoaXMuaG9zdENvbXBvbmVudC52YWx1ZSA9IGZvcm1hdERhdGVNYXNrVmFsdWUodGhpcy5ob3N0Q29tcG9uZW50LnZhbHVlKTtcbiAgICAvLyBOT1RFIDogUG91cnF1b2kgbmUgcGFzIHV0aWxpc2VyIHJlbmRlcmVyLnNlbGVjdFJvb3RFbGVtZW50KCkgP1xuICAgIC8vIFBhcmNlIHF1ZSBsZSBzZXR0ZXIgZGUgZHNmckRhdGVNYXNrIGVzdCBpbnZvcXXDqSBsb3JzIGRlIGwnw6l0YXBlIGQnaW5pdCwgbGUgRE9NIG4nZXN0IHBhcyBjb25zdHJ1aXRcbiAgICAvLyBldCBxdWUgc2VsZWN0Um9vdEVsZW1lbnQgYWZmaWNoZSB1bmUgZXhjZXB0aW9uIGRhbnMgbGEgY29uc29sZSwgY29udHJhaXJlbWVudCDDoCBxdWVyeVNlbGVjdG9yXG4gICAgLy8gQSBsJ2luaXQgaW5wdXRFbHQgPT09IG51bGxcbiAgICBjb25zdCBpbnB1dEVsdCA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5mci1pbnB1dCcpO1xuICAgIGlmIChpbnB1dEVsdCkge1xuICAgICAgdGhpcy5saXN0ZW5LZXlkb3duID0gdGhpcy5yZW5kZXJlci5saXN0ZW4oaW5wdXRFbHQsICdrZXlkb3duJywgb25JbnB1dEtleURvd24pO1xuICAgICAgdGhpcy5saXN0ZW5LZXl1cCA9IHRoaXMucmVuZGVyZXIubGlzdGVuKGlucHV0RWx0LCAna2V5dXAnLCBvbklucHV0S2V5VXApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcmVtb3ZlTGlzdGVuZXJzKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmxpc3RlbktleWRvd24pIHtcbiAgICAgIHRoaXMubGlzdGVuS2V5ZG93bigpO1xuICAgIH1cbiAgICBpZiAodGhpcy5saXN0ZW5LZXl1cCkge1xuICAgICAgdGhpcy5saXN0ZW5LZXl1cCgpO1xuICAgIH1cbiAgfVxufVxuXG4vKiAtLSBUcmFpdGVtZW50IGR1IG1hc3F1ZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLyoqXG4gKiBUcmFpdGUgbGVzIMOpdsOpbmVtZW50cyBkdSBjbGF2aWVyIGRhbnMgbGUgY2hhbXAgZGF0ZS5cbiAqIC0gUGVybWV0IGxhIHNhaXNpZSBkZXMgY2hpZmZyZXMgZGUgMCDDoCA5XG4gKiAtIFBlcm1ldCBsYSB0YWJ1bGF0aW9uIGF2YW50IC8gYXJyacOocmUgZGFucyBsZXMgcGFydGllcyBqb3VyIC8gbW9pcyAvIGFubsOpZVxuICogQHBhcmFtIGV2ZW50XG4gKi9cbmZ1bmN0aW9uIG9uSW5wdXRLZXlEb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gIC8vIFNpIGNlIG4nZXN0IHBhcyB1biBub21icmUsIG9uIG5lIGZhaXQgcmllblxuICBjb25zdCBpbnB1dEVsdCA9IDxIVE1MSW5wdXRFbGVtZW50PmV2ZW50LmN1cnJlbnRUYXJnZXQ7XG4gIGNvbnN0IGlzRGlnaXQgPSAvXFxkLy50ZXN0KGV2ZW50LmtleSk7XG4gIGlmIChpc0RpZ2l0KSB7XG4gICAgZG9EaWdpdEtleURvd24oaW5wdXRFbHQpO1xuICB9IGVsc2Uge1xuICAgIHN3aXRjaCAoZXZlbnQua2V5KSB7XG4gICAgICBjYXNlICdUYWInOlxuICAgICAgICBjb25zdCBldmVudFByb2Nlc3NlZCA9IGV2ZW50LnNoaWZ0S2V5ID8gZG9TaGlmdFRhYktleShpbnB1dEVsdCkgOiBkb1RhYktleShpbnB1dEVsdCk7XG4gICAgICAgIGlmIChldmVudFByb2Nlc3NlZCkge1xuICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIGNvbnN0IGlzTGV0dGVyID0gL1thLXpBLVpdLy50ZXN0KGV2ZW50LmtleSk7XG4gICAgICAgIGlmIChpc0xldHRlcikge1xuICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogRmluYWxpc2UgbGUgdHJhaXRlbWVudCBkdSBjbGF2aWVyIGFwcsOocyBpbnNlcnRpb24gZCd1biBkaWdpdC5cbiAqL1xuZnVuY3Rpb24gb25JbnB1dEtleVVwKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gIC8vIFNpIGNlIG4nZXN0IHBhcyB1biBub21icmUsIG9uIG5lIGZhaXQgcmllblxuICBjb25zdCBpbnB1dEVsdCA9IDxIVE1MSW5wdXRFbGVtZW50PmV2ZW50LmN1cnJlbnRUYXJnZXQ7XG4gIGNvbnN0IGlzRGlnaXQgPSAvXFxkLy50ZXN0KGV2ZW50LmtleSk7XG4gIGlmIChpc0RpZ2l0KSB7XG4gICAgZG9EaWdpdEtleVVwKGlucHV0RWx0KTtcbiAgfVxufVxuXG4vKipcbiAqIFRyYWl0ZW1lbnQgQVZBTlQgaW5zZXJ0aW9uIGQndW4gZGlnaXQgZGFucyBsZSBjaGFtcCBkYXRlXG4gKiAtIFN1cHByZXNzaW9uIGRlICdfJyBxdWkgc2VyYSByZW1wbGFjw6kgcGFyIGxlIGRpZ2l0IChsZSBjaGFtcCBuZSBkw6lwYXNzZSBwYXMgMTAgY2FyYWN0w6hyZXMpXG4gKiAtIE9uIHJlcGxhY2UgbGUgY3Vyc2V1ciBvw7kgaWwgw6l0YWl0XG4gKi9cbmZ1bmN0aW9uIGRvRGlnaXRLZXlEb3duKGlucHV0RWx0OiBIVE1MSW5wdXRFbGVtZW50KSB7XG4gIC8vIEF1IGNhcyBvw7kgbCd1dGlsaXNhdGV1ciBhIGNsaXF1w6kgZGV2YW50IHVuIHPDqXBhcmF0ZXVyLCBvbiBsZSBzYXV0ZVxuICAvLyBFdCBiZW4gTk9OLCBjYXIgc2kgb24gYSAxLzFeLzIwMjQgKGxlIGNoYXBlYXUgcmVwcsOpc2VudGFudCBsZSBwb2ludCBkJ2luc2VydGlvbiksIG9uIGxhaXNzZSBmYWlyZVxuICBjb25zdCB2YWx1ZSA9IGlucHV0RWx0LnZhbHVlIHx8ICcnO1xuICBsZXQgc2VsU3RhcnQgPSBpbnB1dEVsdC5zZWxlY3Rpb25TdGFydCB8fCAwO1xuXG4gIC8vIE9uIHN1cHByaW1lIGxlICdfJyBhZmluIGRlIHBvdXZvaXIgaW5zw6lyZXIgbGUgZGlnaXQgw6AgbGEgcGxhY2VcbiAgaWYgKHZhbHVlW3NlbFN0YXJ0XSA9PSAnXycpIHtcbiAgICBpbnB1dEVsdC52YWx1ZSA9IHZhbHVlLnNsaWNlKDAsIHNlbFN0YXJ0KSArIHZhbHVlLnNsaWNlKHNlbFN0YXJ0ICsgMSk7XG4gICAgaW5wdXRFbHQuc2VsZWN0aW9uU3RhcnQgPSBzZWxTdGFydDtcbiAgICBpbnB1dEVsdC5zZWxlY3Rpb25FbmQgPSBzZWxTdGFydDtcbiAgfVxufVxuXG4vKipcbiAqIFRyYWl0ZW1lbnQgQVBSRVMgaW5zZXJ0aW9uIGQndW4gY2FyYWN0w6hyZSBkYW5zIGxlIGNoYW1wIGRhdGVcbiAqIC0gU2F1dCBkJ3VuIHPDqXBhcmF0ZXVyIHMnaWwgeSBhIGxpZXVcbiAqIC0gUmVmb3JtYXRhZ2UgZHUgY2hhbXAgc2kgbCd1dGlsaXNhdGV1ciBhIHN1cHByaW3DqSBkZXMgw6lsw6ltZW50cyBkdSBtYXNxdWVcbiAqL1xuZnVuY3Rpb24gZG9EaWdpdEtleVVwKGlucHV0RWx0OiBIVE1MSW5wdXRFbGVtZW50KTogdm9pZCB7XG4gIC8vIEF1IGNhcyBvw7kgbCd1dGlsaXNhdGV1ciBzZSByZXRyb3V2ZSBkZXZhbnQgdW4gc8OpcGFyYXRldXIsIG9uIGxlIHNhdXRlXG4gIGNvbnN0IHZhbHVlID0gaW5wdXRFbHQudmFsdWUgfHwgJyc7XG4gIGxldCBzZWxTdGFydCA9IGlucHV0RWx0LnNlbGVjdGlvblN0YXJ0IHx8IDA7XG4gIGlmICh2YWx1ZVtzZWxTdGFydF0gPT09ICcvJyAmJiAoc2VsU3RhcnQgPT09IDIgfHwgc2VsU3RhcnQgPT0gNSkpIHtcbiAgICBpbnB1dEVsdC5zZWxlY3Rpb25TdGFydCA9ICsrc2VsU3RhcnQ7XG4gIH1cblxuICAvLyBPbiByZWZvcm1hdGUgc2kgbsOpY2Vzc2FpcmVcbiAgaWYgKHZhbHVlLmxlbmd0aCA8IDgpIHtcbiAgICBpbnB1dEVsdC52YWx1ZSA9IGZvcm1hdERhdGVNYXNrVmFsdWUoaW5wdXRFbHQudmFsdWUpO1xuICB9XG59XG5cbi8qKlxuICogVGFiIEFWQU5UIGRhbnMgbGUgY2hhbXAgZGF0ZVxuICogLSBUYWJ1bGF0aW9uIGVuIGF2YW50IGRlIHBhcnQgZW4gcGFydCAoam91ciwgbW9pcywgYW5uw6llKSwgcHVpcyB0YWJ1bGF0aW9uIHN1ciBjaGFtcCBzdWl2YW50XG4gKi9cbmZ1bmN0aW9uIGRvVGFiS2V5KGlucHV0RWx0OiBIVE1MSW5wdXRFbGVtZW50KTogYm9vbGVhbiB7XG4gIGNvbnN0IHZhbHVlID0gaW5wdXRFbHQudmFsdWUgfHwgJyc7XG4gIGNvbnN0IHNlbEVuZCA9IGlucHV0RWx0LnNlbGVjdGlvbkVuZCB8fCAwO1xuICBjb25zdCBwb3MgPSB2YWx1ZS5pbmRleE9mKCcvJywgc2VsRW5kKTtcbiAgaWYgKHBvcyA+IC0xKSB7XG4gICAgaW5wdXRFbHQuc2VsZWN0aW9uU3RhcnQgPSBwb3MgKyAxO1xuICAgIGlucHV0RWx0LnNlbGVjdGlvbkVuZCA9IGlucHV0RWx0LnNlbGVjdGlvblN0YXJ0O1xuICB9XG4gIHJldHVybiBwb3MgPiAtMTtcbn1cblxuLyoqXG4gKiBUYWIgQVJSSUVSRSBkYW5zIGxlIGNoYW1wIGRhdGVcbiAqIC0gVGFidWxhdGlvbiBlbiBhcnJpw6hyZSBkZSBwYXJ0IGVuIHBhcnQgKGFubsOpZSwgbW9pcywgam91ciksIHB1aXMgdGFidWxhdGlvbiBzdXIgY2hhbXAgcHLDqWPDqWRlbnRcbiAqL1xuZnVuY3Rpb24gZG9TaGlmdFRhYktleShpbnB1dEVsdDogSFRNTElucHV0RWxlbWVudCk6IGJvb2xlYW4ge1xuICBjb25zdCB2YWx1ZSA9IGlucHV0RWx0LnZhbHVlIHx8ICcnO1xuICBjb25zdCBzZWxTdGFydCA9IGlucHV0RWx0LnNlbGVjdGlvblN0YXJ0IHx8IDA7XG4gIGNvbnN0IHBvcyA9IHZhbHVlLnN1YnN0cmluZygwLCBzZWxTdGFydCkubGFzdEluZGV4T2YoJy8nKTtcbiAgaWYgKHBvcyA+IC0xKSB7XG4gICAgaW5wdXRFbHQuc2VsZWN0aW9uU3RhcnQgPSBwb3M7XG4gICAgaW5wdXRFbHQuc2VsZWN0aW9uRW5kID0gaW5wdXRFbHQuc2VsZWN0aW9uU3RhcnQ7XG4gIH1cbiAgcmV0dXJuIHBvcyA+IC0xO1xufVxuXG4vKipcbiAqIFJlZm9ybWF0YWdlIGRlIGxhIHZhbGV1ciwgcXVlbGxlIHF1ZSBzb2l0IGxhIHNhaXNpZVxuICogQHBhcmFtIGlucHV0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXREYXRlTWFza1ZhbHVlKGlucHV0OiBzdHJpbmcgfCB1bmRlZmluZWQpOiBzdHJpbmcge1xuICBjb25zdCByZWdleHAgPSAvXig/PGRheT5bXFxkX117MCwyfSkoPzxzMT5cXC8/KSg/PG1vbnRoPltcXGRfXXswLDJ9KSg/PHMyPlxcLz8pKD88eWVhcj5bXFxkX117MCw0fSkkLztcbiAgY29uc3QgcmVBcnIgPSByZWdleHAuZXhlYyhpbnB1dCB8fCAnJyk7XG4gIGNvbnN0IGdyb3VwcyA9IHJlQXJyPy5ncm91cHM7XG4gIGxldCB2YWx1ZSA9IE1BU0tfREFURTtcbiAgaWYgKGdyb3Vwcykge1xuICAgIGxldCBkYXkgPSBncm91cHNbJ2RheSddIHx8ICdfXyc7XG4gICAgZGF5ID0gZ3JvdXBzWydzMSddID8gZGF5IDogZGF5LnBhZEVuZCgyLCAnXycpO1xuICAgIGxldCBtb250aCA9IGdyb3Vwc1snbW9udGgnXSB8fCAnX18nO1xuICAgIG1vbnRoID0gZ3JvdXBzWydzMiddID8gbW9udGggOiBtb250aC5wYWRFbmQoMiwgJ18nKTtcbiAgICBsZXQgeWVhciA9IGdyb3Vwc1sneWVhciddIHx8ICdfX19fJztcbiAgICB5ZWFyID0geWVhci5wYWRFbmQoNCwgJ18nKTtcbiAgICB2YWx1ZSA9IGRheSArICcvJyArIG1vbnRoICsgJy8nICsgeWVhcjtcbiAgfVxuXG4gIHJldHVybiB2YWx1ZTtcbn1cbiJdfQ==