stimulsoft-viewer-angular
Version:
Stimulsoft Viewer Angular
697 lines • 104 kB
JavaScript
import { Injectable } from '@angular/core';
import { DateTimeObject } from './objects';
import * as i0 from "@angular/core";
import * as i1 from "./model.service";
import * as i2 from "./animation.service";
export class HelperService {
constructor(model, animationService) {
this.model = model;
this.animationService = animationService;
}
val(value, def) {
return value != null && value.trim() !== '' ? value : (def || '');
}
findPosY(obj, mainClassName, noScroll) {
let curtop = noScroll ? 0 : this.getScrollYOffset(obj, mainClassName);
if (obj.offsetParent) {
while (obj.className !== mainClassName) {
curtop += obj.offsetTop;
if (!obj.offsetParent) {
break;
}
obj = obj.offsetParent;
}
}
else if (obj.y) {
curtop += obj.y;
}
return curtop;
}
getScrollYOffset(obj, mainClassName) {
let scrolltop = 0;
if (obj.parentElement) {
while (obj.className !== mainClassName) {
if ('scrollTop' in obj) {
scrolltop -= obj.scrollTop;
}
if (!obj.parentElement) {
break;
}
obj = obj.parentElement;
}
}
return scrolltop;
}
findPosX(obj, mainClassName, noScroll) {
let curleft = noScroll ? 0 : this.getScrollXOffset(obj, mainClassName);
if (obj.offsetParent) {
while (obj.className !== mainClassName) {
curleft += obj.offsetLeft;
if (!obj.offsetParent) {
break;
}
obj = obj.offsetParent;
}
}
else if (obj.x) {
curleft += obj.x;
}
return curleft;
}
getScrollXOffset(obj, mainClassName) {
let scrollleft = 0;
if (obj.parentElement) {
while (obj.className !== mainClassName) {
if ('scrollLeft' in obj) {
scrollleft -= obj.scrollLeft;
}
if (!obj.parentElement) {
break;
}
obj = obj.parentElement;
}
}
return scrollleft;
}
showHelpWindow(url) {
let helpLanguage = 'en';
switch (this.model.options.cultureName) {
case 'ru': helpLanguage = 'ru';
// case 'de': helpLanguage = 'de';
}
this.openNewWindow('https://www.stimulsoft.com/' + helpLanguage + '/documentation/online/' + url);
}
openNewWindow(url, name, specs) {
return window.open(url, name, specs);
}
scrollToAnchor(anchorName, componentGuid) {
let aHyperlinks = this.model.controls.reportPanel.el.nativeElement.getElementsByTagName("a");
const identicalAnchors = [];
if (anchorName) {
anchorName = anchorName.replace(/!!#92/g, '\\');
}
if (componentGuid) {
for (let i = 0; i < aHyperlinks.length; i++) {
if (aHyperlinks[i].getAttribute('guid') === componentGuid) {
identicalAnchors.push(aHyperlinks[i]);
}
}
}
if (identicalAnchors.length === 0) {
let guidIndex = anchorName.indexOf("#GUID#");
if (identicalAnchors.length == 0) {
let aHyperlinks = this.model.controls.reportPanel.el.nativeElement.getElementsByTagName("a");
for (var i = 0; i < aHyperlinks.length; i++) {
if (aHyperlinks[i].name && ((guidIndex >= 0 && (aHyperlinks[i].name.indexOf(anchorName.substring(guidIndex + 6)) >= 0 || anchorName.substring(0, guidIndex) == aHyperlinks[i].name)) || aHyperlinks[i].name == anchorName))
identicalAnchors.push(aHyperlinks[i]);
}
}
}
if (identicalAnchors.length > 0) {
const anchor = identicalAnchors[0];
const anchorParent = anchor.parentElement || anchor;
let anchorHeight = anchorParent.offsetHeight;
const anchorOffsetTop = anchorParent.offsetTop;
identicalAnchors.forEach((identicalAnchor) => {
const nextAnchorParent = identicalAnchor.parentElement || identicalAnchor;
if (nextAnchorParent.offsetTop > anchorOffsetTop) {
anchorHeight = Math.max(anchorHeight, nextAnchorParent.offsetTop - anchorOffsetTop + nextAnchorParent.offsetHeight);
}
});
const date = new Date();
const endTime = date.getTime() + this.model.options.scrollDuration;
const targetTop = this.findPosY(anchor, this.model.options.appearance.scrollbarsMode ? 'stiJsViewerReportPanel' : null, true) - anchorParent.offsetHeight * 2;
this.animationService.showAnimationForScroll(this.model.controls.reportPanel.el.nativeElement, targetTop, endTime, () => {
const page = this.getPageFromAnchorElement(anchor);
const anchorParentTopPos = this.findPosY(anchorParent, 'stiJsViewerReportPanel', true);
const pageTopPos = page ? this.findPosY(page, 'stiJsViewerReportPanel', true) : anchorParentTopPos;
this.removeBookmarksLabel();
const label = document.createElement('div');
this.model.controls.bookmarksLabel = label;
label.className = 'stiJsViewerBookmarksLabel';
const labelMargin = 20 * (this.model.reportParams.zoom / 100);
const labelWidth = page ? page.offsetWidth - labelMargin - 6 : anchorParent.offsetWidth;
const labelHeight = anchorHeight - 2;
label.style.width = labelWidth + 'px';
label.style.height = labelHeight + 'px';
const margins = page.pageAttributes.margins?.replace('px', '').split(' ');
const pageLeftMargin = page.pageAttributes.margins ? this.strToInt(margins[3]) : 0;
const pageTopMargin = page.pageAttributes.margins ? this.strToInt(margins[0]) : 0;
label.style.marginLeft = (labelMargin / 2 - pageLeftMargin) + 'px';
label.style.marginTop = (anchorParentTopPos - pageTopPos - pageTopMargin - (this.model.reportParams.zoom / 100) - 1) + 'px';
page.insertBefore(label, page.childNodes[0]);
});
}
}
removeBookmarksLabel() {
if (this.model.controls.bookmarksLabel) {
this.model.controls.bookmarksLabel.parentElement.removeChild(this.model.controls.bookmarksLabel);
this.model.controls.bookmarksLabel = null;
}
}
getPageFromAnchorElement(anchorElement) {
let obj = anchorElement;
while (obj.parentElement) {
if (obj.className && obj.className.indexOf('stiJsViewerPage') === 0) {
return obj;
}
obj = obj.parentElement;
}
return obj;
}
strToInt(value) {
const result = parseInt(value, 10);
return result || 0;
}
strToDouble(value) {
if (value === null) {
return null;
}
const result = parseFloat(value.toString().replace(',', '.').trim());
return result || 0;
}
copyObject(o) {
if (!o || 'object' !== typeof o) {
return o;
}
const c = 'function' === typeof o.pop ? [] : {};
let p;
let v;
for (p in o) {
if (o.hasOwnProperty(p)) {
v = o[p];
if (v && 'object' === typeof v) {
c[p] = this.copyObject(v);
}
else {
c[p] = v;
}
}
}
return c;
}
getCountObjects(objectArray) {
let count = 0;
if (objectArray) {
for (const singleObject in objectArray) {
count++;
}
}
return count;
}
replaceMonths(value) {
for (let i = 1; i <= 12; i++) {
let enName = '';
let locName = '';
switch (i) {
case 1:
enName = 'January';
locName = this.model.loc('MonthJanuary');
break;
case 2:
enName = 'February';
locName = this.model.loc('MonthFebruary');
break;
case 3:
enName = 'March';
locName = this.model.loc('MonthMarch');
break;
case 4:
enName = 'April';
locName = this.model.loc('MonthApril');
break;
case 5:
enName = 'May';
locName = this.model.loc('MonthMay');
break;
case 6:
enName = 'June';
locName = this.model.loc('MonthJune');
break;
case 7:
enName = 'July';
locName = this.model.loc('MonthJuly');
break;
case 8:
enName = 'August';
locName = this.model.loc('MonthAugust');
break;
case 9:
enName = 'September';
locName = this.model.loc('MonthSeptember');
break;
case 10:
enName = 'October';
locName = this.model.loc('MonthOctober');
break;
case 11:
enName = 'November';
locName = this.model.loc('MonthNovember');
break;
case 12:
enName = 'December';
locName = this.model.loc('MonthDecember');
break;
}
const enShortName = enName.substring(0, 3);
const locShortName = locName.substring(0, 3);
value = value.replace(enName, i).replace(enName.toLowerCase(), i).replace(enShortName, i).replace(enShortName.toLowerCase(), i);
value = value.replace(locName, i).replace(locName.toLowerCase(), i).replace(locShortName, i).replace(locShortName.toLowerCase(), i);
}
return value;
}
getDate(dateTimeObj) {
return new Date(dateTimeObj.year, dateTimeObj.month - 1, dateTimeObj.day, dateTimeObj.hours, dateTimeObj.minutes, dateTimeObj.seconds);
}
getDateTimeObject(date) {
if (!date) {
date = new Date();
}
const dateTimeObject = new DateTimeObject();
dateTimeObject.year = date.getFullYear();
dateTimeObject.month = date.getMonth() + 1;
dateTimeObject.day = date.getDate();
dateTimeObject.hours = date.getHours();
dateTimeObject.minutes = date.getMinutes();
dateTimeObject.seconds = date.getSeconds();
return dateTimeObject;
}
getDateTimeFromString(value, format) {
const charIsDigit = (ch) => {
return ('0123456789'.indexOf(ch) >= 0);
};
if (!value) {
return new Date();
}
value = this.replaceMonths(value);
let dateTime = new Date();
// If the date format is not specified, then deserializator for getting date and time is applied
if (format === null) {
format = 'dd.MM.yyyy hh:mm:ss';
}
// Otherwise the format is parsed. Now only numeric date and time formats are supported
let year = 1970;
let month = 1;
let day = 1;
let hour = 0;
let minute = 0;
let second = 0;
let millisecond = 0;
let char = '';
let pos = 0;
const values = [];
// Parse date and time into separate numeric values
while (pos < value.length) {
char = value.charAt(pos);
if (charIsDigit(char)) {
values.push(char);
pos++;
while (pos < value.length && charIsDigit(value.charAt(pos))) {
values[values.length - 1] += value.charAt(pos);
pos++;
}
values[values.length - 1] = this.strToInt(values[values.length - 1]);
}
pos++;
}
pos = 0;
let charCount = 0;
let index = -1;
let is12hour = false;
// Parsing format and replacement of appropriate values of date and time
while (pos < format.length) {
char = format.charAt(pos);
charCount = 0;
if (char === 'Y' || char === 'y' || char === 'M' || char === 'd' || char === 'h' || char === 'H' ||
char === 'm' || char === 's' || char === 'f' || char === 'F' || char === 't' || char === 'z') {
index++;
while (pos < format.length && format.charAt(pos) === char) {
pos++;
charCount++;
}
}
switch (char) {
case 'Y': // full year
year = values[index];
break;
case 'y': // year
if (values[index] < 1000) {
year = 2000 + values[index];
}
else {
year = values[index];
}
break;
case 'M': // month
month = values[index];
break;
case 'd': // day
day = values[index];
break;
case 'h': // (hour 12)
is12hour = true;
hour = values[index];
break;
case 'H': // (hour 24)
hour = values[index];
break;
case 'm': // minute
minute = values[index];
break;
case 's': // second
second = values[index];
break;
case 'f': // second fraction
case 'F': // second fraction, trailing zeroes are trimmed
millisecond = values[index];
break;
case 't': // PM or AM
if (value.toLowerCase().indexOf('am') >= 0 && hour === 12) {
hour = 0;
}
if (value.toLowerCase().indexOf('pm') >= 0 && hour < 12) {
hour += 12;
}
break;
default:
pos++;
break;
}
}
dateTime = new Date(year || new Date().getFullYear(), month - 1 || 0, day || 1, hour || 0, minute || 0, second, millisecond || 0);
if (!dateTime || isNaN(dateTime)) {
return new Date();
}
return dateTime;
}
getStringDateTime(object, dateTimeType) {
if (dateTimeType === 'Date') {
object.hours = 0;
object.minutes = 0;
object.seconds = 0;
}
return object.month + '/' + object.day + '/' + object.year + ' ' +
(object.hours > 12 ? object.hours - 12 : object.hours) + ':' + object.minutes + ':' + object.seconds + ' ' +
(object.hours < 12 ? 'AM' : 'PM');
}
dateTimeObjectToString(dateTimeObject, typeDateTimeObject) {
const date = new Date(dateTimeObject.year, dateTimeObject.month - 1, dateTimeObject.day, dateTimeObject.hours, dateTimeObject.minutes, dateTimeObject.seconds);
if (this.model.options.appearance.parametersPanelDateFormat !== '') {
return this.formatDate(date, this.model.options.appearance.parametersPanelDateFormat);
}
return this.dateToLocaleString(date, typeDateTimeObject);
}
dateToLocaleString(date, dateTimeType) {
const timeString = date.toLocaleTimeString();
const isAmericanFormat = timeString.toLowerCase().indexOf('am') >= 0 || timeString.toLowerCase().indexOf('pm') >= 0;
let formatDate = isAmericanFormat ? 'MM/dd/yyyy' : 'dd.MM.yyyy';
const yyyy = date.getFullYear();
const yy = yyyy.toString().substring(2);
const M = date.getMonth() + 1;
const MM = M < 10 ? '0' + M : M;
const d = date.getDate();
const dd = d < 10 ? '0' + d : d;
formatDate = formatDate.replace(/yyyy/i, yyyy);
formatDate = formatDate.replace(/yy/i, yy);
formatDate = formatDate.replace(/MM/i, MM);
formatDate = formatDate.replace(/M/i, M);
formatDate = formatDate.replace(/dd/i, dd);
formatDate = formatDate.replace(/d/i, d);
let h = date.getHours();
let tt = '';
if (isAmericanFormat) {
tt = h < 12 ? ' AM' : ' PM';
h = h > 12 ? h - 12 : h;
if (h === 0) {
h = 12;
}
}
else {
h = h < 10 ? '0' + h : h;
}
let m = date.getMinutes();
m = m < 10 ? '0' + m : m;
let s = date.getSeconds();
s = s < 10 ? '0' + s : s;
const formatTime = h + ':' + m + ':' + s + tt;
if (dateTimeType === 'Time') {
return formatTime;
}
if (dateTimeType === 'Date') {
return formatDate;
}
return formatDate + ' ' + formatTime;
}
formatDate(formatDate, formatString) {
const yyyy = formatDate.getFullYear();
const yy = yyyy.toString().substring(2);
const m = formatDate.getMonth() + 1;
const mm = m < 10 ? '0' + m : m;
const d = formatDate.getDate();
const dd = d < 10 ? '0' + d : d;
const h = formatDate.getHours();
const hh = h < 10 ? '0' + h : h;
const h12 = h > 12 ? h - 12 : (h > 0 ? h : 12);
const hh12 = h12 < 10 ? '0' + h12 : h12;
const n = formatDate.getMinutes();
const nn = n < 10 ? '0' + n : n;
const s = formatDate.getSeconds();
const ss = s < 10 ? '0' + s : s;
const tt = h < 12 ? 'AM' : 'PM';
formatString = formatString.replace(/yyyy/gi, yyyy);
formatString = formatString.replace(/yy/gi, yy);
formatString = formatString.replace(/Y/, yyyy);
formatString = formatString.replace(/MM/g, mm);
formatString = formatString.replace(/M/g, m);
formatString = formatString.replace(/dd/g, dd);
formatString = formatString.replace(/d/g, d);
formatString = formatString.replace(/hh/g, hh12);
formatString = formatString.replace(/h/g, h12);
formatString = formatString.replace(/HH/g, hh);
formatString = formatString.replace(/H/g, h);
formatString = formatString.replace(/mm/g, nn);
formatString = formatString.replace(/m/g, n);
formatString = formatString.replace(/ss/g, ss);
formatString = formatString.replace(/s/g, s);
formatString = formatString.replace(/tt/gi, tt);
formatString = formatString.replace(/t/gi, tt.substr(0, 1));
return formatString;
}
getStringKey(key, params) {
if (key === null) {
return '';
}
return ((params.type === 'DateTime') ? this.dateTimeObjectToString(key, params.dateTimeType) : key);
}
stringToTime(timeStr) {
const timeArray = timeStr.split(':');
const time = { hours: 0, minutes: 0, seconds: 0 };
time.hours = this.strToInt(timeArray[0]);
if (timeArray.length > 1) {
time.minutes = this.strToInt(timeArray[1]);
}
if (timeArray.length > 2) {
time.seconds = this.strToInt(timeArray[2]);
}
if (time.hours < 0) {
time.hours = 0;
}
if (time.minutes < 0) {
time.minutes = 0;
}
if (time.seconds < 0) {
time.seconds = 0;
}
if (time.hours > 23) {
time.hours = 23;
}
if (time.minutes > 59) {
time.minutes = 59;
}
if (time.seconds > 59) {
time.seconds = 59;
}
return time;
}
newGuid() {
const chars = '0123456789abcdefghijklmnopqrstuvwxyz'.split('');
const uuid = [];
const rnd = Math.random;
let r;
uuid[8] = uuid[13] = uuid[18] = uuid[23] = '-';
uuid[14] = '4';
for (let i = 0; i < 36; i++) {
if (!uuid[i]) {
r = 0 | rnd() * 16;
uuid[i] = chars[(i === 19) ? (r & 0x3) | 0x8 : r & 0xf];
}
}
return uuid.join('');
}
getCountDaysOfMonth(year, month) {
const countDaysInMonth = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
let count = countDaysInMonth[month];
if (month === 1) {
if (year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0)) {
count = 29;
}
else {
count = 28;
}
}
return count;
}
setObjectToCenter(object, defaultTop) {
const leftPos = (this.model.viewerSize.width / 2 - object.offsetWidth / 2);
const topPos = this.model.options.appearance.fullScreenMode ? (this.model.viewerSize.height / 2 - object.offsetHeight / 2) : (defaultTop ? defaultTop : 250);
return { left: Math.max(leftPos, 0), top: Math.max(topPos, 0) };
}
checkCloudAuthorization(action) {
return true;
}
getCookie_(name) {
const cookie = ' ' + document.cookie;
const search = ' ' + name + '=';
let setStr = null;
let offset = 0;
let end = 0;
if (cookie.length > 0) {
offset = cookie.indexOf(search);
if (offset !== -1) {
offset += search.length;
end = cookie.indexOf(';', offset);
if (end === -1) {
end = cookie.length;
}
setStr = unescape(cookie.substring(offset, end));
}
}
return setStr;
}
getCookie(name) {
if (this.model.options.standaloneJsMode || typeof localStorage === 'undefined' || name.indexOf('sti_') == 0 || name.indexOf('login') == 0) {
return this.getCookie_(name);
}
let value = localStorage.getItem(name);
if (value != null) {
return value;
}
else {
value = this.getCookie_(name);
if (value != null) {
this.removeCookie(name);
localStorage.setItem(name, value);
}
return value;
}
}
removeCookie(name) {
document.cookie = name + '=;expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/';
}
setCookie(name, value, path, domain, secure, expires) {
if (this.model.options.standaloneJsMode || typeof localStorage === 'undefined' || name.indexOf('sti_') === 0 || name.indexOf('login') === 0) {
// save to cookies
if (value && typeof (value) === 'string' && value.length >= 4096) {
return;
}
const pathName = location.pathname;
const expDate = new Date();
expDate.setTime(expDate.getTime() + (365 * 24 * 3600 * 1000));
document.cookie = name + '=' + escape(value) +
'; expires=' + (expires || expDate['toGMTString']()) +
((path) ? '; path=' + path : '; path=/') +
((domain) ? '; domain=' + domain : '') +
((secure) ? '; secure' : '');
}
else {
// save to localstorage
localStorage.setItem(name, value);
}
}
getNavigatorName() {
if (!navigator) {
return 'Unknown';
}
const userAgent = navigator.userAgent;
if (userAgent.indexOf('Edge') >= 0) {
return 'Edge';
}
if (userAgent.indexOf('MSIE') >= 0 || userAgent.indexOf('Trident') >= 0) {
return 'MSIE';
}
if (userAgent.indexOf('Gecko') >= 0) {
if (userAgent.indexOf('Chrome') >= 0) {
return 'Chrome';
}
if (userAgent.indexOf('Safari') >= 0) {
return 'Safari';
}
return 'Mozilla';
}
if (userAgent.indexOf('Opera') >= 0) {
return 'Opera';
}
}
isTouchDevice() {
return ('ontouchstart' in document.documentElement);
}
isMobileDevice() {
return /iPhone|iPad|iPod|Macintosh|Android|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);
}
getHumanFileSize(value, decimals) {
const i = Math.floor(Math.log(value) / Math.log(1024));
return ((value / Math.pow(1024, i)).toFixed(decimals)) + ' ' + ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'][i];
}
getZoomMenuItems() {
const items = [{ name: 'Zoom25', caption: '25%', img: '' },
{ name: 'Zoom50', caption: '50%', img: '' },
{ name: 'Zoom75', caption: '75%', img: '' },
{ name: 'Zoom100', caption: '100%', img: '' },
{ name: 'Zoom150', caption: '150%', img: '' },
{ name: 'Zoom200', caption: '200%', img: '' }];
if (this.model.options.toolbar.displayMode !== 'Separated') {
items.push({ type: 'separator' });
items.push({ name: 'ZoomOnePage', caption: this.model.loc('ZoomOnePage'), img: 'ZoomOnePage.png' });
items.push({ name: 'ZoomPageWidth', caption: this.model.loc('ZoomPageWidth'), img: 'ZoomPageWidth.png' });
}
return items;
}
get helpLinks() {
return {
Print: 'user-manual/index.html?viewer_reports.htm#toolbar',
Save: 'user-manual/index.html?viewer_reports.htm#toolbar',
SendEmail: 'user-manual/index.html?viewer_reports.htm#toolbar',
Bookmarks: 'user-manual/index.html?viewer_reports.htm#toolbar',
Parameters: 'user-manual/index.html?viewer_reports.htm#toolbar',
FirstPage: 'user-manual/index.html?viewer_reports.htm#statusbar',
PrevPage: 'user-manual/index.html?viewer_reports.htm#statusbar',
NextPage: 'user-manual/index.html?viewer_reports.htm#statusbar',
LastPage: 'user-manual/index.html?viewer_reports.htm#statusbar',
FullScreen: 'user-manual/index.html?viewer_reports.htm#toolbar',
Zoom: 'user-manual/index.html?viewer_reports.htm#statusbar',
ViewMode: 'user-manual/index.html?viewer_reports.htm#displayingmode',
Editor: 'user-manual/index.html?viewer_reports.htm#toolbar',
Find: 'user-manual/index.html?viewer_reports.htm#searchpanel',
DashboardToolbar: 'user-manual/index.html?viewer_dashboards.htm#controlbuttonsofthedashboard',
DashboardElementToolbar: 'user-manual/index.html?viewer_dashboards.htm#elementcontrols',
DashboardExport: 'user-manual/index.html?exports_dashboards.htm',
DashboardPdfExport: 'user-manual/index.html?exports_dashboards.htm#pdfexportsettings',
DashboardExcelExport: 'user-manual/index.html?exports_dashboards.htm#excelexportsettings',
DashboardImageExport: 'user-manual/index.html?exports_dashboards.htm#imageexportsettings',
DashboardDataExport: 'user-manual/index.html?exports_dashboards.htm#exportsettingsofdata'
};
}
getBackText(withoutBrackets) {
const backText = String.fromCharCode(84) + 'r' + String.fromCharCode(105) + 'a';
if (withoutBrackets) {
return backText + String.fromCharCode(108);
}
return String.fromCharCode(91) + backText + String.fromCharCode(108) + String.fromCharCode(93);
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: HelperService, deps: [{ token: i1.ModelService }, { token: i2.AnimationService }], target: i0.ɵɵFactoryTarget.Injectable }); }
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: HelperService }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: HelperService, decorators: [{
type: Injectable
}], ctorParameters: () => [{ type: i1.ModelService }, { type: i2.AnimationService }] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVscGVyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zdGltdWxzb2Z0LXZpZXdlci1hbmd1bGFyL3NyYy9saWIvc2VydmljZXMvaGVscGVyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUczQyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sV0FBVyxDQUFDOzs7O0FBSTNDLE1BQU0sT0FBTyxhQUFhO0lBRXhCLFlBQW9CLEtBQW1CLEVBQVUsZ0JBQWtDO1FBQS9ELFVBQUssR0FBTCxLQUFLLENBQWM7UUFBVSxxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO0lBQUksQ0FBQztJQUVqRixHQUFHLENBQUMsS0FBYSxFQUFFLEdBQVk7UUFDcEMsT0FBTyxLQUFLLElBQUksSUFBSSxJQUFJLEtBQUssQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksRUFBRSxDQUFDLENBQUM7SUFDcEUsQ0FBQztJQUVNLFFBQVEsQ0FBQyxHQUFRLEVBQUUsYUFBc0IsRUFBRSxRQUFrQjtRQUNsRSxJQUFJLE1BQU0sR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsRUFBRSxhQUFhLENBQUMsQ0FBQztRQUN0RSxJQUFJLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUNyQixPQUFPLEdBQUcsQ0FBQyxTQUFTLEtBQUssYUFBYSxFQUFFLENBQUM7Z0JBQ3ZDLE1BQU0sSUFBSSxHQUFHLENBQUMsU0FBUyxDQUFDO2dCQUN4QixJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO29CQUN0QixNQUFNO2dCQUNSLENBQUM7Z0JBQ0QsR0FBRyxHQUFHLEdB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