@stemy/ngx-utils 13.1.1 → 13.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (110) hide show
  1. package/bundles/stemy-ngx-utils.umd.js +6145 -0
  2. package/bundles/stemy-ngx-utils.umd.js.map +1 -0
  3. package/esm2015/ngx-utils/common-types.js +116 -0
  4. package/esm2015/ngx-utils/components/dynamic-table/dynamic-table.component.js +139 -0
  5. package/esm2015/ngx-utils/components/pagination-menu/pagination-menu.component.js +96 -0
  6. package/esm2015/ngx-utils/components/unordered-list/unordered-list.component.js +51 -0
  7. package/esm2015/ngx-utils/directives/async-method.base.js +54 -0
  8. package/esm2015/ngx-utils/directives/async-method.directive.js +24 -0
  9. package/esm2015/ngx-utils/directives/background.directive.js +51 -0
  10. package/esm2015/ngx-utils/directives/dynamic-table-template.directive.js +19 -0
  11. package/esm2015/ngx-utils/directives/global-template.directive.js +27 -0
  12. package/esm2015/ngx-utils/directives/icon.directive.js +59 -0
  13. package/esm2015/ngx-utils/directives/ngx-template-outlet.directive.js +88 -0
  14. package/esm2015/ngx-utils/directives/pagination-item.directive.js +33 -0
  15. package/esm2015/ngx-utils/directives/pagination.directive.js +76 -0
  16. package/esm2015/ngx-utils/directives/resource-if.directive.js +51 -0
  17. package/esm2015/ngx-utils/directives/sticky-class.directive.js +35 -0
  18. package/esm2015/ngx-utils/directives/sticky.directive.js +48 -0
  19. package/esm2015/ngx-utils/directives/unordered-list-item.directive.js +70 -0
  20. package/esm2015/ngx-utils/directives/unordered-list-template.directive.js +26 -0
  21. package/esm2015/ngx-utils/ngx-utils.module.js +238 -0
  22. package/esm2015/ngx-utils/pipes/chunk.pipe.js +21 -0
  23. package/esm2015/ngx-utils/pipes/entries.pipe.js +24 -0
  24. package/esm2015/ngx-utils/pipes/extra-item-properties.pipe.js +27 -0
  25. package/esm2015/ngx-utils/pipes/filter.pipe.js +38 -0
  26. package/esm2015/ngx-utils/pipes/find.pipe.js +25 -0
  27. package/esm2015/ngx-utils/pipes/format-number.pipe.js +19 -0
  28. package/esm2015/ngx-utils/pipes/get-offset.pipe.js +13 -0
  29. package/esm2015/ngx-utils/pipes/get-type.pipe.js +12 -0
  30. package/esm2015/ngx-utils/pipes/global-template.pipe.js +37 -0
  31. package/esm2015/ngx-utils/pipes/group-by.pipe.js +23 -0
  32. package/esm2015/ngx-utils/pipes/is-type.pipe.js +12 -0
  33. package/esm2015/ngx-utils/pipes/join.pipe.js +15 -0
  34. package/esm2015/ngx-utils/pipes/keys.pipe.js +18 -0
  35. package/esm2015/ngx-utils/pipes/map.pipe.js +25 -0
  36. package/esm2015/ngx-utils/pipes/max.pipe.js +22 -0
  37. package/esm2015/ngx-utils/pipes/min.pipe.js +22 -0
  38. package/esm2015/ngx-utils/pipes/reduce.pipe.js +26 -0
  39. package/esm2015/ngx-utils/pipes/remap.pipe.js +28 -0
  40. package/esm2015/ngx-utils/pipes/replace.pipe.js +12 -0
  41. package/esm2015/ngx-utils/pipes/reverse.pipe.js +20 -0
  42. package/esm2015/ngx-utils/pipes/round.pipe.js +19 -0
  43. package/esm2015/ngx-utils/pipes/safe-html.pipe.js +32 -0
  44. package/esm2015/ngx-utils/pipes/translate.pipe.js +81 -0
  45. package/esm2015/ngx-utils/pipes/values.pipe.js +18 -0
  46. package/esm2015/ngx-utils/plugins/resize-event.plugin.js +56 -0
  47. package/esm2015/ngx-utils/plugins/scroll-event.plugin.js +36 -0
  48. package/esm2015/ngx-utils/services/acl.service.js +81 -0
  49. package/esm2015/ngx-utils/services/api.service.js +35 -0
  50. package/esm2015/ngx-utils/services/auth.service.js +14 -0
  51. package/esm2015/ngx-utils/services/base-http.client.js +46 -0
  52. package/esm2015/ngx-utils/services/base-http.service.js +285 -0
  53. package/esm2015/ngx-utils/services/config.service.js +122 -0
  54. package/esm2015/ngx-utils/services/error-handler.service.js +49 -0
  55. package/esm2015/ngx-utils/services/events.service.js +24 -0
  56. package/esm2015/ngx-utils/services/formatter.service.js +44 -0
  57. package/esm2015/ngx-utils/services/global-template.service.js +35 -0
  58. package/esm2015/ngx-utils/services/icon.service.js +24 -0
  59. package/esm2015/ngx-utils/services/language.service.js +117 -0
  60. package/esm2015/ngx-utils/services/open-api.service.js +41 -0
  61. package/esm2015/ngx-utils/services/promise.service.js +52 -0
  62. package/esm2015/ngx-utils/services/state.service.js +181 -0
  63. package/esm2015/ngx-utils/services/static-language.service.js +152 -0
  64. package/esm2015/ngx-utils/services/storage.service.js +48 -0
  65. package/esm2015/ngx-utils/services/toaster.service.js +29 -0
  66. package/esm2015/ngx-utils/services/translated-url.serializer.js +70 -0
  67. package/esm2015/ngx-utils/services/universal.service.js +75 -0
  68. package/esm2015/ngx-utils/utils/ajax-request-handler.js +40 -0
  69. package/esm2015/ngx-utils/utils/array.utils.js +100 -0
  70. package/esm2015/ngx-utils/utils/auth.guard.js +156 -0
  71. package/esm2015/ngx-utils/utils/canvas.utils.js +388 -0
  72. package/esm2015/ngx-utils/utils/date.utils.js +28 -0
  73. package/esm2015/ngx-utils/utils/file-system.js +20 -0
  74. package/esm2015/ngx-utils/utils/file.utils.js +90 -0
  75. package/esm2015/ngx-utils/utils/generic-value.js +20 -0
  76. package/esm2015/ngx-utils/utils/geometry.js +132 -0
  77. package/esm2015/ngx-utils/utils/initializer.js +20 -0
  78. package/esm2015/ngx-utils/utils/loader.utils.js +55 -0
  79. package/esm2015/ngx-utils/utils/math.utils.js +15 -0
  80. package/esm2015/ngx-utils/utils/object.utils.js +263 -0
  81. package/esm2015/ngx-utils/utils/observable.utils.js +63 -0
  82. package/esm2015/ngx-utils/utils/reflect.utils.js +33 -0
  83. package/esm2015/ngx-utils/utils/set.utils.js +20 -0
  84. package/esm2015/ngx-utils/utils/string.utils.js +28 -0
  85. package/esm2015/ngx-utils/utils/timer.utils.js +52 -0
  86. package/esm2015/ngx-utils/utils/unique.utils.js +24 -0
  87. package/esm2015/ngx-utils/utils/vector.js +77 -0
  88. package/esm2015/public_api.js +85 -0
  89. package/esm2015/stemy-ngx-utils.js +7 -0
  90. package/esm2020/ngx-utils/services/acl.service.mjs +3 -1
  91. package/esm2020/ngx-utils/utils/file-system.mjs +20 -0
  92. package/esm2020/ngx-utils/utils/string.utils.mjs +4 -1
  93. package/esm2020/public_api.mjs +2 -1
  94. package/fesm2015/stemy-ngx-utils.js +4882 -0
  95. package/fesm2015/stemy-ngx-utils.js.map +1 -0
  96. package/fesm2015/stemy-ngx-utils.mjs +26 -1
  97. package/fesm2015/stemy-ngx-utils.mjs.map +1 -1
  98. package/fesm2020/stemy-ngx-utils.mjs +26 -1
  99. package/fesm2020/stemy-ngx-utils.mjs.map +1 -1
  100. package/ngx-utils/utils/file-system.d.ts +16 -0
  101. package/ngx-utils/utils/string.utils.d.ts +1 -0
  102. package/package.json +1 -1
  103. package/public_api.d.ts +1 -0
  104. package/stemy-ngx-utils.metadata.json +1 -0
  105. package/tools/circular.js +117 -0
  106. package/tools/circular.js.map +1 -0
  107. package/tools/config.js +79 -0
  108. package/tools/config.js.map +1 -0
  109. package/tools/icons.js +14 -0
  110. package/tools/icons.js.map +1 -0
@@ -0,0 +1,122 @@
1
+ import { __awaiter } from "tslib";
2
+ import { Inject, Injectable, Optional, isDevMode } from "@angular/core";
3
+ import { HttpClient } from "@angular/common/http";
4
+ import { UniversalService } from "./universal.service";
5
+ import { BASE_CONFIG, IConfiguration, ROOT_ELEMENT, SCRIPT_PARAMS } from "../common-types";
6
+ const JSON5 = require("json5");
7
+ export class ConfigService {
8
+ constructor(http, universal, rootElement, baseConfig = null, scriptParams = null) {
9
+ this.http = http;
10
+ this.universal = universal;
11
+ this.rootElement = rootElement;
12
+ for (const key in []) {
13
+ Object.defineProperty(Array.prototype, key, {
14
+ enumerable: false
15
+ });
16
+ }
17
+ let baseUrl = "";
18
+ if (this.universal.isBrowser) {
19
+ const currentScript = document.currentScript;
20
+ if (!!currentScript) {
21
+ const scriptSrc = currentScript.src;
22
+ const srcParts = scriptSrc.split(".js");
23
+ baseUrl = scriptSrc.substr(0, srcParts[0].lastIndexOf("/") + 1);
24
+ }
25
+ }
26
+ this.baseConfig = baseConfig || {};
27
+ this.loadedConfig = Object.assign(!baseUrl ? {} : { baseUrl, baseDomain: this.parseDomain(baseUrl) }, this.baseConfig);
28
+ this.scriptParameters = scriptParams || {};
29
+ this.loaderFunc = () => {
30
+ this.loader = this.loader || new Promise((resolve, reject) => {
31
+ this.loadJson().then(config => {
32
+ this.loadedConfig = config = Object.assign(this.loadedConfig, config);
33
+ this.prepareConfig(config).then(c => {
34
+ this.loadedConfig = c;
35
+ c.baseUrl = c.baseUrl || "/";
36
+ resolve(c);
37
+ });
38
+ }, reject);
39
+ });
40
+ return this.loader;
41
+ };
42
+ this.initService();
43
+ }
44
+ get load() {
45
+ return this.loaderFunc;
46
+ }
47
+ get config() {
48
+ return this.loadedConfig;
49
+ }
50
+ get configUrl() {
51
+ return `${this.loadedConfig.baseUrl}config/config.json`;
52
+ }
53
+ parseDomain(baseUrl) {
54
+ try {
55
+ const url = new URL(baseUrl);
56
+ const port = url.port && url.port !== "443" && url.port !== "80" ? `:${url.port}` : ``;
57
+ return `${url.protocol}//${url.hostname}${port}/`;
58
+ }
59
+ catch (_a) {
60
+ return "/";
61
+ }
62
+ }
63
+ initService() {
64
+ }
65
+ loadJson() {
66
+ return __awaiter(this, void 0, void 0, function* () {
67
+ if (this.universal.isServer) {
68
+ return Promise.resolve(this.loadedConfig);
69
+ }
70
+ const configUrl = this.configUrl;
71
+ try {
72
+ const config5 = yield this.http.get(isDevMode() ? `${configUrl}5` : configUrl, { responseType: "text" }).toPromise();
73
+ return JSON5.parse(config5);
74
+ }
75
+ catch (e) {
76
+ try {
77
+ const config = yield this.http.get(configUrl).toPromise();
78
+ console.log(`Can't parse json5 config: ${e}`);
79
+ return config;
80
+ }
81
+ catch (e) {
82
+ throw new Error(`Config file not found at: ${configUrl}`);
83
+ }
84
+ }
85
+ });
86
+ }
87
+ prepareConfig(config) {
88
+ return Promise.resolve(config);
89
+ }
90
+ prepareUrl(url, ending) {
91
+ var _a;
92
+ const project = !this.loadedConfig ? "" : this.loadedConfig.project;
93
+ const needsProtocol = (_a = url === null || url === void 0 ? void 0 : url.startsWith("//")) !== null && _a !== void 0 ? _a : false;
94
+ url = !needsProtocol && (url === null || url === void 0 ? void 0 : url.startsWith("/")) ? this.loadedConfig.baseDomain + url.substr(1) : url || "";
95
+ url = `${url.replace(/\/+$/, "")}${ending}`.replace("[project]", project);
96
+ return this.universal.isServer && needsProtocol ? `http:${url}` : url;
97
+ }
98
+ getConfigValue(key) {
99
+ return this.loadedConfig[key];
100
+ }
101
+ getQueryParameter(name, url) {
102
+ url = url || (this.universal.isBrowser ? window.location.href : "");
103
+ name = name.replace(/[\[\]]/g, "\\$&");
104
+ const regex = new RegExp("[?&]" + name + "(=([^&#]*)|&|#|$)"), results = regex.exec(url);
105
+ if (!results)
106
+ return null;
107
+ if (!results[2])
108
+ return "";
109
+ return decodeURIComponent(results[2].replace(/\+/g, " "));
110
+ }
111
+ }
112
+ ConfigService.decorators = [
113
+ { type: Injectable }
114
+ ];
115
+ ConfigService.ctorParameters = () => [
116
+ { type: HttpClient },
117
+ { type: UniversalService },
118
+ { type: undefined, decorators: [{ type: Inject, args: [ROOT_ELEMENT,] }] },
119
+ { type: IConfiguration, decorators: [{ type: Optional }, { type: Inject, args: [BASE_CONFIG,] }] },
120
+ { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [SCRIPT_PARAMS,] }] }
121
+ ];
122
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbmd4LXV0aWxzL3NlcnZpY2VzL2NvbmZpZy5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUMsTUFBTSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ3RFLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUNoRCxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUNyRCxPQUFPLEVBQUMsV0FBVyxFQUFrQixjQUFjLEVBQUUsWUFBWSxFQUFFLGFBQWEsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBRXpHLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUcvQixNQUFNLE9BQU8sYUFBYTtJQW9CdEIsWUFBcUIsSUFBZ0IsRUFDaEIsU0FBMkIsRUFDTCxXQUFnQixFQUNkLGFBQTZCLElBQUksRUFDL0IsZUFBb0IsSUFBSTtRQUpsRCxTQUFJLEdBQUosSUFBSSxDQUFZO1FBQ2hCLGNBQVMsR0FBVCxTQUFTLENBQWtCO1FBQ0wsZ0JBQVcsR0FBWCxXQUFXLENBQUs7UUFHdkQsS0FBSyxNQUFNLEdBQUcsSUFBSSxFQUFFLEVBQUU7WUFDbEIsTUFBTSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUFFLEdBQUcsRUFBRTtnQkFDeEMsVUFBVSxFQUFFLEtBQUs7YUFDcEIsQ0FBQyxDQUFDO1NBQ047UUFDRCxJQUFJLE9BQU8sR0FBRyxFQUFFLENBQUM7UUFDakIsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFBRTtZQUMxQixNQUFNLGFBQWEsR0FBSSxRQUFRLENBQUMsYUFBbUMsQ0FBQztZQUNwRSxJQUFJLENBQUMsQ0FBQyxhQUFhLEVBQUU7Z0JBQ2pCLE1BQU0sU0FBUyxHQUFH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QUUsT0FBTyxFQUFFLENBQUM7UUFDM0IsT0FBTyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQzlELENBQUM7OztZQXZISixVQUFVOzs7WUFOSCxVQUFVO1lBQ1YsZ0JBQWdCOzRDQTRCUCxNQUFNLFNBQUMsWUFBWTtZQTNCQyxjQUFjLHVCQTRCbEMsUUFBUSxZQUFJLE1BQU0sU0FBQyxXQUFXOzRDQUM5QixRQUFRLFlBQUksTUFBTSxTQUFDLGFBQWEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0luamVjdCwgSW5qZWN0YWJsZSwgT3B0aW9uYWwsIGlzRGV2TW9kZX0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHtIdHRwQ2xpZW50fSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uL2h0dHBcIjtcclxuaW1wb3J0IHtVbml2ZXJzYWxTZXJ2aWNlfSBmcm9tIFwiLi91bml2ZXJzYWwuc2VydmljZVwiO1xyXG5pbXBvcnQge0JBU0VfQ09ORklHLCBJQ29uZmlnU2VydmljZSwgSUNvbmZpZ3VyYXRpb24sIFJPT1RfRUxFTUVOVCwgU0NSSVBUX1BBUkFNU30gZnJvbSBcIi4uL2NvbW1vbi10eXBlc1wiO1xyXG5cclxuY29uc3QgSlNPTjUgPSByZXF1aXJlKFwianNvbjVcIik7XHJcblxyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBDb25maWdTZXJ2aWNlIGltcGxlbWVudHMgSUNvbmZpZ1NlcnZpY2Uge1xyXG5cclxuICAgIHByb3RlY3RlZCBiYXNlQ29uZmlnOiBJQ29uZmlndXJhdGlvbjtcclxuICAgIHByb3RlY3RlZCBsb2FkZWRDb25maWc6IElDb25maWd1cmF0aW9uO1xyXG4gICAgcHJvdGVjdGVkIHNjcmlwdFBhcmFtZXRlcnM6IGFueTtcclxuICAgIHByb3RlY3RlZCBsb2FkZXI6IFByb21pc2U8SUNvbmZpZ3VyYXRpb24+O1xyXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGxvYWRlckZ1bmM6ICgpID0+IFByb21pc2U8SUNvbmZpZ3VyYXRpb24+O1xyXG5cclxuICAgIGdldCBsb2FkKCk6ICgpID0+IFByb21pc2U8SUNvbmZpZ3VyYXRpb24+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5sb2FkZXJGdW5jO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBjb25maWcoKTogSUNvbmZpZ3VyYXRpb24ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmxvYWRlZENvbmZpZztcclxuICAgIH1cclxuXHJcbiAgICBnZXQgY29uZmlnVXJsKCk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIGAke3RoaXMubG9hZGVkQ29uZmlnLmJhc2VVcmx9Y29uZmlnL2NvbmZpZy5qc29uYDtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdHJ1Y3RvcihyZWFkb25seSBodHRwOiBIdHRwQ2xpZW50LFxyXG4gICAgICAgICAgICAgICAgcmVhZG9ubHkgdW5pdmVyc2FsOiBVbml2ZXJzYWxTZXJ2aWNlLFxyXG4gICAgICAgICAgICAgICAgQEluamVjdChST09UX0VMRU1FTlQpIHJlYWRvbmx5IHJvb3RFbGVtZW50OiBhbnksXHJcbiAgICAgICAgICAgICAgICBAT3B0aW9uYWwoKSBASW5qZWN0KEJBU0VfQ09ORklHKSBiYXNlQ29uZmlnOiBJQ29uZmlndXJhdGlvbiA9IG51bGwsXHJcbiAgICAgICAgICAgICAgICBAT3B0aW9uYWwoKSBASW5qZWN0KFNDUklQVF9QQVJBTVMpIHNjcmlwdFBhcmFtczogYW55ID0gbnVsbCkge1xyXG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIFtdKSB7XHJcbiAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShBcnJheS5wcm90b3R5cGUsIGtleSwge1xyXG4gICAgICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2VcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBiYXNlVXJsID0gXCJcIjtcclxuICAgICAgICBpZiAodGhpcy51bml2ZXJzYWwuaXNCcm93c2VyKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRTY3JpcHQgPSAoZG9jdW1lbnQuY3VycmVudFNjcmlwdCBhcyBIVE1MU2NyaXB0RWxlbWVudCk7XHJcbiAgICAgICAgICAgIGlmICghIWN1cnJlbnRTY3JpcHQpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHNjcmlwdFNyYyA9IGN1cnJlbnRTY3JpcHQuc3JjO1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgc3JjUGFydHMgPSBzY3JpcHRTcmMuc3BsaXQoXCIuanNcIik7XHJcbiAgICAgICAgICAgICAgICBiYXNlVXJsID0gc2NyaXB0U3JjLnN1YnN0cigwLCBzcmNQYXJ0c1swXS5sYXN0SW5kZXhPZihcIi9cIikgKyAxKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmJhc2VDb25maWcgPSBiYXNlQ29uZmlnIHx8IHt9O1xyXG4gICAgICAgIHRoaXMubG9hZGVkQ29uZmlnID0gT2JqZWN0LmFzc2lnbihcclxuICAgICAgICAgICAgIWJhc2VVcmwgPyB7fSA6IHtiYXNlVXJsLCBiYXNlRG9tYWluOiB0aGlzLnBhcnNlRG9tYWluKGJhc2VVcmwpfSxcclxuICAgICAgICAgICAgdGhpcy5iYXNlQ29uZmlnXHJcbiAgICAgICAgKTtcclxuICAgICAgICB0aGlzLnNjcmlwdFBhcmFtZXRlcnMgPSBzY3JpcHRQYXJhbXMgfHwge307XHJcbiAgICAgICAgdGhpcy5sb2FkZXJGdW5jID0gKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmxvYWRlciA9IHRoaXMubG9hZGVyIHx8IG5ldyBQcm9taXNlPGFueT4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2FkSnNvbigpLnRoZW4oY29uZmlnID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvYWRlZENvbmZpZyA9IGNvbmZpZyA9IE9iamVjdC5hc3NpZ24odGhpcy5sb2FkZWRDb25maWcsIGNvbmZpZyk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wcmVwYXJlQ29uZmlnKGNvbmZpZykudGhlbihjID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkZWRDb25maWcgPSBjO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjLmJhc2VVcmwgPSBjLmJhc2VVcmwgfHwgXCIvXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoYyk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9LCByZWplY3QpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMubG9hZGVyO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5pbml0U2VydmljZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBwYXJzZURvbWFpbihiYXNlVXJsOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHVybCA9IG5ldyBVUkwoYmFzZVVybCk7XHJcbiAgICAgICAgICAgIGNvbnN0IHBvcnQgPSB1cmwucG9ydCAmJiB1cmwucG9ydCAhPT0gXCI0NDNcIiAmJiB1cmwucG9ydCAhPT0gXCI4MFwiID8gYDoke3VybC5wb3J0fWAgOiBgYDtcclxuICAgICAgICAgICAgcmV0dXJuIGAke3VybC5wcm90b2NvbH0vLyR7dXJsLmhvc3RuYW1lfSR7cG9ydH0vYDtcclxuICAgICAgICB9IGNhdGNoIHtcclxuICAgICAgICAgICAgcmV0dXJuIFwiL1wiO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgaW5pdFNlcnZpY2UoKTogdm9pZCB7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBhc3luYyBsb2FkSnNvbigpOiBQcm9taXNlPElDb25maWd1cmF0aW9uPiB7XHJcbiAgICAgICAgaWYgKHRoaXMudW5pdmVyc2FsLmlzU2VydmVyKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5sb2FkZWRDb25maWcpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBjb25maWdVcmwgPSB0aGlzLmNvbmZpZ1VybDtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBjb25zdCBjb25maWc1ID0gYXdhaXQgdGhpcy5odHRwLmdldChpc0Rldk1vZGUoKSA/IGAke2NvbmZpZ1VybH01YCA6IGNvbmZpZ1VybCwge3Jlc3BvbnNlVHlwZTogXCJ0ZXh0XCJ9KS50b1Byb21pc2UoKTtcclxuICAgICAgICAgICAgcmV0dXJuIEpTT041LnBhcnNlKGNvbmZpZzUpO1xyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNvbmZpZyA9IGF3YWl0IHRoaXMuaHR0cC5nZXQoY29uZmlnVXJsKS50b1Byb21pc2UoKTtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBDYW4ndCBwYXJzZSBqc29uNSBjb25maWc6ICR7ZX1gKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBjb25maWc7XHJcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ29uZmlnIGZpbGUgbm90IGZvdW5kIGF0OiAke2NvbmZpZ1VybH1gKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgcHJlcGFyZUNvbmZpZyhjb25maWc6IElDb25maWd1cmF0aW9uKTogUHJvbWlzZTxJQ29uZmlndXJhdGlvbj4ge1xyXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoY29uZmlnKTtcclxuICAgIH1cclxuXHJcbiAgICBwcmVwYXJlVXJsKHVybDogc3RyaW5nLCBlbmRpbmc6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICAgICAgY29uc3QgcHJvamVjdCA9ICF0aGlzLmxvYWRlZENvbmZpZyA/IFwiXCIgOiB0aGlzLmxvYWRlZENvbmZpZy5wcm9qZWN0O1xyXG4gICAgICAgIGNvbnN0IG5lZWRzUHJvdG9jb2wgPSB1cmw/LnN0YXJ0c1dpdGgoXCIvL1wiKSA/PyBmYWxzZTtcclxuICAgICAgICB1cmwgPSAhbmVlZHNQcm90b2NvbCAmJiB1cmw/LnN0YXJ0c1dpdGgoXCIvXCIpID8gdGhpcy5sb2FkZWRDb25maWcuYmFzZURvbWFpbiArIHVybC5zdWJzdHIoMSkgOiB1cmwgfHwgXCJcIjtcclxuICAgICAgICB1cmwgPSBgJHt1cmwucmVwbGFjZSgvXFwvKyQvLCBcIlwiKX0ke2VuZGluZ31gLnJlcGxhY2UoXCJbcHJvamVjdF1cIiwgcHJvamVjdCk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudW5pdmVyc2FsLmlzU2VydmVyICYmIG5lZWRzUHJvdG9jb2wgPyBgaHR0cDoke3VybH1gIDogdXJsO1xyXG4gICAgfVxyXG5cclxuICAgIGdldENvbmZpZ1ZhbHVlKGtleTogc3RyaW5nKTogYW55IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5sb2FkZWRDb25maWdba2V5XTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRRdWVyeVBhcmFtZXRlcihuYW1lOiBzdHJpbmcsIHVybD86IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICAgICAgdXJsID0gdXJsIHx8ICh0aGlzLnVuaXZlcnNhbC5pc0Jyb3dzZXIgPyB3aW5kb3cubG9jYXRpb24uaHJlZiA6IFwiXCIpO1xyXG4gICAgICAgIG5hbWUgPSBuYW1lLnJlcGxhY2UoL1tcXFtcXF1dL2csIFwiXFxcXCQmXCIpO1xyXG4gICAgICAgIGNvbnN0IHJlZ2V4ID0gbmV3IFJlZ0V4cChcIls/Jl1cIiArIG5hbWUgKyBcIig9KFteJiNdKil8JnwjfCQpXCIpLFxyXG4gICAgICAgICAgICByZXN1bHRzID0gcmVnZXguZXhlYyh1cmwpO1xyXG4gICAgICAgIGlmICghcmVzdWx0cykgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgaWYgKCFyZXN1bHRzWzJdKSByZXR1cm4gXCJcIjtcclxuICAgICAgICByZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KHJlc3VsdHNbMl0ucmVwbGFjZSgvXFwrL2csIFwiIFwiKSk7XHJcbiAgICB9XHJcbn1cclxuIl19
@@ -0,0 +1,49 @@
1
+ import { ErrorHandler, Injectable, Injector } from "@angular/core";
2
+ import { UniversalService } from "./universal.service";
3
+ import { ERROR_HANDLER, TOASTER_SERVICE } from "../common-types";
4
+ export class ErrorHandlerService extends ErrorHandler {
5
+ constructor(injector) {
6
+ super();
7
+ this.injector = injector;
8
+ this.errorMap = {};
9
+ }
10
+ handleError(error) {
11
+ try {
12
+ this.universal = this.universal || this.injector.get(UniversalService);
13
+ }
14
+ catch (e) {
15
+ return;
16
+ }
17
+ const date = new Date();
18
+ try {
19
+ this.errorCb = this.errorCb || this.injector.get(ERROR_HANDLER);
20
+ this.errorCb(`[${date}]: ${error.message}\n${error.stack}`);
21
+ }
22
+ catch (e) {
23
+ if (this.universal.isServer) {
24
+ console.error(`[${date}]: ${error.message}\n${error.stack}`);
25
+ return;
26
+ }
27
+ }
28
+ if (this.universal.isServer)
29
+ return;
30
+ const key = typeof btoa !== "undefined" ? btoa(unescape(encodeURIComponent(`${error.message} ${error.stack}`))) : error.message;
31
+ if (this.errorMap[key] && this.errorMap[key].getTime() > date.getTime() - 5000)
32
+ return;
33
+ this.errorMap[key] = date;
34
+ try {
35
+ this.toaster = this.toaster || this.injector.get(TOASTER_SERVICE);
36
+ this.toaster.error(`[${date}]: ${error.message}\n${error.stack}`);
37
+ }
38
+ catch (e) {
39
+ }
40
+ console.error(`[${date}]: ${error.message}\n${error.stack}`);
41
+ }
42
+ }
43
+ ErrorHandlerService.decorators = [
44
+ { type: Injectable }
45
+ ];
46
+ ErrorHandlerService.ctorParameters = () => [
47
+ { type: Injector }
48
+ ];
49
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3ItaGFuZGxlci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL25neC11dGlscy9zZXJ2aWNlcy9lcnJvci1oYW5kbGVyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFlBQVksRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ2pFLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBQ3JELE9BQU8sRUFBQyxhQUFhLEVBQXlDLGVBQWUsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBR3RHLE1BQU0sT0FBTyxtQkFBb0IsU0FBUSxZQUFZO0lBT2pELFlBQXFCLFFBQWtCO1FBQ25DLEtBQUssRUFBRSxDQUFDO1FBRFMsYUFBUSxHQUFSLFFBQVEsQ0FBVTtRQUVuQyxJQUFJLENBQUMsUUFBUSxHQUFHLEVBQUUsQ0FBQztJQUN2QixDQUFDO0lBRUQsV0FBVyxDQUFDLEtBQVk7UUFDcEIsSUFBSTtZQUNBLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1NBQzFFO1FBQUMsT0FBTyxDQUFDLEVBQUU7WUFDUixPQUFPO1NBQ1Y7UUFDRCxNQUFNLElBQUksR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO1FBQ3hCLElBQUk7WUFDQSxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDaEUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLElBQUksTUFBTSxLQUFLLENBQUMsT0FBTyxLQUFLLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO1NBQy9EO1FBQUMsT0FBTyxDQUFDLEVBQUU7WUFDUixJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFO2dCQUN6QixPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksSUFBSSxNQUFNLEtBQUssQ0FBQyxPQUFPLEtBQUssS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7Z0JBQzdELE9BQU87YUFDVjtTQUNKO1FBQ0QsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVE7WUFBRSxPQUFPO1FBQ3BDLE1BQU0sR0FBRyxHQUFHLE9BQU8sSUFBSSxLQUFLLFdBQVcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLEtBQUssQ0FBQyxPQUFPLElBQUksS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDO1FBQ2hJLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sRUFBRSxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsR0FBRyxJQUFJO1lBQUUsT0FBTztRQUN2RixJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQztRQUMxQixJQUFJO1lBQ0EsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxDQUFDO1lBQ2xFLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksSUFBSSxNQUFNLEtBQUssQ0FBQyxPQUFPLEtBQUssS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7U0FDckU7UUFBQyxPQUFPLENBQUMsRUFBRTtTQUNYO1FBQ0QsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLElBQUksTUFBTSxLQUFLLENBQUMsT0FBTyxLQUFLLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBQ2pFLENBQUM7OztZQXZDSixVQUFVOzs7WUFKdUIsUUFBUSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7RXJyb3JIYW5kbGVyLCBJbmplY3RhYmxlLCBJbmplY3Rvcn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHtVbml2ZXJzYWxTZXJ2aWNlfSBmcm9tIFwiLi91bml2ZXJzYWwuc2VydmljZVwiO1xyXG5pbXBvcnQge0VSUk9SX0hBTkRMRVIsIEVycm9ySGFuZGxlckNhbGxiYWNrLCBJVG9hc3RlclNlcnZpY2UsIFRPQVNURVJfU0VSVklDRX0gZnJvbSBcIi4uL2NvbW1vbi10eXBlc1wiO1xyXG5cclxuQEluamVjdGFibGUoKVxyXG5leHBvcnQgY2xhc3MgRXJyb3JIYW5kbGVyU2VydmljZSBleHRlbmRzIEVycm9ySGFuZGxlciB7XHJcblxyXG4gICAgcHJpdmF0ZSB0b2FzdGVyOiBJVG9hc3RlclNlcnZpY2U7XHJcbiAgICBwcml2YXRlIHVuaXZlcnNhbDogVW5pdmVyc2FsU2VydmljZTtcclxuICAgIHByaXZhdGUgZXJyb3JDYjogRXJyb3JIYW5kbGVyQ2FsbGJhY2s7XHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IGVycm9yTWFwOiBhbnk7XHJcblxyXG4gICAgY29uc3RydWN0b3IocmVhZG9ubHkgaW5qZWN0b3I6IEluamVjdG9yKSB7XHJcbiAgICAgICAgc3VwZXIoKTtcclxuICAgICAgICB0aGlzLmVycm9yTWFwID0ge307XHJcbiAgICB9XHJcblxyXG4gICAgaGFuZGxlRXJyb3IoZXJyb3I6IEVycm9yKTogdm9pZCB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdGhpcy51bml2ZXJzYWwgPSB0aGlzLnVuaXZlcnNhbCB8fCB0aGlzLmluamVjdG9yLmdldChVbml2ZXJzYWxTZXJ2aWNlKTtcclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKCk7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdGhpcy5lcnJvckNiID0gdGhpcy5lcnJvckNiIHx8IHRoaXMuaW5qZWN0b3IuZ2V0KEVSUk9SX0hBTkRMRVIpO1xyXG4gICAgICAgICAgICB0aGlzLmVycm9yQ2IoYFske2RhdGV9XTogJHtlcnJvci5tZXNzYWdlfVxcbiR7ZXJyb3Iuc3RhY2t9YCk7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy51bml2ZXJzYWwuaXNTZXJ2ZXIpIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYFske2RhdGV9XTogJHtlcnJvci5tZXNzYWdlfVxcbiR7ZXJyb3Iuc3RhY2t9YCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMudW5pdmVyc2FsLmlzU2VydmVyKSByZXR1cm47XHJcbiAgICAgICAgY29uc3Qga2V5ID0gdHlwZW9mIGJ0b2EgIT09IFwidW5kZWZpbmVkXCIgPyBidG9hKHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChgJHtlcnJvci5tZXNzYWdlfSAke2Vycm9yLnN0YWNrfWApKSkgOiBlcnJvci5tZXNzYWdlO1xyXG4gICAgICAgIGlmICh0aGlzLmVycm9yTWFwW2tleV0gJiYgdGhpcy5lcnJvck1hcFtrZXldLmdldFRpbWUoKSA+IGRhdGUuZ2V0VGltZSgpIC0gNTAwMCkgcmV0dXJuO1xyXG4gICAgICAgIHRoaXMuZXJyb3JNYXBba2V5XSA9IGRhdGU7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdGhpcy50b2FzdGVyID0gdGhpcy50b2FzdGVyIHx8IHRoaXMuaW5qZWN0b3IuZ2V0KFRPQVNURVJfU0VSVklDRSk7XHJcbiAgICAgICAgICAgIHRoaXMudG9hc3Rlci5lcnJvcihgWyR7ZGF0ZX1dOiAke2Vycm9yLm1lc3NhZ2V9XFxuJHtlcnJvci5zdGFja31gKTtcclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYFske2RhdGV9XTogJHtlcnJvci5tZXNzYWdlfVxcbiR7ZXJyb3Iuc3RhY2t9YCk7XHJcbiAgICB9XHJcbn1cclxuIl19
@@ -0,0 +1,24 @@
1
+ import { EventEmitter, Injectable } from "@angular/core";
2
+ export class EventsService {
3
+ constructor() {
4
+ this.eventForwarded = new EventEmitter();
5
+ this.stickyUpdated = new EventEmitter();
6
+ this.languageChanged = new EventEmitter();
7
+ this.sticky = false;
8
+ }
9
+ get isSticky() {
10
+ return this.sticky;
11
+ }
12
+ event(e) {
13
+ this.eventForwarded.emit(e);
14
+ }
15
+ updateSticky(sticky) {
16
+ this.sticky = sticky;
17
+ this.stickyUpdated.emit(sticky);
18
+ }
19
+ }
20
+ EventsService.decorators = [
21
+ { type: Injectable }
22
+ ];
23
+ EventsService.ctorParameters = () => [];
24
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZlbnRzLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbmd4LXV0aWxzL3NlcnZpY2VzL2V2ZW50cy5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxZQUFZLEVBQUUsVUFBVSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBR3ZELE1BQU0sT0FBTyxhQUFhO0lBWXRCO1FBQ0ksSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLFlBQVksRUFBUyxDQUFDO1FBQ2hELElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxZQUFZLEVBQVcsQ0FBQztRQUNqRCxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksWUFBWSxFQUFVLENBQUM7UUFDbEQsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7SUFDeEIsQ0FBQztJQVRELElBQVcsUUFBUTtRQUNmLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUN2QixDQUFDO0lBU0QsS0FBSyxDQUFDLENBQVE7UUFDVixJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNoQyxDQUFDO0lBRUQsWUFBWSxDQUFDLE1BQWU7UUFDeEIsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDckIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDcEMsQ0FBQzs7O1lBM0JKLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0V2ZW50RW1pdHRlciwgSW5qZWN0YWJsZX0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIEV2ZW50c1NlcnZpY2Uge1xyXG5cclxuICAgIHJlYWRvbmx5IGV2ZW50Rm9yd2FyZGVkOiBFdmVudEVtaXR0ZXI8RXZlbnQ+O1xyXG4gICAgcmVhZG9ubHkgc3RpY2t5VXBkYXRlZDogRXZlbnRFbWl0dGVyPGJvb2xlYW4+O1xyXG4gICAgcmVhZG9ubHkgbGFuZ3VhZ2VDaGFuZ2VkOiBFdmVudEVtaXR0ZXI8c3RyaW5nPjtcclxuXHJcbiAgICBwcml2YXRlIHN0aWNreTogYm9vbGVhbjtcclxuXHJcbiAgICBwdWJsaWMgZ2V0IGlzU3RpY2t5KCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnN0aWNreTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICB0aGlzLmV2ZW50Rm9yd2FyZGVkID0gbmV3IEV2ZW50RW1pdHRlcjxFdmVudD4oKTtcclxuICAgICAgICB0aGlzLnN0aWNreVVwZGF0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XHJcbiAgICAgICAgdGhpcy5sYW5ndWFnZUNoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcclxuICAgICAgICB0aGlzLnN0aWNreSA9IGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGV2ZW50KGU6IEV2ZW50KTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5ldmVudEZvcndhcmRlZC5lbWl0KGUpO1xyXG4gICAgfVxyXG5cclxuICAgIHVwZGF0ZVN0aWNreShzdGlja3k6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnN0aWNreSA9IHN0aWNreTtcclxuICAgICAgICB0aGlzLnN0aWNreVVwZGF0ZWQuZW1pdChzdGlja3kpO1xyXG4gICAgfVxyXG59XHJcbiJdfQ==
@@ -0,0 +1,44 @@
1
+ import { Inject, Injectable } from "@angular/core";
2
+ import { LANGUAGE_SERVICE } from "../common-types";
3
+ import { ObjectUtils } from "../utils/object.utils";
4
+ import { MathUtils } from "../utils/math.utils";
5
+ export class FormatterService {
6
+ constructor(language) {
7
+ this.language = language;
8
+ }
9
+ get defaultPrecision() {
10
+ return 2;
11
+ }
12
+ get defaultNumberFormat() {
13
+ return `num + ' mm'`;
14
+ }
15
+ get defaultDivider() {
16
+ return 1;
17
+ }
18
+ roundNumber(value, precision, divider) {
19
+ return MathUtils.round(value, this.getPrecision(precision), divider || this.defaultDivider);
20
+ }
21
+ formatNumber(value, format, precision, divider) {
22
+ precision = this.getPrecision(precision);
23
+ divider = divider || this.defaultDivider;
24
+ const num = ObjectUtils.isNumber(value) ? value : parseFloat(value) || 0;
25
+ const str = (num / divider).toLocaleString(this.language.currentLanguage, {
26
+ minimumFractionDigits: precision,
27
+ maximumFractionDigits: precision
28
+ });
29
+ return ObjectUtils.evaluate(format || this.defaultNumberFormat, { num: str });
30
+ }
31
+ formatMillimeter(value, precision, divider) {
32
+ return this.formatNumber(value, `num + ' mm'`, precision, divider);
33
+ }
34
+ getPrecision(precision) {
35
+ return ObjectUtils.isNumber(precision) ? precision : this.defaultPrecision;
36
+ }
37
+ }
38
+ FormatterService.decorators = [
39
+ { type: Injectable }
40
+ ];
41
+ FormatterService.ctorParameters = () => [
42
+ { type: undefined, decorators: [{ type: Inject, args: [LANGUAGE_SERVICE,] }] }
43
+ ];
44
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybWF0dGVyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbmd4LXV0aWxzL3NlcnZpY2VzL2Zvcm1hdHRlci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxNQUFNLEVBQUUsVUFBVSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ2pELE9BQU8sRUFBbUIsZ0JBQWdCLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUNuRSxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFDbEQsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBRzlDLE1BQU0sT0FBTyxnQkFBZ0I7SUFjekIsWUFBNkMsUUFBMEI7UUFBMUIsYUFBUSxHQUFSLFFBQVEsQ0FBa0I7SUFFdkUsQ0FBQztJQWRELElBQUksZ0JBQWdCO1FBQ2hCLE9BQU8sQ0FBQyxDQUFDO0lBQ2IsQ0FBQztJQUVELElBQUksbUJBQW1CO1FBQ25CLE9BQU8sYUFBYSxDQUFDO0lBQ3pCLENBQUM7SUFFRCxJQUFJLGNBQWM7UUFDZCxPQUFPLENBQUMsQ0FBQztJQUNiLENBQUM7SUFNRCxXQUFXLENBQUMsS0FBYSxFQUFFLFNBQWtCLEVBQUUsT0FBZ0I7UUFDM0QsT0FBTyxTQUFTLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxFQUFFLE9BQU8sSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDaEcsQ0FBQztJQUVELFlBQVksQ0FBQyxLQUFzQixFQUFFLE1BQWUsRUFBRSxTQUFrQixFQUFFLE9BQWdCO1FBQ3RGLFNBQVMsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3pDLE9BQU8sR0FBRyxPQUFPLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQztRQUN6QyxNQUFNLEdBQUcsR0FBRyxXQUFXLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBUyxLQUFLLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBUyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDekYsTUFBTSxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsT0FBTyxDQUFDLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsZUFBZSxFQUFFO1lBQ3RFLHFCQUFxQixFQUFFLFNBQVM7WUFDaEMscUJBQXFCLEVBQUUsU0FBUztTQUNuQyxDQUFDLENBQUM7UUFDSCxPQUFPLFdBQVcsQ0FBQyxRQUFRLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxFQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUMsQ0FBQyxDQUFDO0lBQ2hGLENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxLQUFhLEVBQUUsU0FBa0IsRUFBRSxPQUFnQjtRQUNoRSxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLGFBQWEsRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDdkUsQ0FBQztJQUVTLFlBQVksQ0FBQyxTQUFpQjtRQUNwQyxPQUFPLFdBQVcsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDO0lBQy9FLENBQUM7OztZQXhDSixVQUFVOzs7NENBZU0sTUFBTSxTQUFDLGdCQUFnQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7SW5qZWN0LCBJbmplY3RhYmxlfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQge0lMYW5ndWFnZVNlcnZpY2UsIExBTkdVQUdFX1NFUlZJQ0V9IGZyb20gXCIuLi9jb21tb24tdHlwZXNcIjtcclxuaW1wb3J0IHtPYmplY3RVdGlsc30gZnJvbSBcIi4uL3V0aWxzL29iamVjdC51dGlsc1wiO1xyXG5pbXBvcnQge01hdGhVdGlsc30gZnJvbSBcIi4uL3V0aWxzL21hdGgudXRpbHNcIjtcclxuXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIEZvcm1hdHRlclNlcnZpY2Uge1xyXG5cclxuICAgIGdldCBkZWZhdWx0UHJlY2lzaW9uKCk6IG51bWJlciB7XHJcbiAgICAgICAgcmV0dXJuIDI7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGRlZmF1bHROdW1iZXJGb3JtYXQoKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gYG51bSArICcgbW0nYDtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgZGVmYXVsdERpdmlkZXIoKTogbnVtYmVyIHtcclxuICAgICAgICByZXR1cm4gMTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdHJ1Y3RvcihASW5qZWN0KExBTkdVQUdFX1NFUlZJQ0UpIHB1YmxpYyBsYW5ndWFnZTogSUxhbmd1YWdlU2VydmljZSkge1xyXG5cclxuICAgIH1cclxuXHJcbiAgICByb3VuZE51bWJlcih2YWx1ZTogbnVtYmVyLCBwcmVjaXNpb24/OiBudW1iZXIsIGRpdmlkZXI/OiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgICAgIHJldHVybiBNYXRoVXRpbHMucm91bmQodmFsdWUsIHRoaXMuZ2V0UHJlY2lzaW9uKHByZWNpc2lvbiksIGRpdmlkZXIgfHwgdGhpcy5kZWZhdWx0RGl2aWRlcik7XHJcbiAgICB9XHJcblxyXG4gICAgZm9ybWF0TnVtYmVyKHZhbHVlOiBudW1iZXIgfCBzdHJpbmcsIGZvcm1hdD86IHN0cmluZywgcHJlY2lzaW9uPzogbnVtYmVyLCBkaXZpZGVyPzogbnVtYmVyKTogc3RyaW5nIHtcclxuICAgICAgICBwcmVjaXNpb24gPSB0aGlzLmdldFByZWNpc2lvbihwcmVjaXNpb24pO1xyXG4gICAgICAgIGRpdmlkZXIgPSBkaXZpZGVyIHx8IHRoaXMuZGVmYXVsdERpdmlkZXI7XHJcbiAgICAgICAgY29uc3QgbnVtID0gT2JqZWN0VXRpbHMuaXNOdW1iZXIodmFsdWUpID8gPG51bWJlcj52YWx1ZSA6IHBhcnNlRmxvYXQoPHN0cmluZz52YWx1ZSkgfHwgMDtcclxuICAgICAgICBjb25zdCBzdHIgPSAobnVtIC8gZGl2aWRlcikudG9Mb2NhbGVTdHJpbmcodGhpcy5sYW5ndWFnZS5jdXJyZW50TGFuZ3VhZ2UsIHtcclxuICAgICAgICAgICAgbWluaW11bUZyYWN0aW9uRGlnaXRzOiBwcmVjaXNpb24sXHJcbiAgICAgICAgICAgIG1heGltdW1GcmFjdGlvbkRpZ2l0czogcHJlY2lzaW9uXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdFV0aWxzLmV2YWx1YXRlKGZvcm1hdCB8fCB0aGlzLmRlZmF1bHROdW1iZXJGb3JtYXQsIHtudW06IHN0cn0pO1xyXG4gICAgfVxyXG5cclxuICAgIGZvcm1hdE1pbGxpbWV0ZXIodmFsdWU6IG51bWJlciwgcHJlY2lzaW9uPzogbnVtYmVyLCBkaXZpZGVyPzogbnVtYmVyKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5mb3JtYXROdW1iZXIodmFsdWUsIGBudW0gKyAnIG1tJ2AsIHByZWNpc2lvbiwgZGl2aWRlcik7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIGdldFByZWNpc2lvbihwcmVjaXNpb246IG51bWJlcik6IG51bWJlciB7XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdFV0aWxzLmlzTnVtYmVyKHByZWNpc2lvbikgPyBwcmVjaXNpb24gOiB0aGlzLmRlZmF1bHRQcmVjaXNpb247XHJcbiAgICB9XHJcbn1cclxuIl19
@@ -0,0 +1,35 @@
1
+ import { EventEmitter, Injectable } from "@angular/core";
2
+ import { ObjectUtils } from "../utils/object.utils";
3
+ export class GlobalTemplateService {
4
+ constructor() {
5
+ this.templatesUpdated = new EventEmitter();
6
+ this.globalTemplates = {};
7
+ this.componentModifiers = {};
8
+ }
9
+ get(id, component) {
10
+ const template = this.globalTemplates[id];
11
+ if (!template)
12
+ return undefined;
13
+ const modifier = this.componentModifiers[id];
14
+ if (ObjectUtils.isFunction(modifier) && component) {
15
+ modifier(component);
16
+ }
17
+ return template;
18
+ }
19
+ add(id, template) {
20
+ this.globalTemplates[id] = template;
21
+ this.templatesUpdated.emit();
22
+ }
23
+ remove(id) {
24
+ delete this.globalTemplates[id];
25
+ this.templatesUpdated.emit();
26
+ }
27
+ addComponentModifier(id, modifier) {
28
+ this.componentModifiers[id] = modifier;
29
+ }
30
+ }
31
+ GlobalTemplateService.decorators = [
32
+ { type: Injectable }
33
+ ];
34
+ GlobalTemplateService.ctorParameters = () => [];
35
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2xvYmFsLXRlbXBsYXRlLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbmd4LXV0aWxzL3NlcnZpY2VzL2dsb2JhbC10ZW1wbGF0ZS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxZQUFZLEVBQUUsVUFBVSxFQUFjLE1BQU0sZUFBZSxDQUFDO0FBQ3BFLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUlsRCxNQUFNLE9BQU8scUJBQXFCO0lBTzlCO1FBQ0ksSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7UUFDaEQsSUFBSSxDQUFDLGVBQWUsR0FBRyxFQUFFLENBQUM7UUFDMUIsSUFBSSxDQUFDLGtCQUFrQixHQUFHLEVBQUUsQ0FBQztJQUNqQyxDQUFDO0lBRUQsR0FBRyxDQUFDLEVBQVUsRUFBRSxTQUFlO1FBQzNCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDMUMsSUFBSSxDQUFDLFFBQVE7WUFBRSxPQUFPLFNBQVMsQ0FBQztRQUNoQyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDN0MsSUFBSSxXQUFXLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxJQUFJLFNBQVMsRUFBRTtZQUMvQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUM7U0FDdkI7UUFDRCxPQUFPLFFBQVEsQ0FBQztJQUNwQixDQUFDO0lBRUQsR0FBRyxDQUFDLEVBQVUsRUFBRSxRQUEwQjtRQUN0QyxJQUFJLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQyxHQUFHLFFBQVEsQ0FBQztRQUNwQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDakMsQ0FBQztJQUVELE1BQU0sQ0FBQyxFQUFVO1FBQ2IsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ2hDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUNqQyxDQUFDO0lBRUQsb0JBQW9CLENBQUMsRUFBVSxFQUFFLFFBQWlDO1FBQzlELElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLENBQUMsR0FBRyxRQUFRLENBQUM7SUFDM0MsQ0FBQzs7O1lBcENKLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0V2ZW50RW1pdHRlciwgSW5qZWN0YWJsZSwgVGVtcGxhdGVSZWZ9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7T2JqZWN0VXRpbHN9IGZyb20gXCIuLi91dGlscy9vYmplY3QudXRpbHNcIjtcclxuaW1wb3J0IHtHbG9iYWxDb21wb25lbnRNb2RpZmllciwgSUdsb2JhbFRlbXBsYXRlc30gZnJvbSBcIi4uL2NvbW1vbi10eXBlc1wiO1xyXG5cclxuQEluamVjdGFibGUoKVxyXG5leHBvcnQgY2xhc3MgR2xvYmFsVGVtcGxhdGVTZXJ2aWNlIGltcGxlbWVudHMgSUdsb2JhbFRlbXBsYXRlcyB7XHJcblxyXG4gICAgcmVhZG9ubHkgdGVtcGxhdGVzVXBkYXRlZDogRXZlbnRFbWl0dGVyPHZvaWQ+O1xyXG5cclxuICAgIHByb3RlY3RlZCBnbG9iYWxUZW1wbGF0ZXM6IHsgW2lkOiBzdHJpbmddOiBUZW1wbGF0ZVJlZjxhbnk+IH07XHJcbiAgICBwcm90ZWN0ZWQgY29tcG9uZW50TW9kaWZpZXJzOiB7IFtpZDogc3RyaW5nXTogR2xvYmFsQ29tcG9uZW50TW9kaWZpZXIgfTtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICB0aGlzLnRlbXBsYXRlc1VwZGF0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICAgICAgICB0aGlzLmdsb2JhbFRlbXBsYXRlcyA9IHt9O1xyXG4gICAgICAgIHRoaXMuY29tcG9uZW50TW9kaWZpZXJzID0ge307XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0KGlkOiBzdHJpbmcsIGNvbXBvbmVudD86IGFueSk6IFRlbXBsYXRlUmVmPGFueT4ge1xyXG4gICAgICAgIGNvbnN0IHRlbXBsYXRlID0gdGhpcy5nbG9iYWxUZW1wbGF0ZXNbaWRdO1xyXG4gICAgICAgIGlmICghdGVtcGxhdGUpIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgICAgY29uc3QgbW9kaWZpZXIgPSB0aGlzLmNvbXBvbmVudE1vZGlmaWVyc1tpZF07XHJcbiAgICAgICAgaWYgKE9iamVjdFV0aWxzLmlzRnVuY3Rpb24obW9kaWZpZXIpICYmIGNvbXBvbmVudCkge1xyXG4gICAgICAgICAgICBtb2RpZmllcihjb21wb25lbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGVtcGxhdGU7XHJcbiAgICB9XHJcblxyXG4gICAgYWRkKGlkOiBzdHJpbmcsIHRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+KTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5nbG9iYWxUZW1wbGF0ZXNbaWRdID0gdGVtcGxhdGU7XHJcbiAgICAgICAgdGhpcy50ZW1wbGF0ZXNVcGRhdGVkLmVtaXQoKTtcclxuICAgIH1cclxuXHJcbiAgICByZW1vdmUoaWQ6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgIGRlbGV0ZSB0aGlzLmdsb2JhbFRlbXBsYXRlc1tpZF07XHJcbiAgICAgICAgdGhpcy50ZW1wbGF0ZXNVcGRhdGVkLmVtaXQoKTtcclxuICAgIH1cclxuXHJcbiAgICBhZGRDb21wb25lbnRNb2RpZmllcihpZDogc3RyaW5nLCBtb2RpZmllcjogR2xvYmFsQ29tcG9uZW50TW9kaWZpZXIpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmNvbXBvbmVudE1vZGlmaWVyc1tpZF0gPSBtb2RpZmllcjtcclxuICAgIH1cclxufVxyXG4iXX0=
@@ -0,0 +1,24 @@
1
+ import { EventEmitter, Injectable } from "@angular/core";
2
+ export class IconService {
3
+ constructor() {
4
+ this.iconsLoaded = new EventEmitter();
5
+ this.disabled = false;
6
+ }
7
+ get isDisabled() {
8
+ return this.disabled;
9
+ }
10
+ set isDisabled(value) {
11
+ this.disabled = value;
12
+ this.iconsLoaded.emit();
13
+ }
14
+ getIcon(icon, activeIcon, active) {
15
+ icon = typeof icons == "undefined" ? icon : (icons[icon] || icon);
16
+ activeIcon = typeof icons == "undefined" ? activeIcon : (icons[activeIcon] || icon);
17
+ return Promise.resolve(active ? activeIcon : icon);
18
+ }
19
+ }
20
+ IconService.decorators = [
21
+ { type: Injectable }
22
+ ];
23
+ IconService.ctorParameters = () => [];
24
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWNvbi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL25neC11dGlscy9zZXJ2aWNlcy9pY29uLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFlBQVksRUFBRSxVQUFVLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFRdkQsTUFBTSxPQUFPLFdBQVc7SUFlcEI7UUFDSSxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7UUFDM0MsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7SUFDMUIsQ0FBQztJQWhCRCxJQUFJLFVBQVU7UUFDVixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDekIsQ0FBQztJQUVELElBQUksVUFBVSxDQUFDLEtBQWM7UUFDekIsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7UUFDdEIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUM1QixDQUFDO0lBV0QsT0FBTyxDQUFDLElBQVksRUFBRSxVQUFrQixFQUFFLE1BQWU7UUFDckQsSUFBSSxHQUFHLE9BQU8sS0FBSyxJQUFJLFdBQVcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQztRQUNsRSxVQUFVLEdBQUcsT0FBTyxLQUFLLElBQUksV0FBVyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDO1FBQ3BGLE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDdkQsQ0FBQzs7O1lBekJKLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0V2ZW50RW1pdHRlciwgSW5qZWN0YWJsZX0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHtJSWNvblNlcnZpY2V9IGZyb20gXCIuLi9jb21tb24tdHlwZXNcIjtcclxuXHJcbmRlY2xhcmUgY29uc3QgaWNvbnM6IHtcclxuICAgIFtpY29uOiBzdHJpbmddOiBzdHJpbmc7XHJcbn07XHJcblxyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBJY29uU2VydmljZSBpbXBsZW1lbnRzIElJY29uU2VydmljZSB7XHJcblxyXG4gICAgZ2V0IGlzRGlzYWJsZWQoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGlzYWJsZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0IGlzRGlzYWJsZWQodmFsdWU6IGJvb2xlYW4pIHtcclxuICAgICAgICB0aGlzLmRpc2FibGVkID0gdmFsdWU7XHJcbiAgICAgICAgdGhpcy5pY29uc0xvYWRlZC5lbWl0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHJlYWRvbmx5IGljb25zTG9hZGVkOiBFdmVudEVtaXR0ZXI8YW55PjtcclxuXHJcbiAgICBwcm90ZWN0ZWQgZGlzYWJsZWQ6IGJvb2xlYW47XHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgdGhpcy5pY29uc0xvYWRlZCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gICAgICAgIHRoaXMuZGlzYWJsZWQgPSBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRJY29uKGljb246IHN0cmluZywgYWN0aXZlSWNvbjogc3RyaW5nLCBhY3RpdmU6IGJvb2xlYW4pOiBQcm9taXNlPHN0cmluZz4ge1xyXG4gICAgICAgIGljb24gPSB0eXBlb2YgaWNvbnMgPT0gXCJ1bmRlZmluZWRcIiA/IGljb24gOiAoaWNvbnNbaWNvbl0gfHwgaWNvbik7XHJcbiAgICAgICAgYWN0aXZlSWNvbiA9IHR5cGVvZiBpY29ucyA9PSBcInVuZGVmaW5lZFwiID8gYWN0aXZlSWNvbiA6IChpY29uc1thY3RpdmVJY29uXSB8fCBpY29uKTtcclxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGFjdGl2ZSA/IGFjdGl2ZUljb24gOiBpY29uKTtcclxuICAgIH1cclxufVxyXG4iXX0=
@@ -0,0 +1,117 @@
1
+ import { __awaiter } from "tslib";
2
+ import { Injectable } from "@angular/core";
3
+ import { BehaviorSubject, combineLatest } from "rxjs";
4
+ import { map } from "rxjs/operators";
5
+ import { StaticLanguageService } from "./static-language.service";
6
+ export class LanguageService extends StaticLanguageService {
7
+ get currentLanguage() {
8
+ return this.currentLang || this.defaultLanguage;
9
+ }
10
+ set currentLanguage(lang) {
11
+ this.useLanguage(lang).then(() => {
12
+ this.events.languageChanged.emit(lang);
13
+ });
14
+ }
15
+ get settings() {
16
+ const settings = this.languageSettings.value;
17
+ return !settings ? {} : settings.settings[this.currentLanguage] || {};
18
+ }
19
+ get $settings() {
20
+ this.loadSettings().then(s => this.languageSettings.next(s));
21
+ return combineLatest([this.languageSettings, this.events.languageChanged]).pipe(map(([settings, lang]) => {
22
+ return !settings ? {} : settings.settings[lang] || {};
23
+ }));
24
+ }
25
+ initService() {
26
+ this.client.setExtraRequestParam("language", "de");
27
+ this.translationRequests = {};
28
+ this.languageSettings = new BehaviorSubject(null);
29
+ if (this.universal.isServer)
30
+ return;
31
+ window["setLanguage"] = (lang) => {
32
+ this.currentLanguage = lang;
33
+ };
34
+ }
35
+ initFromSettings() {
36
+ return __awaiter(this, void 0, void 0, function* () {
37
+ const defaultLanguage = this.defaultLanguage;
38
+ const settings = yield this.loadSettings();
39
+ this.languageSettings.next(settings);
40
+ const devLanguages = settings.devLanguages || [];
41
+ this.languageList = (settings.languages || []).filter(lang => {
42
+ return devLanguages.indexOf(lang) < 0;
43
+ });
44
+ const lang = this.languages.indexOf(defaultLanguage) < 0 ? settings.defaultLanguage : defaultLanguage;
45
+ yield this.useLanguage(lang);
46
+ this.events.languageChanged.emit(lang);
47
+ });
48
+ }
49
+ getTranslation(key, params = null) {
50
+ return __awaiter(this, void 0, void 0, function* () {
51
+ if (!key)
52
+ return "";
53
+ try {
54
+ const lowerKey = key.toLocaleLowerCase();
55
+ const dict = yield this.loadDictionary();
56
+ if (lowerKey in dict) {
57
+ return this.interpolate(dict[lowerKey], params);
58
+ }
59
+ return this.interpolate(key, params);
60
+ }
61
+ catch (reason) {
62
+ console.log("ERROR IN TRANSLATIONS", reason);
63
+ return key;
64
+ }
65
+ });
66
+ }
67
+ useLanguage(lang) {
68
+ return __awaiter(this, void 0, void 0, function* () {
69
+ lang = this.languages.indexOf(lang) < 0 ? this.languages[0] : lang;
70
+ this.client.setExtraRequestParam("language", lang);
71
+ if (lang == this.currentLang)
72
+ return this.dictionary;
73
+ this.storage.set("language", lang);
74
+ this.currentLang = lang;
75
+ const dict = yield this.loadDictionary();
76
+ this.translations[lang] = dict;
77
+ return dict;
78
+ });
79
+ }
80
+ loadDictionary() {
81
+ const lang = this.currentLanguage;
82
+ this.translationRequests[lang] = this.translationRequests[lang] || new Promise(resolve => {
83
+ this.httpClient.get(`${this.config.translationUrl}${lang}`).toPromise().then(response => {
84
+ response = response || {};
85
+ resolve(Object.keys(response).reduce((result, key) => {
86
+ result[key.toLocaleLowerCase()] = response[key];
87
+ return result;
88
+ }, {}));
89
+ }, () => {
90
+ resolve({});
91
+ });
92
+ });
93
+ return this.translationRequests[lang];
94
+ }
95
+ loadSettings() {
96
+ this.settingsPromise = this.settingsPromise || this.client.get(`${this.config.translationUrl}languageSettings`).toPromise()
97
+ .then((settings) => {
98
+ return settings;
99
+ }, () => {
100
+ return {
101
+ languages: ["de", "en", "hu"],
102
+ devLanguages: [],
103
+ defaultLanguage: "de",
104
+ settings: {
105
+ de: {},
106
+ hu: {},
107
+ end: {}
108
+ }
109
+ };
110
+ });
111
+ return this.settingsPromise;
112
+ }
113
+ }
114
+ LanguageService.decorators = [
115
+ { type: Injectable }
116
+ ];
117
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGFuZ3VhZ2Uuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9uZ3gtdXRpbHMvc2VydmljZXMvbGFuZ3VhZ2Uuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEVBQUMsZUFBZSxFQUFFLGFBQWEsRUFBYSxNQUFNLE1BQU0sQ0FBQztBQUNoRSxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFFbkMsT0FBTyxFQUFDLHFCQUFxQixFQUFDLE1BQU0sMkJBQTJCLENBQUM7QUFHaEUsTUFBTSxPQUFPLGVBQWdCLFNBQVEscUJBQXFCO0lBTXRELElBQUksZUFBZTtRQUNmLE9BQU8sSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsZUFBZSxDQUFDO0lBQ3BELENBQUM7SUFFRCxJQUFJLGVBQWUsQ0FBQyxJQUFZO1FBQzVCLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRTtZQUM3QixJQUFJLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDM0MsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQsSUFBSSxRQUFRO1FBQ1IsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQztRQUM3QyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUMxRSxDQUFDO0lBRUQsSUFBSSxTQUFTO1FBQ1QsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxnQkFBZ0Is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akQsTUFBTSxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO29CQUNoRCxPQUFPLE1BQU0sQ0FBQztnQkFDbEIsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDWixDQUFDLEVBQUUsR0FBRyxFQUFFO2dCQUNKLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNoQixDQUFDLENBQUMsQ0FBQztRQUNQLENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDMUMsQ0FBQztJQUVTLFlBQVk7UUFDbEIsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsZUFBZSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxjQUFjLGtCQUFrQixDQUFDLENBQUMsU0FBUyxFQUFFO2FBQ3RILElBQUksQ0FDRCxDQUFDLFFBQTJCLEVBQUUsRUFBRTtZQUM1QixPQUFPLFFBQVEsQ0FBQztRQUNwQixDQUFDLEVBQUUsR0FBRyxFQUFFO1lBQ0osT0FBTztnQkFDSCxTQUFTLEVBQUUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQztnQkFDN0IsWUFBWSxFQUFFLEVBQUU7Z0JBQ2hCLGVBQWUsRUFBRSxJQUFJO2dCQUNyQixRQUFRLEVBQUU7b0JBQ04sRUFBRSxFQUFFLEVBQUU7b0JBQ04sRUFBRSxFQUFFLEVBQUU7b0JBQ04sR0FBRyxFQUFFLEVBQUU7aUJBQ1Y7YUFDSixDQUFDO1FBQ04sQ0FBQyxDQUNKLENBQUM7UUFDTixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUM7SUFDaEMsQ0FBQzs7O1lBakhKLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0luamVjdGFibGV9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7QmVoYXZpb3JTdWJqZWN0LCBjb21iaW5lTGF0ZXN0LCBPYnNlcnZhYmxlfSBmcm9tIFwicnhqc1wiO1xyXG5pbXBvcnQge21hcH0gZnJvbSBcInJ4anMvb3BlcmF0b3JzXCI7XHJcbmltcG9ydCB7SUxhbmd1YWdlU2V0dGluZ3MsIElUcmFuc2xhdGlvbnN9IGZyb20gXCIuLi9jb21tb24tdHlwZXNcIjtcclxuaW1wb3J0IHtTdGF0aWNMYW5ndWFnZVNlcnZpY2V9IGZyb20gXCIuL3N0YXRpYy1sYW5ndWFnZS5zZXJ2aWNlXCI7XHJcblxyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBMYW5ndWFnZVNlcnZpY2UgZXh0ZW5kcyBTdGF0aWNMYW5ndWFnZVNlcnZpY2Uge1xyXG5cclxuICAgIHByb3RlY3RlZCB0cmFuc2xhdGlvblJlcXVlc3RzOiBJVHJhbnNsYXRpb25zO1xyXG4gICAgcHJvdGVjdGVkIHNldHRpbmdzUHJvbWlzZTogUHJvbWlzZTxJTGFuZ3VhZ2VTZXR0aW5ncz47XHJcbiAgICBwcm90ZWN0ZWQgbGFuZ3VhZ2VTZXR0aW5nczogQmVoYXZpb3JTdWJqZWN0PElMYW5ndWFnZVNldHRpbmdzPjtcclxuXHJcbiAgICBnZXQgY3VycmVudExhbmd1YWdlKCk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY3VycmVudExhbmcgfHwgdGhpcy5kZWZhdWx0TGFuZ3VhZ2U7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0IGN1cnJlbnRMYW5ndWFnZShsYW5nOiBzdHJpbmcpIHtcclxuICAgICAgICB0aGlzLnVzZUxhbmd1YWdlKGxhbmcpLnRoZW4oKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmV2ZW50cy5sYW5ndWFnZUNoYW5nZWQuZW1pdChsYW5nKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgc2V0dGluZ3MoKTogSUxhbmd1YWdlU2V0dGluZ3Mge1xyXG4gICAgICAgIGNvbnN0IHNldHRpbmdzID0gdGhpcy5sYW5ndWFnZVNldHRpbmdzLnZhbHVlO1xyXG4gICAgICAgIHJldHVybiAhc2V0dGluZ3MgPyB7fSA6IHNldHRpbmdzLnNldHRpbmdzW3RoaXMuY3VycmVudExhbmd1YWdlXSB8fCB7fTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgJHNldHRpbmdzKCk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICAgICAgdGhpcy5sb2FkU2V0dGluZ3MoKS50aGVuKHMgPT4gdGhpcy5sYW5ndWFnZVNldHRpbmdzLm5leHQocykpO1xyXG4gICAgICAgIHJldHVybiBjb21iaW5lTGF0ZXN0KFt0aGlzLmxhbmd1YWdlU2V0dGluZ3MsIHRoaXMuZXZlbnRzLmxhbmd1YWdlQ2hhbmdlZF0pLnBpcGUobWFwKChbc2V0dGluZ3MsIGxhbmddKSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiAhc2V0dGluZ3MgPyB7fSA6IHNldHRpbmdzLnNldHRpbmdzW2xhbmcgYXMgc3RyaW5nXSB8fCB7fTtcclxuICAgICAgICB9KSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIGluaXRTZXJ2aWNlKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuY2xpZW50LnNldEV4dHJhUmVxdWVzdFBhcmFtKFwibGFuZ3VhZ2VcIiwgXCJkZVwiKTtcclxuICAgICAgICB0aGlzLnRyYW5zbGF0aW9uUmVxdWVzdHMgPSB7fTtcclxuICAgICAgICB0aGlzLmxhbmd1YWdlU2V0dGluZ3MgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PElMYW5ndWFnZVNldHRpbmdzPihudWxsKTtcclxuICAgICAgICBpZiAodGhpcy51bml2ZXJzYWwuaXNTZXJ2ZXIpIHJldHVybjtcclxuICAgICAgICB3aW5kb3dbXCJzZXRMYW5ndWFnZVwiXSA9IChsYW5nOiBzdHJpbmcpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5jdXJyZW50TGFuZ3VhZ2UgPSBsYW5nO1xyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgaW5pdEZyb21TZXR0aW5ncygpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgICAgIGNvbnN0IGRlZmF1bHRMYW5ndWFnZSA9IHRoaXMuZGVmYXVsdExhbmd1YWdlO1xyXG4gICAgICAgIGNvbnN0IHNldHRpbmdzID0gYXdhaXQgdGhpcy5sb2FkU2V0dGluZ3MoKTtcclxuICAgICAgICB0aGlzLmxhbmd1YWdlU2V0dGluZ3MubmV4dChzZXR0aW5ncyk7XHJcbiAgICAgICAgY29uc3QgZGV2TGFuZ3VhZ2VzID0gc2V0dGluZ3MuZGV2TGFuZ3VhZ2VzIHx8IFtdO1xyXG4gICAgICAgIHRoaXMubGFuZ3VhZ2VMaXN0ID0gKHNldHRpbmdzLmxhbmd1YWdlcyB8fCBbXSkuZmlsdGVyKGxhbmcgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gZGV2TGFuZ3VhZ2VzLmluZGV4T2YobGFuZykgPCAwO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGNvbnN0IGxhbmcgPSB0aGlzLmxhbmd1YWdlcy5pbmRleE9mKGRlZmF1bHRMYW5ndWFnZSkgPCAwID8gc2V0dGluZ3MuZGVmYXVsdExhbmd1YWdlIDogZGVmYXVsdExhbmd1YWdlO1xyXG4gICAgICAgIGF3YWl0IHRoaXMudXNlTGFuZ3VhZ2UobGFuZyk7XHJcbiAgICAgICAgdGhpcy5ldmVudHMubGFuZ3VhZ2VDaGFuZ2VkLmVtaXQobGFuZyk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgZ2V0VHJhbnNsYXRpb24oa2V5OiBzdHJpbmcsIHBhcmFtczogYW55ID0gbnVsbCk6IFByb21pc2U8c3RyaW5nPiB7XHJcbiAgICAgICAgaWYgKCFrZXkpIHJldHVybiBcIlwiO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGxvd2VyS2V5ID0ga2V5LnRvTG9jYWxlTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgICAgIGNvbnN0IGRpY3QgPSBhd2FpdCB0aGlzLmxvYWREaWN0aW9uYXJ5KCk7XHJcbiAgICAgICAgICAgIGlmIChsb3dlcktleSBpbiBkaWN0KSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5pbnRlcnBvbGF0ZShkaWN0W2xvd2VyS2V5XSwgcGFyYW1zKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pbnRlcnBvbGF0ZShrZXksIHBhcmFtcyk7XHJcbiAgICAgICAgfSBjYXRjaCAocmVhc29uKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiRVJST1IgSU4gVFJBTlNMQVRJT05TXCIsIHJlYXNvbik7XHJcbiAgICAgICAgICAgIHJldHVybiBrZXk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBhc3luYyB1c2VMYW5ndWFnZShsYW5nOiBzdHJpbmcpOiBQcm9taXNlPElUcmFuc2xhdGlvbnM+IHtcclxuICAgICAgICBsYW5nID0gdGhpcy5sYW5ndWFnZXMuaW5kZXhPZihsYW5nKSA8IDAgPyB0aGlzLmxhbmd1YWdlc1swXSA6IGxhbmc7XHJcbiAgICAgICAgdGhpcy5jbGllbnQuc2V0RXh0cmFSZXF1ZXN0UGFyYW0oXCJsYW5ndWFnZVwiLCBsYW5nKTtcclxuICAgICAgICBpZiAobGFuZyA9PSB0aGlzLmN1cnJlbnRMYW5nKSByZXR1cm4gdGhpcy5kaWN0aW9uYXJ5O1xyXG4gICAgICAgIHRoaXMuc3RvcmFnZS5zZXQoXCJsYW5ndWFnZVwiLCBsYW5nKTtcclxuICAgICAgICB0aGlzLmN1cnJlbnRMYW5nID0gbGFuZztcclxuICAgICAgICBjb25zdCBkaWN0ID0gYXdhaXQgdGhpcy5sb2FkRGljdGlvbmFyeSgpO1xyXG4gICAgICAgIHRoaXMudHJhbnNsYXRpb25zW2xhbmddID0gZGljdDtcclxuICAgICAgICByZXR1cm4gZGljdDtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgbG9hZERpY3Rpb25hcnkoKTogUHJvbWlzZTxhbnk+IHtcclxuICAgICAgICBjb25zdCBsYW5nID0gdGhpcy5jdXJyZW50TGFuZ3VhZ2U7XHJcbiAgICAgICAgdGhpcy50cmFuc2xhdGlvblJlcXVlc3RzW2xhbmddID0gdGhpcy50cmFuc2xhdGlvblJlcXVlc3RzW2xhbmddIHx8IG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmh0dHBDbGllbnQuZ2V0KGAke3RoaXMuY29uZmlnLnRyYW5zbGF0aW9uVXJsfSR7bGFuZ31gKS50b1Byb21pc2UoKS50aGVuKHJlc3BvbnNlID0+IHtcclxuICAgICAgICAgICAgICAgIHJlc3BvbnNlID0gcmVzcG9uc2UgfHwge307XHJcbiAgICAgICAgICAgICAgICByZXNvbHZlKE9iamVjdC5rZXlzKHJlc3BvbnNlKS5yZWR1Y2UoKHJlc3VsdCwga2V5KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0W2tleS50b0xvY2FsZUxvd2VyQ2FzZSgpXSA9IHJlc3BvbnNlW2tleV07XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgICAgICAgICAgIH0sIHt9KSk7XHJcbiAgICAgICAgICAgIH0sICgpID0+IHtcclxuICAgICAgICAgICAgICAgIHJlc29sdmUoe30pO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuICAgICAgICByZXR1cm4gdGhpcy50cmFuc2xhdGlvblJlcXVlc3RzW2xhbmddO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBsb2FkU2V0dGluZ3MoKTogUHJvbWlzZTxJTGFuZ3VhZ2VTZXR0aW5ncz4ge1xyXG4gICAgICAgIHRoaXMuc2V0dGluZ3NQcm9taXNlID0gdGhpcy5zZXR0aW5nc1Byb21pc2UgfHwgdGhpcy5jbGllbnQuZ2V0KGAke3RoaXMuY29uZmlnLnRyYW5zbGF0aW9uVXJsfWxhbmd1YWdlU2V0dGluZ3NgKS50b1Byb21pc2UoKVxyXG4gICAgICAgICAgICAudGhlbihcclxuICAgICAgICAgICAgICAgIChzZXR0aW5nczogSUxhbmd1YWdlU2V0dGluZ3MpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2V0dGluZ3M7XHJcbiAgICAgICAgICAgICAgICB9LCAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGFuZ3VhZ2VzOiBbXCJkZVwiLCBcImVuXCIsIFwiaHVcIl0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRldkxhbmd1YWdlczogW10sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRMYW5ndWFnZTogXCJkZVwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGU6IHt9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaHU6IHt9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kOiB7fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgKTtcclxuICAgICAgICByZXR1cm4gdGhpcy5zZXR0aW5nc1Byb21pc2U7XHJcbiAgICB9XHJcbn1cclxuIl19
@@ -0,0 +1,41 @@
1
+ import { __awaiter } from "tslib";
2
+ import { Inject, Injectable } from "@angular/core";
3
+ import { API_SERVICE } from "../common-types";
4
+ export class OpenApiService {
5
+ constructor(api) {
6
+ this.api = api;
7
+ }
8
+ getSchemas() {
9
+ this.schemasPromise = this.schemasPromise || new Promise((resolve => {
10
+ this.api.get("api-docs").then(res => {
11
+ var _a;
12
+ const schemas = ((_a = res.components) === null || _a === void 0 ? void 0 : _a.schemas) || res.definitions || {};
13
+ Object.values(schemas).forEach(schema => {
14
+ Object.keys(schema.properties || {}).forEach(p => {
15
+ schema.properties[p].id = p;
16
+ });
17
+ });
18
+ resolve(schemas);
19
+ }, () => {
20
+ resolve({});
21
+ });
22
+ }));
23
+ return this.schemasPromise;
24
+ }
25
+ getSchema(name) {
26
+ return __awaiter(this, void 0, void 0, function* () {
27
+ const schemas = yield this.getSchemas();
28
+ const schema = schemas[name];
29
+ if (!schema)
30
+ return null;
31
+ return schemas[name];
32
+ });
33
+ }
34
+ }
35
+ OpenApiService.decorators = [
36
+ { type: Injectable }
37
+ ];
38
+ OpenApiService.ctorParameters = () => [
39
+ { type: undefined, decorators: [{ type: Inject, args: [API_SERVICE,] }] }
40
+ ];
41
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3Blbi1hcGkuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9uZ3gtdXRpbHMvc2VydmljZXMvb3Blbi1hcGkuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFDLE1BQU0sRUFBRSxVQUFVLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDakQsT0FBTyxFQUFDLFdBQVcsRUFBK0MsTUFBTSxpQkFBaUIsQ0FBQztBQUcxRixNQUFNLE9BQU8sY0FBYztJQUl2QixZQUEwQyxHQUFnQjtRQUFoQixRQUFHLEdBQUgsR0FBRyxDQUFhO0lBRTFELENBQUM7SUFFRCxVQUFVO1FBQ04sSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsY0FBYyxJQUFJLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUU7WUFDaEUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFOztnQkFDaEMsTUFBTSxPQUFPLEdBQW9CLENBQUEsTUFBQSxHQUFHLENBQUMsVUFBVSwwQ0FBRSxPQUFPLEtBQUksR0FBRyxDQUFDLFdBQVcsSUFBSSxFQUFFLENBQUM7Z0JBQ2xGLE1BQU0sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFO29CQUNwQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLElBQUksRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFO3dCQUM3QyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7b0JBQ2hDLENBQUMsQ0FBQyxDQUFDO2dCQUNQLENBQUMsQ0FBQyxDQUFDO2dCQUNILE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNyQixDQUFDLEVBQUUsR0FBRyxFQUFFO2dCQUNKLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNoQixDQUFDLENBQUMsQ0FBQztRQUNQLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDSixPQUFPLElBQUksQ0FBQyxjQUFjLENBQUM7SUFDL0IsQ0FBQztJQUVLLFNBQVMsQ0FBQyxJQUFZOztZQUN4QixNQUFNLE9BQU8sR0FBRyxNQUFNLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUN4QyxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDN0IsSUFBSSxDQUFDLE1BQU07Z0JBQUUsT0FBTyxJQUFJLENBQUM7WUFDekIsT0FBTyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDekIsQ0FBQztLQUFBOzs7WUEvQkosVUFBVTs7OzRDQUtNLE1BQU0sU0FBQyxXQUFXIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtJbmplY3QsIEluamVjdGFibGV9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7QVBJX1NFUlZJQ0UsIElBcGlTZXJ2aWNlLCBJT3BlbkFwaVNjaGVtYSwgSU9wZW5BcGlTY2hlbWFzfSBmcm9tIFwiLi4vY29tbW9uLXR5cGVzXCI7XHJcblxyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBPcGVuQXBpU2VydmljZSB7XHJcblxyXG4gICAgcHJpdmF0ZSBzY2hlbWFzUHJvbWlzZTogUHJvbWlzZTxJT3BlbkFwaVNjaGVtYXM+O1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKEBJbmplY3QoQVBJX1NFUlZJQ0UpIHJlYWRvbmx5IGFwaTogSUFwaVNlcnZpY2UpIHtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgZ2V0U2NoZW1hcygpOiBQcm9taXNlPElPcGVuQXBpU2NoZW1hcz4ge1xyXG4gICAgICAgIHRoaXMuc2NoZW1hc1Byb21pc2UgPSB0aGlzLnNjaGVtYXNQcm9taXNlIHx8IG5ldyBQcm9taXNlKChyZXNvbHZlID0+IHtcclxuICAgICAgICAgICAgdGhpcy5hcGkuZ2V0KFwiYXBpLWRvY3NcIikudGhlbihyZXMgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgc2NoZW1hczogSU9wZW5BcGlTY2hlbWFzID0gcmVzLmNvbXBvbmVudHM/LnNjaGVtYXMgfHwgcmVzLmRlZmluaXRpb25zIHx8IHt9O1xyXG4gICAgICAgICAgICAgICAgT2JqZWN0LnZhbHVlcyhzY2hlbWFzKS5mb3JFYWNoKHNjaGVtYSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmtleXMoc2NoZW1hLnByb3BlcnRpZXMgfHwge30pLmZvckVhY2gocCA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVtYS5wcm9wZXJ0aWVzW3BdLmlkID0gcDtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgcmVzb2x2ZShzY2hlbWFzKTtcclxuICAgICAgICAgICAgfSwgKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmVzb2x2ZSh7fSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pKTtcclxuICAgICAgICByZXR1cm4gdGhpcy5zY2hlbWFzUHJvbWlzZTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBnZXRTY2hlbWEobmFtZTogc3RyaW5nKTogUHJvbWlzZTxJT3BlbkFwaVNjaGVtYT4ge1xyXG4gICAgICAgIGNvbnN0IHNjaGVtYXMgPSBhd2FpdCB0aGlzLmdldFNjaGVtYXMoKTtcclxuICAgICAgICBjb25zdCBzY2hlbWEgPSBzY2hlbWFzW25hbWVdO1xyXG4gICAgICAgIGlmICghc2NoZW1hKSByZXR1cm4gbnVsbDtcclxuICAgICAgICByZXR1cm4gc2NoZW1hc1tuYW1lXTtcclxuICAgIH1cclxufVxyXG4iXX0=
@@ -0,0 +1,52 @@
1
+ import { EventEmitter, Inject, Injectable, NgZone } from "@angular/core";
2
+ export class PromiseService {
3
+ constructor(zone) {
4
+ this.zone = zone;
5
+ this.promiseCount = 0;
6
+ this.promiseChanged = new EventEmitter();
7
+ }
8
+ get count() {
9
+ return this.promiseCount;
10
+ }
11
+ get onChanged() {
12
+ return this.promiseChanged;
13
+ }
14
+ create(executor) {
15
+ return this.add(this.zone.runOutsideAngular(() => new Promise(executor)));
16
+ }
17
+ all(promises) {
18
+ return this.add(this.zone.runOutsideAngular(() => Promise.all(promises)));
19
+ }
20
+ resolve(value) {
21
+ return this.add(this.zone.runOutsideAngular(() => Promise.resolve(value)));
22
+ }
23
+ reject(value) {
24
+ return this.add(this.zone.runOutsideAngular(() => Promise.reject(value)));
25
+ }
26
+ promiseFinished() {
27
+ if (this.promiseCount == 0)
28
+ return;
29
+ this.promiseCount--;
30
+ this.promiseChanged.emit(this.promiseCount);
31
+ }
32
+ add(promise) {
33
+ this.promiseCount++;
34
+ this.promiseChanged.emit(this.promiseCount);
35
+ return new Promise((resolve, reject) => {
36
+ promise.then(v => {
37
+ resolve(v);
38
+ this.promiseFinished();
39
+ }, r => {
40
+ reject(r);
41
+ this.promiseFinished();
42
+ });
43
+ });
44
+ }
45
+ }
46
+ PromiseService.decorators = [
47
+ { type: Injectable }
48
+ ];
49
+ PromiseService.ctorParameters = () => [
50
+ { type: NgZone, decorators: [{ type: Inject, args: [NgZone,] }] }
51
+ ];
52
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvbWlzZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL25neC11dGlscy9zZXJ2aWNlcy9wcm9taXNlLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFlBQVksRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUl2RSxNQUFNLE9BQU8sY0FBYztJQWF2QixZQUFxQyxJQUFZO1FBQVosU0FBSSxHQUFKLElBQUksQ0FBUTtRQUM3QyxJQUFJLENBQUMsWUFBWSxHQUFHLENBQUMsQ0FBQztRQUN0QixJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksWUFBWSxFQUFVLENBQUM7SUFDckQsQ0FBQztJQWRELElBQUksS0FBSztRQUNMLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQztJQUM3QixDQUFDO0lBRUQsSUFBSSxTQUFTO1FBQ1QsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDO0lBQy9CLENBQUM7SUFVRCxNQUFNLENBQUksUUFBaUc7UUFDdkcsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxPQUFPLENBQUksUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2pGLENBQUM7SUFFRCxHQUFHLENBQUMsUUFBd0I7UUFDeEIsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDOUUsQ0FBQztJQUVELE9BQU8sQ0FBSSxLQUF5QjtRQUNoQyxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMvRSxDQUFDO0lBRUQsTUFBTSxDQUFJLEtBQXlCO1FBQy9CLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzlFLENBQUM7SUFFUyxlQUFlO1FBQ3JCLElBQUksSUFBSSxDQUFDLFlBQVksSUFBSSxDQUFDO1lBQUUsT0FBTztRQUNuQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDcEIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQ2hELENBQUM7SUFFUyxHQUFHLENBQUksT0FBbUI7UUFDaEMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ3BCLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUM1QyxPQUFPLElBQUksT0FBTyxDQUFNLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO1lBQ3hDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUU7Z0JBQ2IsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNYLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUMzQixDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUU7Z0JBQ0gsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNWLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUMzQixDQUFDLENBQUMsQ0FBQztRQUNQLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQzs7O1lBckRKLFVBQVU7OztZQUgrQixNQUFNLHVCQWlCL0IsTUFBTSxTQUFDLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0V2ZW50RW1pdHRlciwgSW5qZWN0LCBJbmplY3RhYmxlLCBOZ1pvbmV9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7SVByb21pc2VTZXJ2aWNlfSBmcm9tIFwiLi4vY29tbW9uLXR5cGVzXCI7XHJcblxyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBQcm9taXNlU2VydmljZSBpbXBsZW1lbnRzIElQcm9taXNlU2VydmljZSB7XHJcblxyXG4gICAgZ2V0IGNvdW50KCk6IG51bWJlciB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucHJvbWlzZUNvdW50O1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBvbkNoYW5nZWQoKTogRXZlbnRFbWl0dGVyPG51bWJlcj4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnByb21pc2VDaGFuZ2VkO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBwcm9taXNlQ291bnQ6IG51bWJlcjtcclxuICAgIHByb3RlY3RlZCByZWFkb25seSBwcm9taXNlQ2hhbmdlZDogRXZlbnRFbWl0dGVyPG51bWJlcj47XHJcblxyXG4gICAgY29uc3RydWN0b3IoQEluamVjdChOZ1pvbmUpIHJlYWRvbmx5IHpvbmU6IE5nWm9uZSkge1xyXG4gICAgICAgIHRoaXMucHJvbWlzZUNvdW50ID0gMDtcclxuICAgICAgICB0aGlzLnByb21pc2VDaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XHJcbiAgICB9XHJcblxyXG4gICAgY3JlYXRlPFQ+KGV4ZWN1dG9yOiAocmVzb2x2ZTogKHZhbHVlPzogVCB8IFByb21pc2VMaWtlPFQ+KSA9PiB2b2lkLCByZWplY3Q6IChyZWFzb24/OiBhbnkpID0+IHZvaWQpID0+IHZvaWQpOiBQcm9taXNlPFQ+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5hZGQodGhpcy56b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IG5ldyBQcm9taXNlPFQ+KGV4ZWN1dG9yKSkpO1xyXG4gICAgfVxyXG5cclxuICAgIGFsbChwcm9taXNlczogUHJvbWlzZTxhbnk+W10pOiBQcm9taXNlPGFueT4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmFkZCh0aGlzLnpvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4gUHJvbWlzZS5hbGwocHJvbWlzZXMpKSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVzb2x2ZTxUPih2YWx1ZTogVCB8IFByb21pc2VMaWtlPFQ+KTogUHJvbWlzZTxUPiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuYWRkKHRoaXMuem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiBQcm9taXNlLnJlc29sdmUodmFsdWUpKSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVqZWN0PFQ+KHZhbHVlOiBUIHwgUHJvbWlzZUxpa2U8VD4pOiBQcm9taXNlPFQ+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5hZGQodGhpcy56b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IFByb21pc2UucmVqZWN0KHZhbHVlKSkpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBwcm9taXNlRmluaXNoZWQoKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMucHJvbWlzZUNvdW50ID09IDApIHJldHVybjtcclxuICAgICAgICB0aGlzLnByb21pc2VDb3VudC0tO1xyXG4gICAgICAgIHRoaXMucHJvbWlzZUNoYW5nZWQuZW1pdCh0aGlzLnByb21pc2VDb3VudCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIGFkZDxUPihwcm9taXNlOiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUPiB7XHJcbiAgICAgICAgdGhpcy5wcm9taXNlQ291bnQrKztcclxuICAgICAgICB0aGlzLnByb21pc2VDaGFuZ2VkLmVtaXQodGhpcy5wcm9taXNlQ291bnQpO1xyXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZTxhbnk+KChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICAgICAgcHJvbWlzZS50aGVuKHYgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmVzb2x2ZSh2KTtcclxuICAgICAgICAgICAgICAgIHRoaXMucHJvbWlzZUZpbmlzaGVkKCk7XHJcbiAgICAgICAgICAgIH0sIHIgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmVqZWN0KHIpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5wcm9taXNlRmluaXNoZWQoKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbn1cclxuIl19