UNPKG

truly-ui

Version:

Web Components for Desktop Applications.

232 lines (230 loc) 28.2 kB
/* MIT License Copyright (c) 2019 Temainfo Software Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ import { Injectable } from '@angular/core'; import * as i0 from "@angular/core"; import * as i1 from "../../i18n/i18n.service"; export class NavigatorManagerService { get monthsDescription() { return this.i18n.getLocale().Navigator.monthsDescription; } get daysDescription() { return this.i18n.getLocale().Navigator.daysDescription; } constructor(i18n) { this.i18n = i18n; this.date = new Date(); } previous() { this.managerPreviousAction(); } next() { this.managerNextAction(); } setType(type) { this.type = type; } setRange(range) { this.range = range; } setDate(date) { this.date = date; this.currentMonth = this.date.getMonth(); this.currentYear = this.date.getFullYear(); this.currentDay = this.date.getDate(); this.startYear = this.date.getFullYear(); this.endYear = this.date.getFullYear() + this.range; } getDataObject() { return { day: this.currentDay, month: this.currentMonth, year: this.currentYear, fullDate: new Date(this.currentYear, this.currentMonth, this.currentDay, new Date().getHours(), new Date().getMinutes()), rangeYear: { start: this.startYear, end: this.endYear } }; } getDescription() { switch (this.type) { case 'monthyear': { return this.getMonthDescription() + ' ' + this.getYearDescription(); } case 'year': { return this.getYearDescription().toString(); } case 'rangeyear': { return this.getRangeYear().toString(); } case 'day': { return this.getDayDescription().toString(); } case 'rangeweek': { return this.getRangeWeekDescription().toString(); } } } managerPreviousAction() { switch (this.type) { case 'monthyear': { this.monthYearTypePrevious(); break; } case 'year': { this.yearTypePrevious(); break; } case 'rangeyear': { this.rangeYearTypePrevious(); break; } case 'day': { this.dayTypePrevious(); break; } case 'rangeweek': { this.rangeWeekTypePrevious(); break; } } } managerNextAction() { switch (this.type) { case 'monthyear': { this.monthYearTypeNext(); break; } case 'year': { this.yearTypeNext(); break; } case 'rangeyear': { this.rangeYearTypeNext(); break; } case 'day': { this.dayTypeNext(); break; } case 'rangeweek': { this.rangeWeekTypeNext(); break; } } } getYearDescription() { return this.currentYear; } getRangeYear() { return this.startYear + ' - ' + this.endYear; } getDayDescription() { const dayOfMonth = new Date(this.currentYear, this.currentMonth, this.currentDay).getDate(); const weekDay = this.daysDescription[new Date(this.currentYear, this.currentMonth, this.currentDay).getDay()]; return dayOfMonth + ' ' + weekDay; } getRangeWeekDescription() { const startDate = this.getAtualDateFromParameters(); const endDate = new Date(startDate.getTime() + 6 * 24 * 60 * 60 * 1000); // Ajustar a data de início para a segunda-feira const diff = startDate.getDay() - 1; // Calcule a diferença em dias de domingo para segunda-feira startDate.setDate(startDate.getDate() - diff); // Ajustar a data de término para o domingo const diffEnd = 0 - endDate.getDay(); // Calcule a diferença em dias de segunda a domingo endDate.setDate(endDate.getDate() + diffEnd); const startDay = startDate.getDate(); const endDay = endDate.getDate(); const startMonth = this.monthsDescription[startDate.getMonth()]; const startYear = startDate.getFullYear(); return `${startDay} - ${endDay} ${startMonth} ${startYear}`; } getMonthDescription() { return this.monthsDescription[this.currentMonth]; } // =============================== \\ monthYearTypeNext() { const date = this.getAtualDateFromParameters(); date.setMonth(this.date.getMonth() + 1); this.setDate(date); } monthYearTypePrevious() { const date = this.getAtualDateFromParameters(); date.setMonth(this.date.getMonth() - 1); this.setDate(date); } yearTypePrevious() { const date = this.getAtualDateFromParameters(); date.setFullYear(this.date.getFullYear() - 1); this.setDate(date); } yearTypeNext() { const date = this.getAtualDateFromParameters(); date.setFullYear(this.date.getFullYear() + 1); this.setDate(date); } dayTypePrevious() { const date = this.getAtualDateFromParameters(); date.setDate(this.date.getDate() - 1); this.setDate(date); } dayTypeNext() { const date = this.getAtualDateFromParameters(); date.setDate(this.date.getDate() + 1); this.setDate(date); } rangeYearTypePrevious() { this.startYear -= this.range; this.endYear -= this.range; } rangeYearTypeNext() { this.startYear += this.range; this.endYear += this.range; } getAtualDateFromParameters() { return new Date(this.currentYear, this.currentMonth, this.currentDay); } rangeWeekTypePrevious() { const date = this.getAtualDateFromParameters(); const currentDayOfWeek = date.getDay(); const startOfWeek = new Date(date.getTime() - currentDayOfWeek * 24 * 60 * 60 * 1000); const endOfWeek = new Date(startOfWeek.getTime() - 6 * 24 * 60 * 60 * 1000); // Verificar se o início da semana é segunda if (currentDayOfWeek === 0) { startOfWeek.setDate(startOfWeek.getDate() - 1); // Ajustar de segunda a domingo } if (endOfWeek >= this.date) { this.setDate(startOfWeek); } else { this.setDate(endOfWeek); } } rangeWeekTypeNext() { const date = this.getAtualDateFromParameters(); const currentDayOfWeek = date.getDay(); const startOfWeek = new Date(date.getTime() + (8 - currentDayOfWeek) * 24 * 60 * 60 * 1000); const endOfWeek = new Date(startOfWeek.getTime() + 6 * 24 * 60 * 60 * 1000); this.setDate(startOfWeek); } } /** @nocollapse */ NavigatorManagerService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: NavigatorManagerService, deps: [{ token: i1.I18nService }], target: i0.ɵɵFactoryTarget.Injectable }); /** @nocollapse */ NavigatorManagerService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: NavigatorManagerService }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: NavigatorManagerService, decorators: [{ type: Injectable }], ctorParameters: function () { return [{ type: i1.I18nService }]; } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmF2aWdhdG9yLW1hbmFnZXIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RydWx5LXVpL3NyYy9jb21wb25lbnRzL25hdmlnYXRvci9zZXJ2aWNlcy9uYXZpZ2F0b3ItbWFuYWdlci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztFQW9CRTtBQUVGLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7OztBQUkzQyxNQUFNLE9BQU8sdUJBQXVCO0lBa0JsQyxJQUFJLGlCQUFpQjtRQUNuQixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsU0FBUyxDQUFDLGlCQUFpQixDQUFDO0lBQzNELENBQUM7SUFDRCxJQUFJLGVBQWU7UUFDakIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxlQUFlLENBQUM7SUFDekQsQ0FBQztJQUVELFlBQXFCLElBQWlCO1FBQWpCLFNBQUksR0FBSixJQUFJLENBQWE7UUFiOUIsU0FBSSxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7SUFhZ0IsQ0FBQztJQUUzQyxRQUFRO1FBQ04sSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7SUFDL0IsQ0FBQztJQUVELElBQUk7UUFDRixJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztJQUMzQixDQUFDO0lBRUQsT0FBTyxDQUFDLElBQUk7UUFDVixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztJQUNuQixDQUFDO0lBRUQsUUFBUSxDQUFDLEtBQUs7UUFDWixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztJQUNyQixDQUFDO0lBRUQsT0FBTyxDQUFDLElBQUk7UUFDVixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztRQUNqQixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUks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UyxDQUFDLENBQUM7U0FDekI7SUFDSCxDQUFDO0lBRU8saUJBQWlCO1FBQ3ZCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQywwQkFBMEIsRUFBRSxDQUFDO1FBQy9DLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ3ZDLE1BQU0sV0FBVyxHQUFHLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxnQkFBZ0IsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDO1FBQzVGLE1BQU0sU0FBUyxHQUFHLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUM7UUFDNUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUM1QixDQUFDOzt3SUFqTlUsdUJBQXVCOzRJQUF2Qix1QkFBdUI7NEZBQXZCLHVCQUF1QjtrQkFEbkMsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gICAgTUlUIExpY2Vuc2VcblxuICAgIENvcHlyaWdodCAoYykgMjAxOSBUZW1haW5mbyBTb2Z0d2FyZVxuXG4gICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuICAgIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbiAgICBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4gICAgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuICAgIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuICAgIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4gICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsXG4gICAgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbiAgICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4gICAgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4gICAgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4gICAgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuICAgIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4gICAgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEVcbiAgICBTT0ZUV0FSRS5cbiovXG5cbmltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEkxOG5TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vaTE4bi9pMThuLnNlcnZpY2UnO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgTmF2aWdhdG9yTWFuYWdlclNlcnZpY2Uge1xuXG4gIHByaXZhdGUgY3VycmVudE1vbnRoOiBudW1iZXI7XG5cbiAgcHJpdmF0ZSBjdXJyZW50WWVhcjogbnVtYmVyO1xuXG4gIHByaXZhdGUgY3VycmVudERheTogbnVtYmVyO1xuXG4gIHByaXZhdGUgc3RhcnRZZWFyOiBudW1iZXI7XG5cbiAgcHJpdmF0ZSBlbmRZZWFyOiBudW1iZXI7XG5cbiAgcHJpdmF0ZSBkYXRlID0gbmV3IERhdGUoKTtcblxuICBwcml2YXRlIHR5cGU6IHN0cmluZztcblxuICBwcml2YXRlIHJhbmdlOiBudW1iZXI7XG5cbiAgZ2V0IG1vbnRoc0Rlc2NyaXB0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLmkxOG4uZ2V0TG9jYWxlKCkuTmF2aWdhdG9yLm1vbnRoc0Rlc2NyaXB0aW9uO1xuICB9XG4gIGdldCBkYXlzRGVzY3JpcHRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuaTE4bi5nZXRMb2NhbGUoKS5OYXZpZ2F0b3IuZGF5c0Rlc2NyaXB0aW9uO1xuICB9XG5cbiAgY29uc3RydWN0b3IoIHByaXZhdGUgaTE4bjogSTE4blNlcnZpY2UgKSB7fVxuXG4gIHByZXZpb3VzKCkge1xuICAgIHRoaXMubWFuYWdlclByZXZpb3VzQWN0aW9uKCk7XG4gIH1cblxuICBuZXh0KCkge1xuICAgIHRoaXMubWFuYWdlck5leHRBY3Rpb24oKTtcbiAgfVxuXG4gIHNldFR5cGUodHlwZSkge1xuICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gIH1cblxuICBzZXRSYW5nZShyYW5nZSkge1xuICAgIHRoaXMucmFuZ2UgPSByYW5nZTtcbiAgfVxuXG4gIHNldERhdGUoZGF0ZSkge1xuICAgIHRoaXMuZGF0ZSA9IGRhdGU7XG4gICAgdGhpcy5jdXJyZW50TW9udGggPSB0aGlzLmRhdGUuZ2V0TW9udGgoKTtcbiAgICB0aGlzLmN1cnJlbnRZZWFyID0gdGhpcy5kYXRlLmdldEZ1bGxZZWFyKCk7XG4gICAgdGhpcy5jdXJyZW50RGF5ID0gdGhpcy5kYXRlLmdldERhdGUoKTtcblxuICAgIHRoaXMuc3RhcnRZZWFyID0gdGhpcy5kYXRlLmdldEZ1bGxZZWFyKCk7XG4gICAgdGhpcy5lbmRZZWFyID0gdGhpcy5kYXRlLmdldEZ1bGxZZWFyKCkgKyB0aGlzLnJhbmdlO1xuXG4gIH1cblxuICBnZXREYXRhT2JqZWN0KCkge1xuICAgIHJldHVybiB7XG4gICAgICBkYXk6IHRoaXMuY3VycmVudERheSxcbiAgICAgIG1vbnRoOiB0aGlzLmN1cnJlbnRNb250aCxcbiAgICAgIHllYXI6IHRoaXMuY3VycmVudFllYXIsXG4gICAgICBmdWxsRGF0ZTogbmV3IERhdGUoIHRoaXMuY3VycmVudFllYXIsIHRoaXMuY3VycmVudE1vbnRoLCB0aGlzLmN1cnJlbnREYXksIG5ldyBEYXRlKCkuZ2V0SG91cnMoKSwgbmV3IERhdGUoKS5nZXRNaW51dGVzKCkgKSxcbiAgICAgIHJhbmdlWWVhcjoge3N0YXJ0OiB0aGlzLnN0YXJ0WWVhciwgZW5kOiB0aGlzLmVuZFllYXJ9XG4gICAgfTtcbiAgfVxuXG4gIGdldERlc2NyaXB0aW9uKCk6IHN0cmluZyB7XG4gICAgc3dpdGNoICggdGhpcy50eXBlICkgIHtcbiAgICAgIGNhc2UgJ21vbnRoeWVhcic6IHsgcmV0dXJuIHRoaXMuZ2V0TW9udGhEZXNjcmlwdGlvbigpICsgJyAnICsgdGhpcy5nZXRZZWFyRGVzY3JpcHRpb24oKTsgfVxuICAgICAgY2FzZSAneWVhcic6IHsgcmV0dXJuIHRoaXMuZ2V0WWVhckRlc2NyaXB0aW9uKCkudG9TdHJpbmcoKTsgfVxuICAgICAgY2FzZSAncmFuZ2V5ZWFyJzogeyByZXR1cm4gdGhpcy5nZXRSYW5nZVllYXIoKS50b1N0cmluZygpOyB9XG4gICAgICBjYXNlICdkYXknOiB7IHJldHVybiB0aGlzLmdldERheURlc2NyaXB0aW9uKCkudG9TdHJpbmcoKTsgfVxuICAgICAgY2FzZSAncmFuZ2V3ZWVrJzogeyByZXR1cm4gdGhpcy5nZXRSYW5nZVdlZWtEZXNjcmlwdGlvbigpLnRvU3RyaW5nKCk7IH1cbiAgICB9XG4gIH1cblxuXG4gIHByaXZhdGUgbWFuYWdlclByZXZpb3VzQWN0aW9uKCkge1xuICAgIHN3aXRjaCAoIHRoaXMudHlwZSApICB7XG4gICAgICBjYXNlICdtb250aHllYXInOiB7IHRoaXMubW9udGhZZWFyVHlwZVByZXZpb3VzKCk7IGJyZWFrOyB9XG4gICAgICBjYXNlICd5ZWFyJzogeyB0aGlzLnllYXJUeXBlUHJldmlvdXMoKTsgYnJlYWs7IH1cbiAgICAgIGNhc2UgJ3JhbmdleWVhcic6IHsgdGhpcy5yYW5nZVllYXJUeXBlUHJldmlvdXMoKTsgYnJlYWs7IH1cbiAgICAgIGNhc2UgJ2RheSc6IHsgdGhpcy5kYXlUeXBlUHJldmlvdXMoKTsgYnJlYWs7IH1cbiAgICAgIGNhc2UgJ3Jhbmdld2Vlayc6IHsgdGhpcy5yYW5nZVdlZWtUeXBlUHJldmlvdXMoKTsgYnJlYWs7IH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG1hbmFnZXJOZXh0QWN0aW9uKCkge1xuICAgIHN3aXRjaCAoIHRoaXMudHlwZSApICB7XG4gICAgICBjYXNlICdtb250aHllYXInOiB7IHRoaXMubW9udGhZZWFyVHlwZU5leHQoKTsgYnJlYWs7IH1cbiAgICAgIGNhc2UgJ3llYXInOiB7IHRoaXMueWVhclR5cGVOZXh0KCk7IGJyZWFrOyB9XG4gICAgICBjYXNlICdyYW5nZXllYXInOiB7IHRoaXMucmFuZ2VZZWFyVHlwZU5leHQoKTsgYnJlYWs7IH1cbiAgICAgIGNhc2UgJ2RheSc6IHsgdGhpcy5kYXlUeXBlTmV4dCgpOyBicmVhazsgfVxuICAgICAgY2FzZSAncmFuZ2V3ZWVrJzogeyB0aGlzLnJhbmdlV2Vla1R5cGVOZXh0KCk7IGJyZWFrOyB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRZZWFyRGVzY3JpcHRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuY3VycmVudFllYXI7XG4gIH1cblxuXG4gIHByaXZhdGUgZ2V0UmFuZ2VZZWFyKCkge1xuICAgIHJldHVybiB0aGlzLnN0YXJ0WWVhciArICcgLSAnICsgdGhpcy5lbmRZZWFyO1xuICB9XG5cblxuICBwcml2YXRlIGdldERheURlc2NyaXB0aW9uKCkge1xuICAgIGNvbnN0IGRheU9mTW9udGggPSBuZXcgRGF0ZSh0aGlzLmN1cnJlbnRZZWFyLCB0aGlzLmN1cnJlbnRNb250aCwgdGhpcy5jdXJyZW50RGF5KS5nZXREYXRlKCk7XG4gICAgY29uc3Qgd2Vla0RheSA9IHRoaXMuZGF5c0Rlc2NyaXB0aW9uWyBuZXcgRGF0ZSh0aGlzLmN1cnJlbnRZZWFyLCB0aGlzLmN1cnJlbnRNb250aCwgdGhpcy5jdXJyZW50RGF5KS5nZXREYXkoKSBdO1xuICAgIHJldHVybiBkYXlPZk1vbnRoICsgJyAnICsgd2Vla0RheTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0UmFuZ2VXZWVrRGVzY3JpcHRpb24oKTogc3RyaW5nIHtcbiAgICBjb25zdCBzdGFydERhdGUgPSB0aGlzLmdldEF0dWFsRGF0ZUZyb21QYXJhbWV0ZXJzKCk7XG4gICAgY29uc3QgZW5kRGF0ZSA9IG5ldyBEYXRlKHN0YXJ0RGF0ZS5nZXRUaW1lKCkgKyA2ICogMjQgKiA2MCAqIDYwICogMTAwMCk7XG5cbiAgICAvLyBBanVzdGFyIGEgZGF0YSBkZSBpbsOtY2lvIHBhcmEgYSBzZWd1bmRhLWZlaXJhXG4gICAgY29uc3QgZGlmZiA9IHN0YXJ0RGF0ZS5nZXREYXkoKSAtIDE7IC8vIENhbGN1bGUgYSBkaWZlcmVuw6dhIGVtIGRpYXMgZGUgZG9taW5nbyBwYXJhIHNlZ3VuZGEtZmVpcmFcbiAgICBzdGFydERhdGUuc2V0RGF0ZShzdGFydERhdGUuZ2V0RGF0ZSgpIC0gZGlmZik7XG5cbiAgICAvLyBBanVzdGFyIGEgZGF0YSBkZSB0w6lybWlubyBwYXJhIG8gZG9taW5nb1xuICAgIGNvbnN0IGRpZmZFbmQgPSAwIC0gZW5kRGF0ZS5nZXREYXkoKTsgLy8gQ2FsY3VsZSBhIGRpZmVyZW7Dp2EgZW0gZGlhcyBkZSBzZWd1bmRhIGEgZG9taW5nb1xuICAgIGVuZERhdGUuc2V0RGF0ZShlbmREYXRlLmdldERhdGUoKSArIGRpZmZFbmQpO1xuXG4gICAgY29uc3Qgc3RhcnREYXkgPSBzdGFydERhdGUuZ2V0RGF0ZSgpO1xuICAgIGNvbnN0IGVuZERheSA9IGVuZERhdGUuZ2V0RGF0ZSgpO1xuICAgIGNvbnN0IHN0YXJ0TW9udGggPSB0aGlzLm1vbnRoc0Rlc2NyaXB0aW9uW3N0YXJ0RGF0ZS5nZXRNb250aCgpXTtcbiAgICBjb25zdCBzdGFydFllYXIgPSBzdGFydERhdGUuZ2V0RnVsbFllYXIoKTtcblxuICAgIHJldHVybiBgJHtzdGFydERheX0gLSAke2VuZERheX0gJHtzdGFydE1vbnRofSAke3N0YXJ0WWVhcn1gO1xuICB9XG5cblxuICBwcml2YXRlIGdldE1vbnRoRGVzY3JpcHRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMubW9udGhzRGVzY3JpcHRpb25bdGhpcy5jdXJyZW50TW9udGhdO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBcXFxcXG4gIHByaXZhdGUgbW9udGhZZWFyVHlwZU5leHQoKSB7XG4gICAgY29uc3QgZGF0ZSA9IHRoaXMuZ2V0QXR1YWxEYXRlRnJvbVBhcmFtZXRlcnMoKTtcbiAgICBkYXRlLnNldE1vbnRoKCB0aGlzLmRhdGUuZ2V0TW9udGgoKSArIDEgKTtcbiAgICB0aGlzLnNldERhdGUoIGRhdGUgKTtcbiAgfVxuXG4gIHByaXZhdGUgbW9udGhZZWFyVHlwZVByZXZpb3VzKCkge1xuICAgIGNvbnN0IGRhdGUgPSB0aGlzLmdldEF0dWFsRGF0ZUZyb21QYXJhbWV0ZXJzKCk7XG4gICAgZGF0ZS5zZXRNb250aCggdGhpcy5kYXRlLmdldE1vbnRoKCkgLSAxICk7XG4gICAgdGhpcy5zZXREYXRlKCBkYXRlICk7XG4gIH1cblxuICBwcml2YXRlIHllYXJUeXBlUHJldmlvdXMoKSB7XG4gICAgY29uc3QgZGF0ZSA9IHRoaXMuZ2V0QXR1YWxEYXRlRnJvbVBhcmFtZXRlcnMoKTtcbiAgICBkYXRlLnNldEZ1bGxZZWFyKCB0aGlzLmRhdGUuZ2V0RnVsbFllYXIoKSAtIDEgKTtcbiAgICB0aGlzLnNldERhdGUoIGRhdGUgKTtcbiAgfVxuXG4gIHByaXZhdGUgeWVhclR5cGVOZXh0KCkge1xuICAgIGNvbnN0IGRhdGUgPSB0aGlzLmdldEF0dWFsRGF0ZUZyb21QYXJhbWV0ZXJzKCk7XG4gICAgZGF0ZS5zZXRGdWxsWWVhciggdGhpcy5kYXRlLmdldEZ1bGxZZWFyKCkgKyAxICk7XG4gICAgdGhpcy5zZXREYXRlKCBkYXRlICk7XG4gIH1cblxuICBwcml2YXRlIGRheVR5cGVQcmV2aW91cygpIHtcbiAgICBjb25zdCBkYXRlID0gdGhpcy5nZXRBdHVhbERhdGVGcm9tUGFyYW1ldGVycygpO1xuICAgIGRhdGUuc2V0RGF0ZSggdGhpcy5kYXRlLmdldERhdGUoKSAtIDEgKTtcbiAgICB0aGlzLnNldERhdGUoIGRhdGUgKTtcbiAgfVxuXG4gIHByaXZhdGUgZGF5VHlwZU5leHQoKSB7XG4gICAgY29uc3QgZGF0ZSA9IHRoaXMuZ2V0QXR1YWxEYXRlRnJvbVBhcmFtZXRlcnMoKTtcbiAgICBkYXRlLnNldERhdGUoIHRoaXMuZGF0ZS5nZXREYXRlKCkgKyAxICk7XG4gICAgdGhpcy5zZXREYXRlKCBkYXRlICk7XG4gIH1cblxuICBwcml2YXRlIHJhbmdlWWVhclR5cGVQcmV2aW91cygpIHtcbiAgICB0aGlzLnN0YXJ0WWVhciAtPSB0aGlzLnJhbmdlO1xuICAgIHRoaXMuZW5kWWVhciAtPSB0aGlzLnJhbmdlO1xuICB9XG5cbiAgcHJpdmF0ZSByYW5nZVllYXJUeXBlTmV4dCgpIHtcbiAgICB0aGlzLnN0YXJ0WWVhciArPSB0aGlzLnJhbmdlO1xuICAgIHRoaXMuZW5kWWVhciArPSB0aGlzLnJhbmdlO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRBdHVhbERhdGVGcm9tUGFyYW1ldGVycygpIHtcbiAgICByZXR1cm4gbmV3IERhdGUodGhpcy5jdXJyZW50WWVhciwgdGhpcy5jdXJyZW50TW9udGgsIHRoaXMuY3VycmVudERheSk7XG4gIH1cblxuICBwcml2YXRlIHJhbmdlV2Vla1R5cGVQcmV2aW91cygpIHtcbiAgICBjb25zdCBkYXRlID0gdGhpcy5nZXRBdHVhbERhdGVGcm9tUGFyYW1ldGVycygpO1xuICAgIGNvbnN0IGN1cnJlbnREYXlPZldlZWsgPSBkYXRlLmdldERheSgpO1xuICAgIGNvbnN0IHN0YXJ0T2ZXZWVrID0gbmV3IERhdGUoZGF0ZS5nZXRUaW1lKCkgLSBjdXJyZW50RGF5T2ZXZWVrICogMjQgKiA2MCAqIDYwICogMTAwMCk7XG4gICAgY29uc3QgZW5kT2ZXZWVrID0gbmV3IERhdGUoc3RhcnRPZldlZWsuZ2V0VGltZSgpIC0gNiAqIDI0ICogNjAgKiA2MCAqIDEwMDApO1xuICAgICAgLy8gVmVyaWZpY2FyIHNlIG8gaW7DrWNpbyBkYSBzZW1hbmEgw6kgc2VndW5kYVxuICBpZiAoY3VycmVudERheU9mV2VlayA9PT0gMCkge1xuICAgIHN0YXJ0T2ZXZWVrLnNldERhdGUoc3RhcnRPZldlZWsuZ2V0RGF0ZSgpIC0gMSk7IC8vIEFqdXN0YXIgZGUgc2VndW5kYSBhIGRvbWluZ29cbiAgfVxuICAgIGlmIChlbmRPZldlZWsgPj0gdGhpcy5kYXRlKSB7XG4gICAgICB0aGlzLnNldERhdGUoc3RhcnRPZldlZWspO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNldERhdGUoZW5kT2ZXZWVrKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJhbmdlV2Vla1R5cGVOZXh0KCkge1xuICAgIGNvbnN0IGRhdGUgPSB0aGlzLmdldEF0dWFsRGF0ZUZyb21QYXJhbWV0ZXJzKCk7XG4gICAgY29uc3QgY3VycmVudERheU9mV2VlayA9IGRhdGUuZ2V0RGF5KCk7XG4gICAgY29uc3Qgc3RhcnRPZldlZWsgPSBuZXcgRGF0ZShkYXRlLmdldFRpbWUoKSArICg4IC0gY3VycmVudERheU9mV2VlaykgKiAyNCAqIDYwICogNjAgKiAxMDAwKTtcbiAgICBjb25zdCBlbmRPZldlZWsgPSBuZXcgRGF0ZShzdGFydE9mV2Vlay5nZXRUaW1lKCkgKyA2ICogMjQgKiA2MCAqIDYwICogMTAwMCk7XG4gICAgdGhpcy5zZXREYXRlKHN0YXJ0T2ZXZWVrKTtcbiAgfVxuXG59XG4iXX0=