@acorex/core 6.0.1 → 6.0.2

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 (169) hide show
  1. package/config/index.d.ts +5 -0
  2. package/config/public-api.d.ts +1 -0
  3. package/config/src/configs.d.ts +9 -0
  4. package/dateTime/index.d.ts +5 -0
  5. package/dateTime/{public-api.ts → public-api.d.ts} +1 -1
  6. package/dateTime/src/datetime.class.d.ts +100 -0
  7. package/dateTime/src/datetime.module.d.ts +8 -0
  8. package/dateTime/src/datetime.pipe.d.ts +8 -0
  9. package/dateTime/src/georgian.calendar.d.ts +20 -0
  10. package/dateTime/src/jalali.calendar.d.ts +35 -0
  11. package/esm2020/acorex-core.mjs +5 -0
  12. package/esm2020/config/acorex-core-config.mjs +5 -0
  13. package/esm2020/config/public-api.mjs +2 -0
  14. package/esm2020/config/src/configs.mjs +32 -0
  15. package/esm2020/dateTime/acorex-core-dateTime.mjs +5 -0
  16. package/esm2020/dateTime/public-api.mjs +6 -0
  17. package/esm2020/dateTime/src/datetime.class.mjs +295 -0
  18. package/esm2020/dateTime/src/datetime.module.mjs +33 -0
  19. package/esm2020/dateTime/src/datetime.pipe.mjs +26 -0
  20. package/esm2020/dateTime/src/georgian.calendar.mjs +189 -0
  21. package/esm2020/dateTime/src/jalali.calendar.mjs +359 -0
  22. package/esm2020/events/acorex-core-events.mjs +5 -0
  23. package/esm2020/events/public-api.mjs +2 -0
  24. package/esm2020/events/src/event.service.mjs +36 -0
  25. package/esm2020/http/acorex-core-http.mjs +5 -0
  26. package/esm2020/http/public-api.mjs +6 -0
  27. package/esm2020/http/src/http-error.class.mjs +2 -0
  28. package/esm2020/http/src/http-events.interceptor.mjs +3 -0
  29. package/esm2020/http/src/http-request.class.mjs +2 -0
  30. package/esm2020/http/src/http-result.class.mjs +21 -0
  31. package/esm2020/http/src/http.module.mjs +29 -0
  32. package/esm2020/http/src/http.service.mjs +147 -0
  33. package/esm2020/pipes/acorex-core-pipes.mjs +5 -0
  34. package/esm2020/pipes/public-api.mjs +3 -0
  35. package/esm2020/pipes/src/pipes.module.mjs +19 -0
  36. package/esm2020/pipes/src/safe.pipe.mjs +30 -0
  37. package/esm2020/platform/acorex-core-platform.mjs +5 -0
  38. package/esm2020/platform/public-api.mjs +2 -0
  39. package/esm2020/platform/src/platform.service.mjs +141 -0
  40. package/esm2020/public-api.mjs +5 -0
  41. package/esm2020/translation/acorex-core-translation.mjs +5 -0
  42. package/esm2020/translation/public-api.mjs +4 -0
  43. package/esm2020/translation/src/translation.module.mjs +18 -0
  44. package/esm2020/translation/src/translator.mjs +43 -0
  45. package/esm2020/translation/src/translator.pipe.mjs +15 -0
  46. package/esm2020/utils/acorex-core-utils.mjs +5 -0
  47. package/esm2020/utils/public-api.mjs +5 -0
  48. package/esm2020/utils/src/color-util.mjs +71 -0
  49. package/esm2020/utils/src/drawing-util.mjs +27 -0
  50. package/esm2020/utils/src/object-util.mjs +39 -0
  51. package/esm2020/utils/src/string-util.mjs +19 -0
  52. package/events/index.d.ts +5 -0
  53. package/events/public-api.d.ts +1 -0
  54. package/events/src/event.service.d.ts +9 -0
  55. package/fesm2015/acorex-core-config.mjs +39 -0
  56. package/fesm2015/acorex-core-config.mjs.map +1 -0
  57. package/fesm2015/acorex-core-dateTime.mjs +899 -0
  58. package/fesm2015/acorex-core-dateTime.mjs.map +1 -0
  59. package/fesm2015/acorex-core-events.mjs +43 -0
  60. package/fesm2015/acorex-core-events.mjs.map +1 -0
  61. package/fesm2015/acorex-core-http.mjs +201 -0
  62. package/fesm2015/acorex-core-http.mjs.map +1 -0
  63. package/fesm2015/acorex-core-pipes.mjs +53 -0
  64. package/fesm2015/acorex-core-pipes.mjs.map +1 -0
  65. package/fesm2015/acorex-core-platform.mjs +148 -0
  66. package/fesm2015/acorex-core-platform.mjs.map +1 -0
  67. package/fesm2015/acorex-core-translation.mjs +80 -0
  68. package/fesm2015/acorex-core-translation.mjs.map +1 -0
  69. package/fesm2015/acorex-core-utils.mjs +163 -0
  70. package/fesm2015/acorex-core-utils.mjs.map +1 -0
  71. package/fesm2015/acorex-core.mjs +11 -0
  72. package/fesm2015/acorex-core.mjs.map +1 -0
  73. package/fesm2020/acorex-core-config.mjs +39 -0
  74. package/fesm2020/acorex-core-config.mjs.map +1 -0
  75. package/fesm2020/acorex-core-dateTime.mjs +899 -0
  76. package/fesm2020/acorex-core-dateTime.mjs.map +1 -0
  77. package/fesm2020/acorex-core-events.mjs +43 -0
  78. package/fesm2020/acorex-core-events.mjs.map +1 -0
  79. package/fesm2020/acorex-core-http.mjs +200 -0
  80. package/fesm2020/acorex-core-http.mjs.map +1 -0
  81. package/fesm2020/acorex-core-pipes.mjs +53 -0
  82. package/fesm2020/acorex-core-pipes.mjs.map +1 -0
  83. package/fesm2020/acorex-core-platform.mjs +148 -0
  84. package/fesm2020/acorex-core-platform.mjs.map +1 -0
  85. package/fesm2020/acorex-core-translation.mjs +79 -0
  86. package/fesm2020/acorex-core-translation.mjs.map +1 -0
  87. package/fesm2020/acorex-core-utils.mjs +163 -0
  88. package/fesm2020/acorex-core-utils.mjs.map +1 -0
  89. package/fesm2020/acorex-core.mjs +11 -0
  90. package/fesm2020/acorex-core.mjs.map +1 -0
  91. package/http/index.d.ts +5 -0
  92. package/http/{public-api.ts → public-api.d.ts} +1 -1
  93. package/http/src/{http-error.class.ts → http-error.class.d.ts} +2 -2
  94. package/http/src/{http-events.interceptor.ts → http-events.interceptor.d.ts} +3 -7
  95. package/http/src/{http-request.class.ts → http-request.class.d.ts} +5 -5
  96. package/http/src/http-result.class.d.ts +11 -0
  97. package/http/src/http.module.d.ts +8 -0
  98. package/http/src/http.service.d.ts +23 -0
  99. package/index.d.ts +5 -0
  100. package/package.json +106 -23
  101. package/pipes/index.d.ts +5 -0
  102. package/pipes/public-api.d.ts +2 -0
  103. package/pipes/src/pipes.module.d.ts +8 -0
  104. package/pipes/src/safe.pipe.d.ts +10 -0
  105. package/platform/index.d.ts +5 -0
  106. package/platform/public-api.d.ts +1 -0
  107. package/platform/src/platform.service.d.ts +25 -0
  108. package/public-api.d.ts +1 -0
  109. package/translation/index.d.ts +5 -0
  110. package/translation/{public-api.ts → public-api.d.ts} +1 -1
  111. package/translation/src/translation.module.d.ts +7 -0
  112. package/translation/src/translator.d.ts +11 -0
  113. package/translation/src/translator.pipe.d.ts +7 -0
  114. package/utils/index.d.ts +5 -0
  115. package/utils/{public-api.ts → public-api.d.ts} +1 -1
  116. package/utils/src/color-util.d.ts +20 -0
  117. package/utils/src/drawing-util.d.ts +17 -0
  118. package/utils/src/object-util.d.ts +4 -0
  119. package/utils/src/string-util.d.ts +6 -0
  120. package/.browserslistrc +0 -16
  121. package/config/ax-preset.js +0 -186
  122. package/config/index.ts +0 -1
  123. package/config/ng-package.json +0 -6
  124. package/config/public-api.ts +0 -1
  125. package/config/src/configs.ts +0 -37
  126. package/dateTime/index.ts +0 -1
  127. package/dateTime/ng-package.json +0 -6
  128. package/dateTime/src/datetime.class.ts +0 -452
  129. package/dateTime/src/datetime.module.ts +0 -29
  130. package/dateTime/src/datetime.pipe.ts +0 -21
  131. package/dateTime/src/georgian.calendar.ts +0 -205
  132. package/dateTime/src/jalali.calendar.ts +0 -416
  133. package/events/index.ts +0 -1
  134. package/events/ng-package.json +0 -6
  135. package/events/public-api.ts +0 -1
  136. package/events/src/event.service.ts +0 -31
  137. package/http/index.ts +0 -1
  138. package/http/ng-package.json +0 -6
  139. package/http/src/http-result.class.ts +0 -34
  140. package/http/src/http.module.ts +0 -25
  141. package/http/src/http.service.ts +0 -161
  142. package/index.ts +0 -1
  143. package/karma.conf.js +0 -44
  144. package/ng-package.json +0 -7
  145. package/pipes/index.ts +0 -1
  146. package/pipes/ng-package.json +0 -6
  147. package/pipes/public-api.ts +0 -2
  148. package/pipes/src/pipes.module.ts +0 -11
  149. package/pipes/src/safe.pipe.ts +0 -24
  150. package/platform/index.ts +0 -1
  151. package/platform/ng-package.json +0 -6
  152. package/platform/public-api.ts +0 -1
  153. package/platform/src/platform.service.ts +0 -207
  154. package/public-api.ts +0 -4
  155. package/test.ts +0 -27
  156. package/translation/index.ts +0 -1
  157. package/translation/ng-package.json +0 -6
  158. package/translation/src/translation.module.ts +0 -12
  159. package/translation/src/translator.pipe.ts +0 -9
  160. package/translation/src/translator.ts +0 -49
  161. package/tsconfig.lib.json +0 -15
  162. package/tsconfig.lib.prod.json +0 -10
  163. package/tsconfig.spec.json +0 -17
  164. package/utils/index.ts +0 -1
  165. package/utils/ng-package.json +0 -6
  166. package/utils/src/color-util.ts +0 -83
  167. package/utils/src/drawing-util.ts +0 -43
  168. package/utils/src/object-util.ts +0 -82
  169. package/utils/src/string-util.ts +0 -25
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ /// <amd-module name="@acorex/core/config" />
5
+ export * from './public-api';
@@ -0,0 +1 @@
1
+ export * from './src/configs';
@@ -0,0 +1,9 @@
1
+ import { Observable } from 'rxjs';
2
+ export declare class AXConfig {
3
+ private static dataModel;
4
+ private static dataChangeSubject;
5
+ static get onChange(): Observable<any>;
6
+ static set(config: any): any;
7
+ static set(path: string, value?: any): void;
8
+ static get(path: string, defaultValue?: any): any;
9
+ }
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ /// <amd-module name="@acorex/core/dateTime" />
5
+ export * from './public-api';
@@ -2,4 +2,4 @@ export * from './src/datetime.class';
2
2
  export * from './src/datetime.module';
3
3
  export * from './src/datetime.pipe';
4
4
  export * from './src/georgian.calendar';
5
- export * from './src/jalali.calendar';
5
+ export * from './src/jalali.calendar';
@@ -0,0 +1,100 @@
1
+ export declare type TimeUnit = 'ms' | 'second' | 'minute' | 'hour' | 'day' | 'month' | 'year' | 'week';
2
+ export interface AXDateValue {
3
+ year: number;
4
+ month: number;
5
+ date: number;
6
+ hours?: number;
7
+ minutes?: number;
8
+ seconds?: number;
9
+ ms?: number;
10
+ calendar: string;
11
+ }
12
+ export interface AXCalendar {
13
+ monthNames: string[];
14
+ monthShortNames: string[];
15
+ dayNames: string[];
16
+ dayShortNames: string[];
17
+ name(): string;
18
+ dayOfMonth(date: Date): number;
19
+ dayOfYear(date: Date): number;
20
+ dayOfWeek(date: Date): number;
21
+ monthOfYear(date: Date): number;
22
+ weekOfYear(date: Date): number;
23
+ year(date: Date): number;
24
+ add(date: Date, unit: TimeUnit, amount: number): AXDateTime;
25
+ set(date: Date, unit: TimeUnit, value: number): AXDateTime;
26
+ startOf(date: Date, unit: TimeUnit): AXDateTime;
27
+ endOf(date: Date, unit: TimeUnit): AXDateTime;
28
+ create(value: AXDateValue): AXDateTime;
29
+ }
30
+ export declare class AXDateTime {
31
+ static convert(value: Date | AXDateTime | string, calendar?: string): AXDateTime;
32
+ static from(value?: AXDateValue): AXDateTime;
33
+ static resolveCalendar(calendar: string | AXCalendar): AXCalendar;
34
+ private _date;
35
+ get date(): Date;
36
+ private _calendar;
37
+ get calendar(): AXCalendar;
38
+ constructor(value?: Date | string, calendar?: string | AXCalendar);
39
+ clone(): AXDateTime;
40
+ get dayOfMonth(): number;
41
+ get dayOfYear(): number;
42
+ get dayOfWeek(): number;
43
+ get hour(): number;
44
+ get minute(): number;
45
+ get second(): number;
46
+ get year(): number;
47
+ get monthOfYear(): number;
48
+ get weekOfYear(): number;
49
+ get month(): AXCalendarMonth;
50
+ add(unit: TimeUnit, amount: number): AXDateTime;
51
+ set(unit: TimeUnit, value: number): AXDateTime;
52
+ duration(end: Date | AXDateTime, unit?: TimeUnit): AXTimeSpan;
53
+ startOf(unit?: TimeUnit): AXDateTime;
54
+ endOf(unit?: TimeUnit): AXDateTime;
55
+ private _formatKeys;
56
+ format(format?: string): string;
57
+ private pad;
58
+ toString(format?: string): string;
59
+ equal(value: Date | AXDateTime, unit?: TimeUnit): boolean;
60
+ compare(value: Date | AXDateTime, unit?: TimeUnit): number;
61
+ convert(calendar: string): AXDateTime;
62
+ }
63
+ export declare class AXCalendarMonth {
64
+ private _range;
65
+ get range(): AXDateTimeRange;
66
+ set range(v: AXDateTimeRange);
67
+ constructor(date: AXDateTime);
68
+ private readonly index;
69
+ private readonly name;
70
+ }
71
+ export interface AXTimeSpanTotal {
72
+ miliseconds: number;
73
+ seconds: number;
74
+ minutes: number;
75
+ hours: number;
76
+ days: number;
77
+ weeks: number;
78
+ months: number;
79
+ years: number;
80
+ }
81
+ export interface AXTimeSpan {
82
+ miliseconds: number;
83
+ seconds: number;
84
+ minutes: number;
85
+ hours: number;
86
+ days: number;
87
+ months: number;
88
+ years: number;
89
+ total: AXTimeSpanTotal;
90
+ }
91
+ export declare class AXDateTimeRange {
92
+ private _startTime;
93
+ private _endTime;
94
+ get startTime(): AXDateTime;
95
+ get endTime(): AXDateTime;
96
+ constructor(startTime: AXDateTime, endTime: AXDateTime);
97
+ duration(): AXTimeSpan;
98
+ enumurate(unit?: TimeUnit, amount?: number): AXDateTime[];
99
+ includes(value: AXDateTime, unit?: TimeUnit): boolean;
100
+ }
@@ -0,0 +1,8 @@
1
+ import * as i0 from "@angular/core";
2
+ import * as i1 from "./datetime.pipe";
3
+ export declare class AXDateTimeModule {
4
+ constructor();
5
+ static ɵfac: i0.ɵɵFactoryDeclaration<AXDateTimeModule, never>;
6
+ static ɵmod: i0.ɵɵNgModuleDeclaration<AXDateTimeModule, [typeof i1.AXDateTimePipe], never, [typeof i1.AXDateTimePipe]>;
7
+ static ɵinj: i0.ɵɵInjectorDeclaration<AXDateTimeModule>;
8
+ }
@@ -0,0 +1,8 @@
1
+ import { PipeTransform } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ export declare class AXDateTimePipe implements PipeTransform {
4
+ constructor();
5
+ transform(value: any, format?: string, calendar?: string): string;
6
+ static ɵfac: i0.ɵɵFactoryDeclaration<AXDateTimePipe, never>;
7
+ static ɵpipe: i0.ɵɵPipeDeclaration<AXDateTimePipe, "axDate", false>;
8
+ }
@@ -0,0 +1,20 @@
1
+ import { AXCalendar, AXDateTime, AXDateValue, TimeUnit } from "./datetime.class";
2
+ export declare class GeorgianCalendar implements AXCalendar {
3
+ monthNames: string[];
4
+ monthShortNames: string[];
5
+ dayNames: string[];
6
+ dayShortNames: string[];
7
+ create(value: AXDateValue): AXDateTime;
8
+ name(): string;
9
+ dayOfMonth(date: Date): number;
10
+ dayOfYear(date: Date): number;
11
+ dayOfWeek(date: Date): number;
12
+ weekOfYear(date: Date): number;
13
+ year(date: Date): number;
14
+ monthOfYear(date: Date): number;
15
+ add(date: Date, unit: TimeUnit, amount: number): AXDateTime;
16
+ set(date: Date, unit: TimeUnit, value: number): AXDateTime;
17
+ startOf(date: Date, unit: TimeUnit): AXDateTime;
18
+ endOf(date: Date, unit: TimeUnit): AXDateTime;
19
+ isLeap(date: Date): boolean;
20
+ }
@@ -0,0 +1,35 @@
1
+ import { AXCalendar, AXDateTime, AXDateValue, TimeUnit } from "./datetime.class";
2
+ export declare class JalaliCalendar implements AXCalendar {
3
+ monthNames: string[];
4
+ monthShortNames: string[];
5
+ dayNames: string[];
6
+ dayShortNames: string[];
7
+ create(value: AXDateValue): AXDateTime;
8
+ name(): string;
9
+ dayOfMonth(date: Date): number;
10
+ dayOfYear(date: Date): number;
11
+ dayOfWeek(date: Date): number;
12
+ weekOfYear(date: Date): number;
13
+ year(date: Date): number;
14
+ monthOfYear(date: Date): number;
15
+ add(date: Date, unit: TimeUnit, amount: number): AXDateTime;
16
+ set(date: Date, unit: TimeUnit, value: number): AXDateTime;
17
+ startOf(date: Date, unit: TimeUnit): AXDateTime;
18
+ endOf(date: Date, unit: TimeUnit): AXDateTime;
19
+ toJalali(date: Date): {
20
+ year: number;
21
+ month: number;
22
+ day: number;
23
+ };
24
+ toGregorian(jy: any, jm: any, jd: any): Date;
25
+ isValid(jy: any, jm: any, jd: any): boolean;
26
+ isLeapYear(jy: any): boolean;
27
+ monthLength(jy: any, jm: any): 31 | 30 | 29;
28
+ private jalCal;
29
+ private j2d;
30
+ private d2j;
31
+ private g2d;
32
+ private d2g;
33
+ private div;
34
+ private mod;
35
+ }
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ export * from './public-api';
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWNvcmV4LWNvcmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9hY29yZXgvY29yZS9hY29yZXgtY29yZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILGNBQWMsY0FBYyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBHZW5lcmF0ZWQgYnVuZGxlIGluZGV4LiBEbyBub3QgZWRpdC5cbiAqL1xuXG5leHBvcnQgKiBmcm9tICcuL3B1YmxpYy1hcGknO1xuIl19
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ export * from './public-api';
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWNvcmV4LWNvcmUtY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYWNvcmV4L2NvcmUvY29uZmlnL2Fjb3JleC1jb3JlLWNvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILGNBQWMsY0FBYyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBHZW5lcmF0ZWQgYnVuZGxlIGluZGV4LiBEbyBub3QgZWRpdC5cbiAqL1xuXG5leHBvcnQgKiBmcm9tICcuL3B1YmxpYy1hcGknO1xuIl19
@@ -0,0 +1,2 @@
1
+ export * from './src/configs';
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Fjb3JleC9jb3JlL2NvbmZpZy9wdWJsaWMtYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsZUFBZSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9zcmMvY29uZmlncyc7Il19
@@ -0,0 +1,32 @@
1
+ import { get, set, merge } from 'lodash-es';
2
+ import { Subject } from 'rxjs';
3
+ // @dynamic
4
+ export class AXConfig {
5
+ static get onChange() {
6
+ return AXConfig.dataChangeSubject.asObservable();
7
+ }
8
+ static set(arg1, arg2) {
9
+ if (arg1 && typeof arg1 == 'string') {
10
+ set(AXConfig.dataModel, arg1, arg2);
11
+ AXConfig.dataChangeSubject.next(AXConfig.dataModel);
12
+ return true;
13
+ }
14
+ if (arg1 && typeof arg1 == 'object') {
15
+ merge(AXConfig.dataModel, arg1);
16
+ AXConfig.dataChangeSubject.next(AXConfig.dataModel);
17
+ return true;
18
+ }
19
+ if (!arg1 && !arg2) {
20
+ return AXConfig.dataChangeSubject.asObservable();
21
+ }
22
+ // TODO: Arash please check 'Not all code paths return a value.'.
23
+ // if remove return you can see error on line 15.
24
+ return '';
25
+ }
26
+ static get(path, defaultValue) {
27
+ return get(AXConfig.dataModel, path, defaultValue);
28
+ }
29
+ }
30
+ AXConfig.dataModel = {};
31
+ AXConfig.dataChangeSubject = new Subject();
32
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlncy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Fjb3JleC9jb3JlL2NvbmZpZy9zcmMvY29uZmlncy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDNUMsT0FBTyxFQUFFLE9BQU8sRUFBYyxNQUFNLE1BQU0sQ0FBQztBQUUzQyxXQUFXO0FBQ1gsTUFBTSxPQUFPLFFBQVE7SUFJbkIsTUFBTSxLQUFLLFFBQVE7UUFDakIsT0FBTyxRQUFRLENBQUMsaUJBQWlCLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDbkQsQ0FBQztJQUlELE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBVSxFQUFFLElBQVU7UUFDL0IsSUFBSSxJQUFJLElBQUksT0FBTyxJQUFJLElBQUksUUFBUSxFQUFFO1lBQ25DLEdBQUcsQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztZQUNwQyxRQUFRLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUNwRCxPQUFPLElBQUksQ0FBQztTQUNiO1FBQ0QsSUFBSSxJQUFJLElBQUksT0FBTyxJQUFJLElBQUksUUFBUSxFQUFFO1lBQ25DLEtBQUssQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ2hDLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ3BELE9BQU8sSUFBSSxDQUFDO1NBQ2I7UUFDRCxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFO1lBQ2xCLE9BQU8sUUFBUSxDQUFDLGlCQUFpQixDQUFDLFlBQVksRUFBRSxDQUFDO1NBQ2xEO1FBQ0QsaUVBQWlFO1FBQ2pFLGlEQUFpRDtRQUNqRCxPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUM7SUFFRCxNQUFNLENBQUMsR0FBRyxDQUFDLElBQVksRUFBRSxZQUFrQjtRQUN6QyxPQUFPLEdBQUcsQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFLElBQUksRUFBRSxZQUFZLENBQUMsQ0FBQztJQUNyRCxDQUFDOztBQTlCYyxrQkFBUyxHQUFRLEVBQUUsQ0FBQztBQUNwQiwwQkFBaUIsR0FBRyxJQUFJLE9BQU8sRUFBTyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZ2V0LCBzZXQsIG1lcmdlIH0gZnJvbSAnbG9kYXNoLWVzJztcclxuaW1wb3J0IHsgU3ViamVjdCwgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xyXG5cclxuLy8gQGR5bmFtaWNcclxuZXhwb3J0IGNsYXNzIEFYQ29uZmlnIHtcclxuICBwcml2YXRlIHN0YXRpYyBkYXRhTW9kZWw6IGFueSA9IHt9O1xyXG4gIHByaXZhdGUgc3RhdGljIGRhdGFDaGFuZ2VTdWJqZWN0ID0gbmV3IFN1YmplY3Q8YW55PigpO1xyXG5cclxuICBzdGF0aWMgZ2V0IG9uQ2hhbmdlKCk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICByZXR1cm4gQVhDb25maWcuZGF0YUNoYW5nZVN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgc2V0KGNvbmZpZzogYW55KTogYW55O1xyXG4gIHN0YXRpYyBzZXQocGF0aDogc3RyaW5nLCB2YWx1ZT86IGFueSk6IHZvaWQ7XHJcbiAgc3RhdGljIHNldChhcmcxPzogYW55LCBhcmcyPzogYW55KSB7XHJcbiAgICBpZiAoYXJnMSAmJiB0eXBlb2YgYXJnMSA9PSAnc3RyaW5nJykge1xyXG4gICAgICBzZXQoQVhDb25maWcuZGF0YU1vZGVsLCBhcmcxLCBhcmcyKTtcclxuICAgICAgQVhDb25maWcuZGF0YUNoYW5nZVN1YmplY3QubmV4dChBWENvbmZpZy5kYXRhTW9kZWwpO1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICAgIGlmIChhcmcxICYmIHR5cGVvZiBhcmcxID09ICdvYmplY3QnKSB7XHJcbiAgICAgIG1lcmdlKEFYQ29uZmlnLmRhdGFNb2RlbCwgYXJnMSk7XHJcbiAgICAgIEFYQ29uZmlnLmRhdGFDaGFuZ2VTdWJqZWN0Lm5leHQoQVhDb25maWcuZGF0YU1vZGVsKTtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgICBpZiAoIWFyZzEgJiYgIWFyZzIpIHtcclxuICAgICAgcmV0dXJuIEFYQ29uZmlnLmRhdGFDaGFuZ2VTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xyXG4gICAgfVxyXG4gICAgLy8gVE9ETzogQXJhc2ggcGxlYXNlIGNoZWNrICdOb3QgYWxsIGNvZGUgcGF0aHMgcmV0dXJuIGEgdmFsdWUuJy5cclxuICAgIC8vIGlmIHJlbW92ZSByZXR1cm4geW91IGNhbiBzZWUgZXJyb3Igb24gbGluZSAxNS5cclxuICAgIHJldHVybiAnJztcclxuICB9XHJcblxyXG4gIHN0YXRpYyBnZXQocGF0aDogc3RyaW5nLCBkZWZhdWx0VmFsdWU/OiBhbnkpOiBhbnkge1xyXG4gICAgcmV0dXJuIGdldChBWENvbmZpZy5kYXRhTW9kZWwsIHBhdGgsIGRlZmF1bHRWYWx1ZSk7XHJcbiAgfVxyXG59XHJcbiJdfQ==
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ export * from './public-api';
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWNvcmV4LWNvcmUtZGF0ZVRpbWUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hY29yZXgvY29yZS9kYXRlVGltZS9hY29yZXgtY29yZS1kYXRlVGltZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILGNBQWMsY0FBYyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBHZW5lcmF0ZWQgYnVuZGxlIGluZGV4LiBEbyBub3QgZWRpdC5cbiAqL1xuXG5leHBvcnQgKiBmcm9tICcuL3B1YmxpYy1hcGknO1xuIl19
@@ -0,0 +1,6 @@
1
+ export * from './src/datetime.class';
2
+ export * from './src/datetime.module';
3
+ export * from './src/datetime.pipe';
4
+ export * from './src/georgian.calendar';
5
+ export * from './src/jalali.calendar';
6
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Fjb3JleC9jb3JlL2RhdGVUaW1lL3B1YmxpYy1hcGkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxzQkFBc0IsQ0FBQztBQUNyQyxjQUFjLHVCQUF1QixDQUFDO0FBQ3RDLGNBQWMscUJBQXFCLENBQUM7QUFDcEMsY0FBYyx5QkFBeUIsQ0FBQztBQUN4QyxjQUFjLHVCQUF1QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9zcmMvZGF0ZXRpbWUuY2xhc3MnO1xyXG5leHBvcnQgKiBmcm9tICcuL3NyYy9kYXRldGltZS5tb2R1bGUnO1xyXG5leHBvcnQgKiBmcm9tICcuL3NyYy9kYXRldGltZS5waXBlJztcclxuZXhwb3J0ICogZnJvbSAnLi9zcmMvZ2VvcmdpYW4uY2FsZW5kYXInO1xyXG5leHBvcnQgKiBmcm9tICcuL3NyYy9qYWxhbGkuY2FsZW5kYXInOyJdfQ==
@@ -0,0 +1,295 @@
1
+ import * as _ from 'lodash';
2
+ import { AXConfig } from '@acorex/core/config';
3
+ // @dynamic
4
+ export class AXDateTime {
5
+ constructor(value = new Date(), calendar = AXConfig.get(`dateTime.calendar`)) {
6
+ this._formatKeys = {
7
+ ss: () => this.pad(this.date.getSeconds(), 2),
8
+ s: () => this.date.getSeconds().toString(),
9
+ //
10
+ dd: () => this.pad(this.calendar.dayOfMonth(this.date), 2),
11
+ d: () => this.calendar.dayOfMonth(this.date).toString(),
12
+ //
13
+ mm: () => this.pad(this.date.getMinutes(), 2),
14
+ m: () => this.date.getMinutes().toString(),
15
+ //
16
+ MMMM: () => this.calendar.monthNames[this.calendar.monthOfYear(this.date) - 1],
17
+ MMM: () => this.calendar.monthShortNames[this.calendar.monthOfYear(this.date) - 1],
18
+ MM: () => this.pad(this.calendar.monthOfYear(this.date), 2),
19
+ //
20
+ DDDD: () => this.calendar.dayNames[this.calendar.dayOfWeek(this.date) - 1],
21
+ DDD: () => this.calendar.dayShortNames[this.calendar.dayOfWeek(this.date) - 1],
22
+ //
23
+ yyyy: () => this.calendar.year(this.date).toString(),
24
+ YYYY: () => this.calendar.year(this.date).toString(),
25
+ yy: () => this.calendar.year(this.date).toString().substring(2),
26
+ YY: () => this.calendar.year(this.date).toString().substring(2),
27
+ //
28
+ HH: () => this.pad(this.date.getHours(), 2),
29
+ H: () => this.date.getHours().toString(),
30
+ //
31
+ hh: () => this.pad((this.date.getHours() % 12 || 12), 2),
32
+ h: () => (this.date.getHours() % 12 || 12).toString(),
33
+ //
34
+ A: () => (this.date.getHours() < 12) ? 'am' : 'pm',
35
+ a: () => (this.date.getHours() < 12) ? 'am' : 'pm',
36
+ };
37
+ this._calendar = AXDateTime.resolveCalendar(calendar);
38
+ if (value instanceof Date) {
39
+ this._date = value;
40
+ }
41
+ else {
42
+ //TODO: parse jalali
43
+ this._date = new Date(value);
44
+ }
45
+ }
46
+ static convert(value, calendar = AXConfig.get('dateTime.calendar')) {
47
+ let date;
48
+ if (typeof value === 'string' || value instanceof String) {
49
+ date = new AXDateTime(value, calendar);
50
+ }
51
+ else if (value instanceof Date) {
52
+ date = new AXDateTime(value, calendar);
53
+ }
54
+ else if (value instanceof AXDateTime) {
55
+ date = new AXDateTime(value.date, calendar);
56
+ }
57
+ return date;
58
+ }
59
+ static from(value = {
60
+ calendar: AXConfig.get('dateTime.calendar'),
61
+ year: 1,
62
+ month: 1,
63
+ date: 1,
64
+ hours: 0,
65
+ minutes: 0,
66
+ seconds: 0,
67
+ ms: 0
68
+ }) {
69
+ // let date: AXDateTime = new AXDateTime(new Date(), value.calendar);
70
+ // date.set('year', value.year);
71
+ // date.set('month', value.month);
72
+ // date.set('day', value.date);
73
+ // date.set('hour', value.hours);
74
+ // date.set('minute', value.minutes);
75
+ // date.set('second', value.seconds);
76
+ // date.set('ms', value.ms);
77
+ return AXDateTime.resolveCalendar(value.calendar).create(value);
78
+ }
79
+ static resolveCalendar(calendar) {
80
+ return typeof calendar == 'string'
81
+ ? AXConfig.get(`dateTime.calendars.${calendar}`)
82
+ : calendar;
83
+ }
84
+ get date() {
85
+ return this._date;
86
+ }
87
+ get calendar() {
88
+ return this._calendar;
89
+ }
90
+ clone() {
91
+ return new AXDateTime(this.date, this.calendar);
92
+ }
93
+ get dayOfMonth() {
94
+ return this._calendar.dayOfMonth(this.date);
95
+ }
96
+ get dayOfYear() {
97
+ return this._calendar.dayOfYear(this.date);
98
+ }
99
+ get dayOfWeek() {
100
+ return this._calendar.dayOfWeek(this.date);
101
+ }
102
+ get hour() {
103
+ return this._date.getHours();
104
+ }
105
+ get minute() {
106
+ return this._date.getMinutes();
107
+ }
108
+ get second() {
109
+ return this._date.getSeconds();
110
+ }
111
+ get year() {
112
+ return this._calendar.year(this.date);
113
+ }
114
+ get monthOfYear() {
115
+ return this._calendar.monthOfYear(this.date);
116
+ }
117
+ get weekOfYear() {
118
+ return this._calendar.weekOfYear(this.date);
119
+ }
120
+ get month() {
121
+ return new AXCalendarMonth(this);
122
+ }
123
+ add(unit, amount) {
124
+ return this._calendar.add(this.date, unit, amount);
125
+ }
126
+ set(unit = 'day', value) {
127
+ return this._calendar.set(this.date, unit, value);
128
+ }
129
+ duration(end, unit = 'day') {
130
+ const range = new AXDateTimeRange(this, AXDateTime.convert(end, this.calendar.name()));
131
+ return range.duration();
132
+ }
133
+ startOf(unit = 'day') {
134
+ return this._calendar.startOf(this.date, unit);
135
+ }
136
+ endOf(unit = 'day') {
137
+ return this._calendar.endOf(this.date, unit);
138
+ }
139
+ format(format = AXConfig.get('dateTime.shortDateFormat')) {
140
+ const re = new RegExp(_.orderBy(Object.keys(this._formatKeys), c => c.length, ['desc']).join("|"), "gi");
141
+ return format.replace(re, (matched) => {
142
+ return this._formatKeys[matched]();
143
+ });
144
+ }
145
+ pad(n, width, z = '0') {
146
+ n = n + '';
147
+ return n.length >= width ? n : new Array(width - n.length + 1).join(z) + n;
148
+ }
149
+ toString(format = AXConfig.get('dateTime.shortDateFormat')) {
150
+ return this.format(format);
151
+ }
152
+ equal(value, unit = 'day') {
153
+ return this.compare(value, unit) == 0;
154
+ }
155
+ compare(value, unit = 'day') {
156
+ const val = AXDateTime.convert(value, this.calendar.name());
157
+ const func = (v1, v2) => {
158
+ if (v1 == v2) {
159
+ return 0;
160
+ }
161
+ else if (v1 > v2) {
162
+ return 1;
163
+ }
164
+ else {
165
+ return -1;
166
+ }
167
+ };
168
+ let p = 0;
169
+ switch (unit) {
170
+ case 'year':
171
+ return func(this.year, val.year);
172
+ case 'week':
173
+ p = this.compare(val, 'year');
174
+ return p == 0 ? func(this.weekOfYear, val.weekOfYear) : p;
175
+ case 'month':
176
+ p = this.compare(val, 'year');
177
+ return p == 0 ? func(this.monthOfYear, val.monthOfYear) : p;
178
+ case 'day':
179
+ p = this.compare(val, 'year');
180
+ return p == 0 ? func(this.dayOfYear, val.dayOfYear) : p;
181
+ case 'hour':
182
+ p = this.compare(val, 'day');
183
+ return p == 0 ? func(this.hour, val.hour) : p;
184
+ case 'minute':
185
+ p = this.compare(val, 'hour');
186
+ return p == 0 ? func(this.minute, val.minute) : p;
187
+ case 'second':
188
+ p = this.compare(val, 'minute');
189
+ return p == 0 ? func(this.second, val.second) : p;
190
+ default:
191
+ return func(this.date.getTime(), val.date.getTime());
192
+ }
193
+ }
194
+ convert(calendar) {
195
+ return AXDateTime.convert(this, calendar);
196
+ }
197
+ }
198
+ export class AXCalendarMonth {
199
+ constructor(date) {
200
+ this.index = date.date.getMonth();
201
+ this.name = date.format('MMMM');
202
+ this.range = new AXDateTimeRange(new AXDateTime(date.startOf('month').date, date.calendar), new AXDateTime(date.endOf('month').date, date.calendar));
203
+ }
204
+ get range() {
205
+ return this._range;
206
+ }
207
+ set range(v) {
208
+ this._range = v;
209
+ }
210
+ }
211
+ export class AXDateTimeRange {
212
+ constructor(startTime, endTime) {
213
+ this._startTime = startTime;
214
+ this._endTime = endTime;
215
+ }
216
+ get startTime() {
217
+ return this._startTime;
218
+ }
219
+ get endTime() {
220
+ return this._endTime;
221
+ }
222
+ duration() {
223
+ const result = {
224
+ miliseconds: 0,
225
+ seconds: 0,
226
+ minutes: 0,
227
+ hours: 0,
228
+ days: 0,
229
+ months: 0,
230
+ years: 0,
231
+ total: {
232
+ miliseconds: 0,
233
+ seconds: 0,
234
+ minutes: 0,
235
+ hours: 0,
236
+ days: 0,
237
+ weeks: 0,
238
+ months: 0,
239
+ years: 0,
240
+ },
241
+ };
242
+ const one_second = 1000;
243
+ const one_min = one_second * 60;
244
+ const one_hour = one_min * 60;
245
+ const one_day = one_hour * 24;
246
+ const one_week = one_day * 7;
247
+ const one_year = 365.25 * one_day;
248
+ const one_month = one_year / 12;
249
+ const startTime = this._startTime.date.getTime();
250
+ const endTime = this._endTime.date.getTime();
251
+ const diff = Math.abs(endTime - startTime);
252
+ //
253
+ result.total.miliseconds = diff;
254
+ result.total.seconds = Number((diff / one_second).toFixed(2));
255
+ result.total.minutes = Number((diff / one_min).toFixed(2));
256
+ result.total.hours = Number((diff / one_hour).toFixed(2));
257
+ result.total.days = Number((diff / one_day).toFixed(2));
258
+ result.total.weeks = Number((diff / one_week).toFixed(2));
259
+ //
260
+ // let months = (this.endTime.year - this.startTime.year) * 12;
261
+ // months += this.endTime.monthOfYear - this.startTime.monthOfYear + 1;
262
+ // if (this.endTime.dayOfYear < this.startTime.dayOfYear) {
263
+ // months--;
264
+ // }
265
+ // result.total.months = Math.abs(months);
266
+ // TODO: review
267
+ result.total.months = Number((diff / one_month).toFixed(2));
268
+ result.total.years = Number((diff / one_year).toFixed(2));
269
+ //
270
+ result.miliseconds = result.total.miliseconds % 1000;
271
+ result.seconds = Number((result.total.seconds % 60).toFixed(0));
272
+ result.minutes = Number((result.total.minutes % 60).toFixed(0));
273
+ result.hours = Number((result.total.hours % 24).toFixed(0));
274
+ // TODO: review
275
+ result.days = Number((result.total.days % 30.4).toFixed(0));
276
+ result.months = Number((result.total.months % 12).toFixed(0));
277
+ result.years = Number(result.total.years.toFixed(0));
278
+ return result;
279
+ }
280
+ enumurate(unit = 'day', amount = 1) {
281
+ // TODO: setptemper savingtime issue
282
+ const result = [];
283
+ let item = this._startTime.clone();
284
+ while (item.compare(this._endTime, unit) < 1) {
285
+ result.push(item);
286
+ item = item.add(unit, amount);
287
+ }
288
+ return result;
289
+ }
290
+ includes(value, unit = 'day') {
291
+ // TODO: ??
292
+ return true;
293
+ }
294
+ }
295
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZXRpbWUuY2xhc3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hY29yZXgvY29yZS9kYXRlVGltZS9zcmMvZGF0ZXRpbWUuY2xhc3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLENBQUMsTUFBTSxRQUFRLENBQUM7QUFDNUIsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBNkQvQyxXQUFXO0FBQ1gsTUFBTSxPQUFPLFVBQVU7SUEyRHJCLFlBQ0UsUUFBdUIsSUFBSSxJQUFJLEVBQUUsRUFDakMsV0FBZ0MsUUFBUSxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsQ0FBQztRQWtGM0QsZ0JBQVcsR0FBRztZQUNwQixFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUM3QyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxRQUFRLEVBQUU7WUFDMUMsRUFBRTtZQUNGLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDMUQsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLEVBQUU7WUFDdkQsRUFBRTtZQUNGLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQzdDLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLFFBQVEsRUFBRTtZQUMxQyxFQUFFO1lBQ0YsSUFBSSxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDOUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDbEYsRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUMzRCxFQUFFO1lBQ0YsSUFBSSxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDMUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDOUUsRUFBRTtZQUNGLElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxFQUFFO1lBQ3BELElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxFQUFFO1lBQ3BELEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztZQUMvRCxFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7WUFDL0QsRUFBRTtZQUNGLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQzNDLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsRUFBRTtZQUN4QyxFQUFFO1lBQ0YsRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDeEQsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsUUFBUSxFQUFFO1lBQ3JELEVBQUU7WUFDRixDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUk7WUFDbEQsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJ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Q0FBQyxDQUFDLENBQUM7UUFDNUQsTUFBTSxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDLENBQUMsSUFBSSxHQUFHLFFBQVEsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzFELEVBQUU7UUFDRixNQUFNLENBQUMsV0FBVyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztRQUNyRCxNQUFNLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2hFLE1BQU0sQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDaEUsTUFBTSxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM1RCxlQUFlO1FBQ2YsTUFBTSxDQUFDLElBQUksR0FBRyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM1RCxNQUFNLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzlELE1BQU0sQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3JELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFFRCxTQUFTLENBQUMsT0FBaUIsS0FBSyxFQUFFLFNBQWlCLENBQUM7UUFDbEQsb0NBQW9DO1FBQ3BDLE1BQU0sTUFBTSxHQUFpQixFQUFFLENBQUM7UUFDaEMsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNuQyxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDNUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNsQixJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUE7U0FDOUI7UUFDRCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRUQsUUFBUSxDQUFDLEtBQWlCLEVBQUUsT0FBaUIsS0FBSztRQUNoRCxXQUFXO1FBQ1gsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0NBWUYiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBfIGZyb20gJ2xvZGFzaCc7XHJcbmltcG9ydCB7IEFYQ29uZmlnIH0gZnJvbSAnQGFjb3JleC9jb3JlL2NvbmZpZyc7XHJcblxyXG5leHBvcnQgdHlwZSBUaW1lVW5pdCA9XHJcbiAgfCAnbXMnXHJcbiAgfCAnc2Vjb25kJ1xyXG4gIHwgJ21pbnV0ZSdcclxuICB8ICdob3VyJ1xyXG4gIHwgJ2RheSdcclxuICB8ICdtb250aCdcclxuICB8ICd5ZWFyJ1xyXG4gIHwgJ3dlZWsnO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBBWERhdGVWYWx1ZSB7XHJcbiAgeWVhcjogbnVtYmVyLFxyXG4gIG1vbnRoOiBudW1iZXIsXHJcbiAgZGF0ZTogbnVtYmVyLFxyXG4gIGhvdXJzPzogbnVtYmVyLFxyXG4gIG1pbnV0ZXM/OiBudW1iZXIsXHJcbiAgc2Vjb25kcz86IG51bWJlcixcclxuICBtcz86IG51bWJlclxyXG4gIGNhbGVuZGFyOiBzdHJpbmc7XHJcbn1cclxuXHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEFYQ2FsZW5kYXIge1xyXG4gIG1vbnRoTmFtZXM6IHN0cmluZ1tdO1xyXG5cclxuICBtb250aFNob3J0TmFtZXM6IHN0cmluZ1tdO1xyXG5cclxuICBkYXlOYW1lczogc3RyaW5nW107XHJcblxyXG4gIGRheVNob3J0TmFtZXM6IHN0cmluZ1tdO1xyXG5cclxuICBuYW1lKCk6IHN0cmluZztcclxuXHJcbiAgZGF5T2ZNb250aChkYXRlOiBEYXRlKTogbnVtYmVyO1xyXG5cclxuICBkYXlPZlllYXIoZGF0ZTogRGF0ZSk6IG51bWJlcjtcclxuXHJcbiAgZGF5T2ZXZWVrKGRhdGU6IERhdGUpOiBudW1iZXI7XHJcblxyXG4gIG1vbnRoT2ZZZWFyKGRhdGU6IERhdGUpOiBudW1iZXI7XHJcblxyXG4gIHdlZWtPZlllYXIoZGF0ZTogRGF0ZSk6IG51bWJlcjtcclxuXHJcbiAgeWVhcihkYXRlOiBEYXRlKTogbnVtYmVyO1xyXG5cclxuICBhZGQoZGF0ZTogRGF0ZSwgdW5pdDogVGltZVVuaXQsIGFtb3VudDogbnVtYmVyKTogQVhEYXRlVGltZTtcclxuXHJcbiAgc2V0KGRhdGU6IERhdGUsIHVuaXQ6IFRpbWVVbml0LCB2YWx1ZTogbnVtYmVyKTogQVhEYXRlVGltZTtcclxuXHJcbiAgc3RhcnRPZihkYXRlOiBEYXRlLCB1bml0OiBUaW1lVW5pdCk6IEFYRGF0ZVRpbWU7XHJcblxyXG4gIGVuZE9mKGRhdGU6IERhdGUsIHVuaXQ6IFRpbWVVbml0KTogQVhEYXRlVGltZTtcclxuXHJcbiAgY3JlYXRlKHZhbHVlOiBBWERhdGVWYWx1ZSk6IEFYRGF0ZVRpbWU7XHJcbn1cclxuXHJcblxyXG5cclxuXHJcbi8vIEBkeW5hbWljXHJcbmV4cG9ydCBjbGFzcyBBWERhdGVUaW1lIHtcclxuICBzdGF0aWMgY29udmVydChcclxuICAgIHZhbHVlOiBEYXRlIHwgQVhEYXRlVGltZSB8IHN0cmluZyxcclxuICAgIGNhbGVuZGFyOiBzdHJpbmcgPSBBWENvbmZpZy5nZXQoJ2RhdGVUaW1lLmNhbGVuZGFyJylcclxuICApOiBBWERhdGVUaW1lIHtcclxuICAgIGxldCBkYXRlOiBBWERhdGVUaW1lO1xyXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgfHwgdmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHtcclxuICAgICAgZGF0ZSA9IG5ldyBBWERhdGVUaW1lKHZhbHVlIGFzIHN0cmluZywgY2FsZW5kYXIpO1xyXG4gICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpIHtcclxuICAgICAgZGF0ZSA9IG5ldyBBWERhdGVUaW1lKHZhbHVlIGFzIERhdGUsIGNhbGVuZGFyKTtcclxuICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBBWERhdGVUaW1lKSB7XHJcbiAgICAgIGRhdGUgPSBuZXcgQVhEYXRlVGltZSh2YWx1ZS5kYXRlLCBjYWxlbmRhcik7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZGF0ZSE7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgZnJvbSh2YWx1ZTogQVhEYXRlVmFsdWUgPSB7XHJcbiAgICBjYWxlbmRhcjogQVhDb25maWcuZ2V0KCdkYXRlVGltZS5jYWxlbmRhcicpLFxyXG4gICAgeWVhcjogMSxcclxuICAgIG1vbnRoOiAxLFxyXG4gICAgZGF0ZTogMSxcclxuICAgIGhvdXJzOiAwLFxyXG4gICAgbWludXRlczogMCxcclxuICAgIHNlY29uZHM6IDAsXHJcbiAgICBtczogMFxyXG4gIH0pOiBBWERhdGVUaW1lIHtcclxuICAgIC8vIGxldCBkYXRlOiBBWERhdGVUaW1lID0gbmV3IEFYRGF0ZVRpbWUobmV3IERhdGUoKSwgdmFsdWUuY2FsZW5kYXIpO1xyXG4gICAgLy8gZGF0ZS5zZXQoJ3llYXInLCB2YWx1ZS55ZWFyKTtcclxuICAgIC8vIGRhdGUuc2V0KCdtb250aCcsIHZhbHVlLm1vbnRoKTtcclxuICAgIC8vIGRhdGUuc2V0KCdkYXknLCB2YWx1ZS5kYXRlKTtcclxuICAgIC8vIGRhdGUuc2V0KCdob3VyJywgdmFsdWUuaG91cnMpO1xyXG4gICAgLy8gZGF0ZS5zZXQoJ21pbnV0ZScsIHZhbHVlLm1pbnV0ZXMpO1xyXG4gICAgLy8gZGF0ZS5zZXQoJ3NlY29uZCcsIHZhbHVlLnNlY29uZHMpO1xyXG4gICAgLy8gZGF0ZS5zZXQoJ21zJywgdmFsdWUubXMpO1xyXG5cclxuICAgIHJldHVybiBBWERhdGVUaW1lLnJlc29sdmVDYWxlbmRhcih2YWx1ZS5jYWxlbmRhcikuY3JlYXRlKHZhbHVlKTtcclxuICB9XHJcblxyXG5cclxuICBzdGF0aWMgcmVzb2x2ZUNhbGVuZGFyKGNhbGVuZGFyOiBzdHJpbmcgfCBBWENhbGVuZGFyKTogQVhDYWxlbmRhciB7XHJcbiAgICByZXR1cm4gdHlwZW9mIGNhbGVuZGFyID09ICdzdHJpbmcnXHJcbiAgICAgID8gQVhDb25maWcuZ2V0KGBkYXRlVGltZS5jYWxlbmRhcnMuJHtjYWxlbmRhcn1gKVxyXG4gICAgICA6IGNhbGVuZGFyO1xyXG4gIH1cclxuXHJcblxyXG4gIHByaXZhdGUgX2RhdGU6IERhdGU7XHJcblxyXG4gIGdldCBkYXRlKCk6IERhdGUge1xyXG4gICAgcmV0dXJuIHRoaXMuX2RhdGU7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9jYWxlbmRhcjogQVhDYWxlbmRhcjtcclxuICBnZXQgY2FsZW5kYXIoKTogQVhDYWxlbmRhciB7XHJcbiAgICByZXR1cm4gdGhpcy5fY2FsZW5kYXI7XHJcbiAgfVxyXG5cclxuXHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgdmFsdWU6IERhdGUgfCBzdHJpbmcgPSBuZXcgRGF0ZSgpLFxyXG4gICAgY2FsZW5kYXI6IHN0cmluZyB8IEFYQ2FsZW5kYXIgPSBBWENvbmZpZy5nZXQoYGRhdGVUaW1lLmNhbGVuZGFyYClcclxuICApIHtcclxuICAgIHRoaXMuX2NhbGVuZGFyID0gQVhEYXRlVGltZS5yZXNvbHZlQ2FsZW5kYXIoY2FsZW5kYXIpO1xyXG4gICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkge1xyXG4gICAgICB0aGlzLl9kYXRlID0gdmFsdWUgYXMgRGF0ZTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vVE9ETzogcGFyc2UgamFsYWxpXHJcbiAgICAgIHRoaXMuX2RhdGUgPSBuZXcgRGF0ZSh2YWx1ZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjbG9uZSgpOiBBWERhdGVUaW1lIHtcclxuICAgIHJldHVybiBuZXcgQVhEYXRlVGltZSh0aGlzLmRhdGUsIHRoaXMuY2FsZW5kYXIpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGRheU9mTW9udGgoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9jYWxlbmRhci5kYXlPZk1vbnRoKHRoaXMuZGF0ZSk7XHJcbiAgfVxyXG5cclxuICBnZXQgZGF5T2ZZZWFyKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5fY2FsZW5kYXIuZGF5T2ZZZWFyKHRoaXMuZGF0ZSk7XHJcbiAgfVxyXG5cclxuICBnZXQgZGF5T2ZXZWVrKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5fY2FsZW5kYXIuZGF5T2ZXZWVrKHRoaXMuZGF0ZSk7XHJcbiAgfVxyXG5cclxuICBnZXQgaG91cigpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX2RhdGUuZ2V0SG91cnMoKTtcclxuICB9XHJcblxyXG4gIGdldCBtaW51dGUoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9kYXRlLmdldE1pbnV0ZXMoKTtcclxuICB9XHJcblxyXG4gIGdldCBzZWNvbmQoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9kYXRlLmdldFNlY29uZHMoKTtcclxuICB9XHJcblxyXG4gIGdldCB5ZWFyKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5fY2FsZW5kYXIueWVhcih0aGlzLmRhdGUpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IG1vbnRoT2ZZZWFyKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5fY2FsZW5kYXIubW9udGhPZlllYXIodGhpcy5kYXRlKTtcclxuICB9XHJcblxyXG4gIGdldCB3ZWVrT2ZZZWFyKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5fY2FsZW5kYXIud2Vla09mWWVhcih0aGlzLmRhdGUpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IG1vbnRoKCk6IEFYQ2FsZW5kYXJNb250aCB7XHJcbiAgICByZXR1cm4gbmV3IEFYQ2FsZW5kYXJNb250aCh0aGlzKTtcclxuICB9XHJcblxyXG4gIGFkZCh1bml0OiBUaW1lVW5pdCwgYW1vdW50OiBudW1iZXIpOiBBWERhdGVUaW1lIHtcclxuICAgIHJldHVybiB0aGlzLl9jYWxlbmRhci5hZGQodGhpcy5kYXRlLCB1bml0LCBhbW91bnQpO1xyXG4gIH1cclxuXHJcbiAgc2V0KHVuaXQ6IFRpbWVVbml0ID0gJ2RheScsIHZhbHVlOiBudW1iZXIpOiBBWERhdGVUaW1lIHtcclxuICAgIHJldHVybiB0aGlzLl9jYWxlbmRhci5zZXQodGhpcy5kYXRlLCB1bml0LCB2YWx1ZSk7XHJcbiAgfVxyXG5cclxuICBkdXJhdGlvbihcclxuICAgIGVuZDogRGF0ZSB8IEFYRGF0ZVRpbWUsXHJcbiAgICB1bml0OiBUaW1lVW5pdCA9ICdkYXknXHJcbiAgKTogQVhUaW1lU3BhbiB7XHJcbiAgICBjb25zdCByYW5nZSA9IG5ldyBBWERhdGVUaW1lUmFuZ2UoXHJcbiAgICAgIHRoaXMsXHJcbiAgICAgIEFYRGF0ZVRpbWUuY29udmVydChlbmQsIHRoaXMuY2FsZW5kYXIubmFtZSgpKVxyXG4gICAgKTtcclxuICAgIHJldHVybiByYW5nZS5kdXJhdGlvbigpO1xyXG4gIH1cclxuXHJcbiAgc3RhcnRPZih1bml0OiBUaW1lVW5pdCA9ICdkYXknKTogQVhEYXRlVGltZSB7XHJcbiAgICByZXR1cm4gdGhpcy5fY2FsZW5kYXIuc3RhcnRPZih0aGlzLmRhdGUsIHVuaXQpO1xyXG4gIH1cclxuXHJcbiAgZW5kT2YodW5pdDogVGltZVVuaXQgPSAnZGF5Jyk6IEFYRGF0ZVRpbWUge1xyXG4gICAgcmV0dXJuIHRoaXMuX2NhbGVuZGFyLmVuZE9mKHRoaXMuZGF0ZSwgdW5pdCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9mb3JtYXRLZXlzID0ge1xyXG4gICAgc3M6ICgpID0+IHRoaXMucGFkKHRoaXMuZGF0ZS5nZXRTZWNvbmRzKCksIDIpLFxyXG4gICAgczogKCkgPT4gdGhpcy5kYXRlLmdldFNlY29uZHMoKS50b1N0cmluZygpLFxyXG4gICAgLy9cclxuICAgIGRkOiAoKSA9PiB0aGlzLnBhZCh0aGlzLmNhbGVuZGFyLmRheU9mTW9udGgodGhpcy5kYXRlKSwgMiksXHJcbiAgICBkOiAoKSA9PiB0aGlzLmNhbGVuZGFyLmRheU9mTW9udGgodGhpcy5kYXRlKS50b1N0cmluZygpLFxyXG4gICAgLy9cclxuICAgIG1tOiAoKSA9PiB0aGlzLnBhZCh0aGlzLmRhdGUuZ2V0TWludXRlcygpLCAyKSxcclxuICAgIG06ICgpID0+IHRoaXMuZGF0ZS5nZXRNaW51dGVzKCkudG9TdHJpbmcoKSxcclxuICAgIC8vXHJcbiAgICBNTU1NOiAoKSA9PiB0aGlzLmNhbGVuZGFyLm1vbnRoTmFtZXNbdGhpcy5jYWxlbmRhci5tb250aE9mWWVhcih0aGlzLmRhdGUpIC0gMV0sXHJcbiAgICBNTU06ICgpID0+IHRoaXMuY2FsZW5kYXIubW9udGhTaG9ydE5hbWVzW3RoaXMuY2FsZW5kYXIubW9udGhPZlllYXIodGhpcy5kYXRlKSAtIDFdLFxyXG4gICAgTU06ICgpID0+IHRoaXMucGFkKHRoaXMuY2FsZW5kYXIubW9udGhPZlllYXIodGhpcy5kYXRlKSwgMiksXHJcbiAgICAvL1xyXG4gICAgRERERDogKCkgPT4gdGhpcy5jYWxlbmRhci5kYXlOYW1lc1t0aGlzLmNhbGVuZGFyLmRheU9mV2Vlayh0aGlzLmRhdGUpIC0gMV0sXHJcbiAgICBEREQ6ICgpID0+IHRoaXMuY2FsZW5kYXIuZGF5U2hvcnROYW1lc1t0aGlzLmNhbGVuZGFyLmRheU9mV2Vlayh0aGlzLmRhdGUpIC0gMV0sXHJcbiAgICAvL1xyXG4gICAgeXl5eTogKCkgPT4gdGhpcy5jYWxlbmRhci55ZWFyKHRoaXMuZGF0ZSkudG9TdHJpbmcoKSxcclxuICAgIFlZWVk6ICgpID0+IHRoaXMuY2FsZW5kYXIueWVhcih0aGlzLmRhdGUpLnRvU3RyaW5nKCksXHJcbiAgICB5eTogKCkgPT4gdGhpcy5jYWxlbmRhci55ZWFyKHRoaXMuZGF0ZSkudG9TdHJpbmcoKS5zdWJzdHJpbmcoMiksXHJcbiAgICBZWTogKCkgPT4gdGhpcy5jYWxlbmRhci55ZWFyKHRoaXMuZGF0ZSkudG9TdHJpbmcoKS5zdWJzdHJpbmcoMiksXHJcbiAgICAvL1xyXG4gICAgSEg6ICgpID0+IHRoaXMucGFkKHRoaXMuZGF0ZS5nZXRIb3VycygpLCAyKSxcclxuICAgIEg6ICgpID0+IHRoaXMuZGF0ZS5nZXRIb3VycygpLnRvU3RyaW5nKCksXHJcbiAgICAvL1xyXG4gICAgaGg6ICgpID0+IHRoaXMucGFkKCh0aGlzLmRhdGUuZ2V0SG91cnMoKSAlIDEyIHx8IDEyKSwgMiksXHJcbiAgICBoOiAoKSA9PiAodGhpcy5kYXRlLmdldEhvdXJzKCkgJSAxMiB8fCAxMikudG9TdHJpbmcoKSxcclxuICAgIC8vXHJcbiAgICBBOiAoKSA9PiAodGhpcy5kYXRlLmdldEhvdXJzKCkgPCAxMikgPyAnYW0nIDogJ3BtJyxcclxuICAgIGE6ICgpID0+ICh0aGlzLmRhdGUuZ2V0SG91cnMoKSA8IDEyKSA/ICdhbScgOiAncG0nLFxyXG4gIH07XHJcblxyXG4gIGZvcm1hdChcclxuICAgIGZvcm1hdDogc3RyaW5nID0gQVhDb25maWcuZ2V0KCdkYXRlVGltZS5zaG9ydERhdGVGb3JtYXQnKVxyXG4gICk6IHN0cmluZyB7XHJcbiAgICBjb25zdCByZSA9IG5ldyBSZWdFeHAoXy5vcmRlckJ5KE9iamVjdC5rZXlzKHRoaXMuX2Zvcm1hdEtleXMpLCBjID0+IGMubGVuZ3RoLCBbJ2Rlc2MnXSkuam9pbihcInxcIiksIFwiZ2lcIik7XHJcbiAgICByZXR1cm4gZm9ybWF0LnJlcGxhY2UocmUsIChtYXRjaGVkKSA9PiB7XHJcbiAgICAgIHJldHVybiB0aGlzLl9mb3JtYXRLZXlzW21hdGNoZWRdKCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcGFkKG4sIHdpZHRoLCB6ID0gJzAnKSB7XHJcbiAgICBuID0gbiArICcnO1xyXG4gICAgcmV0dXJuIG4ubGVuZ3RoID49IHdpZHRoID8gbiA6IG5ldyBBcnJheSh3aWR0aCAtIG4ubGVuZ3RoICsgMSkuam9pbih6KSArIG47XHJcbiAgfVxyXG5cclxuICB0b1N0cmluZyhmb3JtYXQ6IHN0cmluZyA9IEFYQ29uZmlnLmdldCgnZGF0ZVRpbWUuc2hvcnREYXRlRm9ybWF0JykpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuZm9ybWF0KGZvcm1hdCk7XHJcbiAgfVxyXG5cclxuICBlcXVhbCh2YWx1ZTogRGF0ZSB8IEFYRGF0ZVRpbWUsIHVuaXQ6IFRpbWVVbml0ID0gJ2RheScpIHtcclxuICAgIHJldHVybiB0aGlzLmNvbXBhcmUodmFsdWUsIHVuaXQpID09IDA7XHJcbiAgfVxyXG5cclxuICBjb21wYXJlKHZhbHVlOiBEYXRlIHwgQVhEYXRlVGltZSwgdW5pdDogVGltZVVuaXQgPSAnZGF5Jykge1xyXG4gICAgY29uc3QgdmFsID0gQVhEYXRlVGltZS5jb252ZXJ0KHZhbHVlLCB0aGlzLmNhbGVuZGFyLm5hbWUoKSk7XHJcbiAgICBjb25zdCBmdW5jID0gKHYxOiBudW1iZXIsIHYyOiBudW1iZXIpID0+IHtcclxuICAgICAgaWYgKHYxID09IHYyKSB7XHJcbiAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgIH0gZWxzZSBpZiAodjEgPiB2Mikge1xyXG4gICAgICAgIHJldHVybiAxO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJldHVybiAtMTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgbGV0IHAgPSAwO1xyXG4gICAgc3dpdGNoICh1bml0KSB7XHJcbiAgICAgIGNhc2UgJ3llYXInOlxyXG4gICAgICAgIHJldHVybiBmdW5jKHRoaXMueWVhciwgdmFsLnllYXIpO1xyXG4gICAgICBjYXNlICd3ZWVrJzpcclxuICAgICAgICBwID0gdGhpcy5jb21wYXJlKHZhbCwgJ3llYXInKTtcclxuICAgICAgICByZXR1cm4gcCA9PSAwID8gZnVuYyh0aGlzLndlZWtPZlllYXIsIHZhbC53ZWVrT2ZZZWFyKSA6IHA7XHJcbiAgICAgIGNhc2UgJ21vbnRoJzpcclxuICAgICAgICBwID0gdGhpcy5jb21wYXJlKHZhbCwgJ3llYXInKTtcclxuICAgICAgICByZXR1cm4gcCA9PSAwID8gZnVuYyh0aGlzLm1vbnRoT2ZZZWFyLCB2YWwubW9udGhPZlllYXIpIDogcDtcclxuICAgICAgY2FzZSAnZGF5JzpcclxuICAgICAgICBwID0gdGhpcy5jb21wYXJlKHZhbCwgJ3llYXInKTtcclxuICAgICAgICByZXR1cm4gcCA9PSAwID8gZnVuYyh0aGlzLmRheU9mWWVhciwgdmFsLmRheU9mWWVhcikgOiBwO1xyXG4gICAgICBjYXNlICdob3VyJzpcclxuICAgICAgICBwID0gdGhpcy5jb21wYXJlKHZhbCwgJ2RheScpO1xyXG4gICAgICAgIHJldHVybiBwID09IDAgPyBmdW5jKHRoaXMuaG91ciwgdmFsLmhvdXIpIDogcDtcclxuICAgICAgY2FzZSAnbWludXRlJzpcclxuICAgICAgICBwID0gdGhpcy5jb21wYXJlKHZhbCwgJ2hvdXInKTtcclxuICAgICAgICByZXR1cm4gcCA9PSAwID8gZnVuYyh0aGlzLm1pbnV0ZSwgdmFsLm1pbnV0ZSkgOiBwO1xyXG4gICAgICBjYXNlICdzZWNvbmQnOlxyXG4gICAgICAgIHAgPSB0aGlzLmNvbXBhcmUodmFsLCAnbWludXRlJyk7XHJcbiAgICAgICAgcmV0dXJuIHAgPT0gMCA/IGZ1bmModGhpcy5zZWNvbmQsIHZhbC5zZWNvbmQpIDogcDtcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICByZXR1cm4gZnVuYyh0aGlzLmRhdGUuZ2V0VGltZSgpLCB2YWwuZGF0ZS5nZXRUaW1lKCkpO1xyXG4gICAgfVxyXG5cclxuICB9XHJcblxyXG4gIGNvbnZlcnQoY2FsZW5kYXI6IHN0cmluZykge1xyXG4gICAgcmV0dXJuIEFYRGF0ZVRpbWUuY29udmVydCh0aGlzLCBjYWxlbmRhcik7XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgQVhDYWxlbmRhck1vbnRoIHtcclxuICBwcml2YXRlIF9yYW5nZTogQVhEYXRlVGltZVJhbmdlO1xyXG4gIHB1YmxpYyBnZXQgcmFuZ2UoKTogQVhEYXRlVGltZVJhbmdlIHtcclxuICAgIHJldHVybiB0aGlzLl9yYW5nZTtcclxuICB9XHJcbiAgcHVibGljIHNldCByYW5nZSh2OiBBWERhdGVUaW1lUmFuZ2UpIHtcclxuICAgIHRoaXMuX3JhbmdlID0gdjtcclxuICB9XHJcblxyXG4gIGNvbnN0cnVjdG9yKGRhdGU6IEFYRGF0ZVRpbWUpIHtcclxuICAgIHRoaXMuaW5kZXggPSBkYXRlLmRhdGUuZ2V0TW9udGgoKTtcclxuICAgIHRoaXMubmFtZSA9IGRhdGUuZm9ybWF0KCdNTU1NJyk7XHJcbiAgICB0aGlzLnJhbmdlID0gbmV3IEFYRGF0ZVRpbWVSYW5nZShcclxuICAgICAgbmV3IEFYRGF0ZVRpbWUoZGF0ZS5zdGFydE9mKCdtb250aCcpLmRhdGUsIGRhdGUuY2FsZW5kYXIpLFxyXG4gICAgICBuZXcgQVhEYXRlVGltZShkYXRlLmVuZE9mKCdtb250aCcpLmRhdGUsIGRhdGUuY2FsZW5kYXIpXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZWFkb25seSBpbmRleDogbnVtYmVyO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEFYVGltZVNwYW5Ub3RhbCB7XHJcbiAgbWlsaXNlY29uZHM6IG51bWJlcjtcclxuICBzZWNvbmRzOiBudW1iZXI7XHJcbiAgbWludXRlczogbnVtYmVyO1xyXG4gIGhvdXJzOiBudW1iZXI7XHJcbiAgZGF5czogbnVtYmVyO1xyXG4gIHdlZWtzOiBudW1iZXI7XHJcbiAgbW9udGhzOiBudW1iZXI7XHJcbiAgeWVhcnM6IG51bWJlcjtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBBWFRpbWVTcGFuIHtcclxuICBtaWxpc2Vjb25kczogbnVtYmVyO1xyXG4gIHNlY29uZHM6IG51bWJlcjtcclxuICBtaW51dGVzOiBudW1iZXI7XHJcbiAgaG91cnM6IG51bWJlcjtcclxuICBkYXlzOiBudW1iZXI7XHJcbiAgbW9udGhzOiBudW1iZXI7XHJcbiAgeWVhcnM6IG51bWJlcjtcclxuICB0b3RhbDogQVhUaW1lU3BhblRvdGFsO1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgQVhEYXRlVGltZVJhbmdlIHtcclxuICBwcml2YXRlIF9zdGFydFRpbWU6IEFYRGF0ZVRpbWU7XHJcbiAgcHJpdmF0ZSBfZW5kVGltZTogQVhEYXRlVGltZTtcclxuXHJcbiAgcHVibGljIGdldCBzdGFydFRpbWUoKTogQVhEYXRlVGltZSB7XHJcbiAgICByZXR1cm4gdGhpcy5fc3RhcnRUaW1lO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBlbmRUaW1lKCk6IEFYRGF0ZVRpbWUge1xyXG4gICAgcmV0dXJuIHRoaXMuX2VuZFRpbWU7XHJcbiAgfVxyXG5cclxuICBjb25zdHJ1Y3RvcihzdGFydFRpbWU6IEFYRGF0ZVRpbWUsIGVuZFRpbWU6IEFYRGF0ZVRpbWUpIHtcclxuICAgIHRoaXMuX3N0YXJ0VGltZSA9IHN0YXJ0VGltZTtcclxuICAgIHRoaXMuX2VuZFRpbWUgPSBlbmRUaW1lO1xyXG4gIH1cclxuXHJcbiAgZHVyYXRpb24oKTogQVhUaW1lU3BhbiB7XHJcbiAgICBjb25zdCByZXN1bHQ6IEFYVGltZVNwYW4gPSB7XHJcbiAgICAgIG1pbGlzZWNvbmRzOiAwLFxyXG4gICAgICBzZWNvbmRzOiAwLFxyXG4gICAgICBtaW51dGVzOiAwLFxyXG4gICAgICBob3VyczogMCxcclxuICAgICAgZGF5czogMCxcclxuICAgICAgbW9udGhzOiAwLFxyXG4gICAgICB5ZWFyczogMCxcclxuICAgICAgdG90YWw6IHtcclxuICAgICAgICBtaWxpc2Vjb25kczogMCxcclxuICAgICAgICBzZWNvbmRzOiAwLFxyXG4gICAgICAgIG1pbnV0ZXM6IDAsXHJcbiAgICAgICAgaG91cnM6IDAsXHJcbiAgICAgICAgZGF5czogMCxcclxuICAgICAgICB3ZWVrczogMCxcclxuICAgICAgICBtb250aHM6IDAsXHJcbiAgICAgICAgeWVhcnM6IDAsXHJcbiAgICAgIH0sXHJcbiAgICB9O1xyXG5cclxuICAgIGNvbnN0IG9uZV9zZWNvbmQgPSAxMDAwO1xyXG4gICAgY29uc3Qgb25lX21pbiA9IG9uZV9zZWNvbmQgKiA2MDtcclxuICAgIGNvbnN0IG9uZV9ob3VyID0gb25lX21pbiAqIDYwO1xyXG4gICAgY29uc3Qgb25lX2RheSA9IG9uZV9ob3VyICogMjQ7XHJcbiAgICBjb25zdCBvbmVfd2VlayA9IG9uZV9kYXkgKiA3O1xyXG4gICAgY29uc3Qgb25lX3llYXIgPSAzNjUuMjUgKiBvbmVfZGF5O1xyXG4gICAgY29uc3Qgb25lX21vbnRoID0gb25lX3llYXIgLyAxMjtcclxuICAgIGNvbnN0IHN0YXJ0VGltZSA9IHRoaXMuX3N0YXJ0VGltZS5kYXRlLmdldFRpbWUoKTtcclxuICAgIGNvbnN0IGVuZFRpbWUgPSB0aGlzLl9lbmRUaW1lLmRhdGUuZ2V0VGltZSgpO1xyXG4gICAgY29uc3QgZGlmZiA9IE1hdGguYWJzKGVuZFRpbWUgLSBzdGFydFRpbWUpO1xyXG4gICAgLy9cclxuICAgIHJlc3VsdC50b3RhbC5taWxpc2Vjb25kcyA9IGRpZmY7XHJcbiAgICByZXN1bHQudG90YWwuc2Vjb25kcyA9IE51bWJlcigoZGlmZiAvIG9uZV9zZWNvbmQpLnRvRml4ZWQoMikpO1xyXG4gICAgcmVzdWx0LnRvdGFsLm1pbnV0ZXMgPSBOdW1iZXIoKGRpZmYgLyBvbmVfbWluKS50b0ZpeGVkKDIpKTtcclxuICAgIHJlc3VsdC50b3RhbC5ob3VycyA9IE51bWJlcigoZGlmZiAvIG9uZV9ob3VyKS50b0ZpeGVkKDIpKTtcclxuICAgIHJlc3VsdC50b3RhbC5kYXlzID0gTnVtYmVyKChkaWZmIC8gb25lX2RheSkudG9GaXhlZCgyKSk7XHJcbiAgICByZXN1bHQudG90YWwud2Vla3MgPSBOdW1iZXIoKGRpZmYgLyBvbmVfd2VlaykudG9GaXhlZCgyKSk7XHJcbiAgICAvL1xyXG4gICAgLy8gbGV0IG1vbnRocyA9ICh0aGlzLmVuZFRpbWUueWVhciAtIHRoaXMuc3RhcnRUaW1lLnllYXIpICogMTI7XHJcbiAgICAvLyBtb250aHMgKz0gdGhpcy5lbmRUaW1lLm1vbnRoT2ZZZWFyIC0gdGhpcy5zdGFydFRpbWUubW9udGhPZlllYXIgKyAxO1xyXG4gICAgLy8gaWYgKHRoaXMuZW5kVGltZS5kYXlPZlllYXIgPCB0aGlzLnN0YXJ0VGltZS5kYXlPZlllYXIpIHtcclxuICAgIC8vICAgICBtb250aHMtLTtcclxuICAgIC8vIH1cclxuICAgIC8vIHJlc3VsdC50b3RhbC5tb250aHMgPSBNYXRoLmFicyhtb250aHMpO1xyXG4gICAgLy8gVE9ETzogcmV2aWV3XHJcbiAgICByZXN1bHQudG90YWwubW9udGhzID0gTnVtYmVyKChkaWZmIC8gb25lX21vbnRoKS50b0ZpeGVkKDIpKTtcclxuICAgIHJlc3VsdC50b3RhbC55ZWFycyA9IE51bWJlcigoZGlmZiAvIG9uZV95ZWFyKS50b0ZpeGVkKDIpKTtcclxuICAgIC8vXHJcbiAgICByZXN1bHQubWlsaXNlY29uZHMgPSByZXN1bHQudG90YWwubWlsaXNlY29uZHMgJSAxMDAwO1xyXG4gICAgcmVzdWx0LnNlY29uZHMgPSBOdW1iZXIoKHJlc3VsdC50b3RhbC5zZWNvbmRzICUgNjApLnRvRml4ZWQoMCkpO1xyXG4gICAgcmVzdWx0Lm1pbnV0ZXMgPSBOdW1iZXIoKHJlc3VsdC50b3RhbC5taW51dGVzICUgNjApLnRvRml4ZWQoMCkpO1xyXG4gICAgcmVzdWx0LmhvdXJzID0gTnVtYmVyKChyZXN1bHQudG90YWwuaG91cnMgJSAyNCkudG9GaXhlZCgwKSk7XHJcbiAgICAvLyBUT0RPOiByZXZpZXdcclxuICAgIHJlc3VsdC5kYXlzID0gTnVtYmVyKChyZXN1bHQudG90YWwuZGF5cyAlIDMwLjQpLnRvRml4ZWQoMCkpO1xyXG4gICAgcmVzdWx0Lm1vbnRocyA9IE51bWJlcigocmVzdWx0LnRvdGFsLm1vbnRocyAlIDEyKS50b0ZpeGVkKDApKTtcclxuICAgIHJlc3VsdC55ZWFycyA9IE51bWJlcihyZXN1bHQudG90YWwueWVhcnMudG9GaXhlZCgwKSk7XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgZW51bXVyYXRlKHVuaXQ6IFRpbWVVbml0ID0gJ2RheScsIGFtb3VudDogbnVtYmVyID0gMSk6IEFYRGF0ZVRpbWVbXSB7XHJcbiAgICAvLyBUT0RPOiBzZXRwdGVtcGVyIHNhdmluZ3RpbWUgaXNzdWVcclxuICAgIGNvbnN0IHJlc3VsdDogQVhEYXRlVGltZVtdID0gW107XHJcbiAgICBsZXQgaXRlbSA9IHRoaXMuX3N0YXJ0VGltZS5jbG9uZSgpO1xyXG4gICAgd2hpbGUgKGl0ZW0uY29tcGFyZSh0aGlzLl9lbmRUaW1lLCB1bml0KSA8IDEpIHtcclxuICAgICAgcmVzdWx0LnB1c2goaXRlbSk7XHJcbiAgICAgIGl0ZW0gPSBpdGVtLmFkZCh1bml0LCBhbW91bnQpXHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgaW5jbHVkZXModmFsdWU6IEFYRGF0ZVRpbWUsIHVuaXQ6IFRpbWVVbml0ID0gJ2RheScpOiBib29sZWFuIHtcclxuICAgIC8vIFRPRE86ID8/XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIC8vIGdldFZpZXdDb21wYWlyZSh2aWV3KSB7XHJcbiAgLy8gICAgIHN3aXRjaCAodmlldykge1xyXG4gIC8vICAgICAgICAgY2FzZSAnZGF5JzpcclxuICAvLyAgICAgICAgICAgICByZXR1cm4gJ1lNRCc7XHJcbiAgLy8gICAgICAgICBjYXNlICdtb250aCc6XHJcbiAgLy8gICAgICAgICAgICAgcmV0dXJuICdZTSc7XHJcbiAgLy8gICAgICAgICBjYXNlICd5ZWFyJzpcclxuICAvLyAgICAgICAgICAgICByZXR1cm4gJ1knO1xyXG4gIC8vICAgICB9XHJcbiAgLy8gfVxyXG59XHJcbiJdfQ==