ng-tailwind 5.2.1 → 5.2.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 (212) hide show
  1. package/README.md +24 -24
  2. package/animations/ngt-angular-animations.d.ts +5 -5
  3. package/base/ngt-base-ng-model.d.ts +32 -32
  4. package/components/ngt-action/ngt-action.component.d.ts +30 -30
  5. package/components/ngt-action/ngt-action.module.d.ts +10 -10
  6. package/components/ngt-button/ngt-button.component.d.ts +35 -35
  7. package/components/ngt-button/ngt-button.module.d.ts +10 -10
  8. package/components/ngt-checkbox/ngt-checkbox.component.d.ts +53 -53
  9. package/components/ngt-checkbox/ngt-checkbox.module.d.ts +10 -10
  10. package/components/ngt-content/ngt-content.component.d.ts +12 -12
  11. package/components/ngt-content/ngt-content.module.d.ts +8 -8
  12. package/components/ngt-context-menu/ngt-context-menu.component.d.ts +19 -19
  13. package/components/ngt-context-menu/ngt-context-menu.directive.d.ts +25 -25
  14. package/components/ngt-context-menu/ngt-context-menu.module.d.ts +10 -10
  15. package/components/ngt-datatable/ngt-datatable.component.d.ts +125 -125
  16. package/components/ngt-datatable/ngt-datatable.module.d.ts +25 -25
  17. package/components/ngt-datatable/ngt-tbody/ngt-tbody.component.d.ts +14 -14
  18. package/components/ngt-datatable/ngt-td/ngt-td.component.d.ts +14 -14
  19. package/components/ngt-datatable/ngt-td-check/ngt-td-check.component.d.ts +29 -29
  20. package/components/ngt-datatable/ngt-th/ngt-th.component.d.ts +55 -55
  21. package/components/ngt-datatable/ngt-th-check/ngt-th-check.component.d.ts +32 -32
  22. package/components/ngt-datatable/ngt-thead/ngt-thead.component.d.ts +13 -13
  23. package/components/ngt-datatable/ngt-tr/ngt-tr.component.d.ts +20 -20
  24. package/components/ngt-date/ngt-date.component.d.ts +85 -85
  25. package/components/ngt-date/ngt-date.module.d.ts +13 -13
  26. package/components/ngt-dropdown/ngt-dropdown-container/ngt-dropdown-container.component.d.ts +8 -8
  27. package/components/ngt-dropdown/ngt-dropdown.component.d.ts +53 -53
  28. package/components/ngt-dropdown/ngt-dropdown.module.d.ts +9 -9
  29. package/components/ngt-dropzone/custom-dropzone-preview/custom-dropzone-preview.component.d.ts +14 -14
  30. package/components/ngt-dropzone/ngt-dropzone-file-viewer/ngt-dropzone-file-viewer.component.d.ts +25 -25
  31. package/components/ngt-dropzone/ngt-dropzone-view/ngt-dropzone-view.component.d.ts +35 -35
  32. package/components/ngt-dropzone/ngt-dropzone.component.d.ts +95 -95
  33. package/components/ngt-dropzone/ngt-dropzone.meta.d.ts +27 -27
  34. package/components/ngt-dropzone/ngt-dropzone.module.d.ts +17 -17
  35. package/components/ngt-floating-button/ngt-floating-button.component.d.ts +35 -35
  36. package/components/ngt-floating-button/ngt-floating-button.module.d.ts +10 -10
  37. package/components/ngt-form/ngt-form-validation-message/ngt-form-validation-message.component.d.ts +10 -10
  38. package/components/ngt-form/ngt-form.component.d.ts +60 -60
  39. package/components/ngt-form/ngt-form.module.d.ts +9 -9
  40. package/components/ngt-header-nav/ngt-header-nav.component.d.ts +14 -14
  41. package/components/ngt-header-nav/ngt-header-nav.module.d.ts +8 -8
  42. package/components/ngt-helper/ngt-helper.component.d.ts +25 -25
  43. package/components/ngt-helper/ngt-helper.module.d.ts +10 -10
  44. package/components/ngt-input/ngt-input.component.d.ts +129 -129
  45. package/components/ngt-input/ngt-input.module.d.ts +14 -14
  46. package/components/ngt-modal/ngt-modal-body/ngt-modal-body.component.d.ts +17 -17
  47. package/components/ngt-modal/ngt-modal-footer/ngt-modal-footer.component.d.ts +12 -12
  48. package/components/ngt-modal/ngt-modal-header/ngt-modal-header.component.d.ts +15 -15
  49. package/components/ngt-modal/ngt-modal.component.d.ts +31 -31
  50. package/components/ngt-modal/ngt-modal.module.d.ts +11 -11
  51. package/components/ngt-multi-select/ngt-multi-select.component.d.ts +116 -116
  52. package/components/ngt-multi-select/ngt-multi-select.module.d.ts +15 -15
  53. package/components/ngt-pagination/ngt-pagination.component.d.ts +43 -43
  54. package/components/ngt-pagination/ngt-pagination.module.d.ts +12 -12
  55. package/components/ngt-popover/ngt-popover-tooltip/ngt-popover-tooltip.component.d.ts +21 -21
  56. package/components/ngt-popover/ngt-popover.component.d.ts +31 -31
  57. package/components/ngt-popover/ngt-popover.directive.d.ts +31 -31
  58. package/components/ngt-popover/ngt-popover.module.d.ts +11 -11
  59. package/components/ngt-portlet/ngt-portlet-body/ngt-portlet-body.component.d.ts +12 -12
  60. package/components/ngt-portlet/ngt-portlet-footer/ngt-portlet-footer.component.d.ts +12 -12
  61. package/components/ngt-portlet/ngt-portlet-header/ngt-portlet-header.component.d.ts +18 -18
  62. package/components/ngt-portlet/ngt-portlet.component.d.ts +20 -20
  63. package/components/ngt-portlet/ngt-portlet.module.d.ts +13 -13
  64. package/components/ngt-radio-button/ngt-radio-button-container/ngt-radio-button-container.component.d.ts +9 -9
  65. package/components/ngt-radio-button/ngt-radio-button.component.d.ts +45 -45
  66. package/components/ngt-radio-button/ngt-radio-button.module.d.ts +11 -11
  67. package/components/ngt-section/ngt-section.component.d.ts +38 -38
  68. package/components/ngt-section/ngt-section.module.d.ts +11 -11
  69. package/components/ngt-select/ngt-select.component.d.ts +154 -154
  70. package/components/ngt-select/ngt-select.directive.d.ts +20 -20
  71. package/components/ngt-select/ngt-select.module.d.ts +16 -16
  72. package/components/ngt-shining/ngt-shining.component.d.ts +19 -19
  73. package/components/ngt-shining/ngt-shining.module.d.ts +8 -8
  74. package/components/ngt-sidenav/ngt-sidenav.component.d.ts +32 -32
  75. package/components/ngt-sidenav/ngt-sidenav.module.d.ts +8 -8
  76. package/components/ngt-slider/ngt-slider.component.d.ts +36 -36
  77. package/components/ngt-slider/ngt-slider.module.d.ts +9 -9
  78. package/components/ngt-svg/ngt-svg.component.d.ts +13 -13
  79. package/components/ngt-svg/ngt-svg.module.d.ts +10 -10
  80. package/components/ngt-tag/ngt-tag.component.d.ts +13 -13
  81. package/components/ngt-tag/ngt-tag.module.d.ts +9 -9
  82. package/components/ngt-textarea/ngt-textarea.component.d.ts +49 -49
  83. package/components/ngt-textarea/ngt-textarea.module.d.ts +13 -13
  84. package/components/ngt-validation/ngt-validation.component.d.ts +13 -13
  85. package/components/ngt-validation/ngt-validation.module.d.ts +8 -8
  86. package/directives/ngt-stylizable/ngt-stylizable.directive.d.ts +68 -68
  87. package/directives/ngt-stylizable/ngt-stylizable.module.d.ts +8 -8
  88. package/enums/size.enum.d.ts +8 -8
  89. package/esm2020/animations/ngt-angular-animations.mjs +34 -34
  90. package/esm2020/base/ngt-base-ng-model.mjs +90 -90
  91. package/esm2020/components/ngt-action/ngt-action.component.mjs +96 -96
  92. package/esm2020/components/ngt-action/ngt-action.module.mjs +28 -28
  93. package/esm2020/components/ngt-button/ngt-button.component.mjs +142 -142
  94. package/esm2020/components/ngt-button/ngt-button.module.mjs +28 -28
  95. package/esm2020/components/ngt-checkbox/ngt-checkbox.component.mjs +192 -192
  96. package/esm2020/components/ngt-checkbox/ngt-checkbox.module.mjs +28 -28
  97. package/esm2020/components/ngt-content/ngt-content.component.mjs +32 -32
  98. package/esm2020/components/ngt-content/ngt-content.module.mjs +20 -20
  99. package/esm2020/components/ngt-context-menu/ngt-context-menu.component.mjs +25 -25
  100. package/esm2020/components/ngt-context-menu/ngt-context-menu.directive.mjs +89 -89
  101. package/esm2020/components/ngt-context-menu/ngt-context-menu.module.mjs +33 -33
  102. package/esm2020/components/ngt-datatable/ngt-datatable.component.mjs +470 -470
  103. package/esm2020/components/ngt-datatable/ngt-datatable.module.mjs +99 -99
  104. package/esm2020/components/ngt-datatable/ngt-tbody/ngt-tbody.component.mjs +57 -57
  105. package/esm2020/components/ngt-datatable/ngt-td/ngt-td.component.mjs +62 -62
  106. package/esm2020/components/ngt-datatable/ngt-td-check/ngt-td-check.component.mjs +113 -113
  107. package/esm2020/components/ngt-datatable/ngt-th/ngt-th.component.mjs +228 -228
  108. package/esm2020/components/ngt-datatable/ngt-th-check/ngt-th-check.component.mjs +127 -127
  109. package/esm2020/components/ngt-datatable/ngt-thead/ngt-thead.component.mjs +55 -55
  110. package/esm2020/components/ngt-datatable/ngt-tr/ngt-tr.component.mjs +86 -86
  111. package/esm2020/components/ngt-date/ngt-date.component.mjs +435 -435
  112. package/esm2020/components/ngt-date/ngt-date.module.mjs +40 -40
  113. package/esm2020/components/ngt-dropdown/ngt-dropdown-container/ngt-dropdown-container.component.mjs +19 -19
  114. package/esm2020/components/ngt-dropdown/ngt-dropdown.component.mjs +204 -204
  115. package/esm2020/components/ngt-dropdown/ngt-dropdown.module.mjs +21 -21
  116. package/esm2020/components/ngt-dropzone/custom-dropzone-preview/custom-dropzone-preview.component.mjs +54 -54
  117. package/esm2020/components/ngt-dropzone/ngt-dropzone-file-viewer/ngt-dropzone-file-viewer.component.mjs +69 -66
  118. package/esm2020/components/ngt-dropzone/ngt-dropzone-view/ngt-dropzone-view.component.mjs +94 -94
  119. package/esm2020/components/ngt-dropzone/ngt-dropzone.component.mjs +496 -496
  120. package/esm2020/components/ngt-dropzone/ngt-dropzone.meta.mjs +24 -24
  121. package/esm2020/components/ngt-dropzone/ngt-dropzone.module.mjs +55 -55
  122. package/esm2020/components/ngt-floating-button/ngt-floating-button.component.mjs +119 -119
  123. package/esm2020/components/ngt-floating-button/ngt-floating-button.module.mjs +28 -28
  124. package/esm2020/components/ngt-form/ngt-form-validation-message/ngt-form-validation-message.component.mjs +22 -22
  125. package/esm2020/components/ngt-form/ngt-form.component.mjs +207 -207
  126. package/esm2020/components/ngt-form/ngt-form.module.mjs +29 -29
  127. package/esm2020/components/ngt-header-nav/ngt-header-nav.component.mjs +39 -39
  128. package/esm2020/components/ngt-header-nav/ngt-header-nav.module.mjs +20 -20
  129. package/esm2020/components/ngt-helper/ngt-helper.component.mjs +68 -68
  130. package/esm2020/components/ngt-helper/ngt-helper.module.mjs +28 -28
  131. package/esm2020/components/ngt-input/ngt-input.component.mjs +844 -844
  132. package/esm2020/components/ngt-input/ngt-input.module.mjs +47 -47
  133. package/esm2020/components/ngt-modal/ngt-modal-body/ngt-modal-body.component.mjs +46 -46
  134. package/esm2020/components/ngt-modal/ngt-modal-footer/ngt-modal-footer.component.mjs +33 -33
  135. package/esm2020/components/ngt-modal/ngt-modal-header/ngt-modal-header.component.mjs +40 -40
  136. package/esm2020/components/ngt-modal/ngt-modal.component.mjs +122 -122
  137. package/esm2020/components/ngt-modal/ngt-modal.module.mjs +39 -39
  138. package/esm2020/components/ngt-multi-select/ngt-multi-select.component.mjs +503 -503
  139. package/esm2020/components/ngt-multi-select/ngt-multi-select.module.mjs +52 -52
  140. package/esm2020/components/ngt-pagination/ngt-pagination.component.mjs +162 -162
  141. package/esm2020/components/ngt-pagination/ngt-pagination.module.mjs +36 -36
  142. package/esm2020/components/ngt-popover/ngt-popover-tooltip/ngt-popover-tooltip.component.mjs +58 -58
  143. package/esm2020/components/ngt-popover/ngt-popover.component.mjs +85 -85
  144. package/esm2020/components/ngt-popover/ngt-popover.directive.mjs +126 -126
  145. package/esm2020/components/ngt-popover/ngt-popover.module.mjs +36 -36
  146. package/esm2020/components/ngt-portlet/ngt-portlet-body/ngt-portlet-body.component.mjs +34 -34
  147. package/esm2020/components/ngt-portlet/ngt-portlet-footer/ngt-portlet-footer.component.mjs +35 -35
  148. package/esm2020/components/ngt-portlet/ngt-portlet-header/ngt-portlet-header.component.mjs +57 -57
  149. package/esm2020/components/ngt-portlet/ngt-portlet.component.mjs +74 -74
  150. package/esm2020/components/ngt-portlet/ngt-portlet.module.mjs +47 -47
  151. package/esm2020/components/ngt-radio-button/ngt-radio-button-container/ngt-radio-button-container.component.mjs +19 -19
  152. package/esm2020/components/ngt-radio-button/ngt-radio-button.component.mjs +153 -153
  153. package/esm2020/components/ngt-radio-button/ngt-radio-button.module.mjs +29 -29
  154. package/esm2020/components/ngt-section/ngt-section.component.mjs +151 -151
  155. package/esm2020/components/ngt-section/ngt-section.module.mjs +32 -32
  156. package/esm2020/components/ngt-select/ngt-select.component.mjs +670 -670
  157. package/esm2020/components/ngt-select/ngt-select.directive.mjs +36 -36
  158. package/esm2020/components/ngt-select/ngt-select.module.mjs +65 -65
  159. package/esm2020/components/ngt-shining/ngt-shining.component.mjs +40 -40
  160. package/esm2020/components/ngt-shining/ngt-shining.module.mjs +20 -20
  161. package/esm2020/components/ngt-sidenav/ngt-sidenav.component.mjs +132 -132
  162. package/esm2020/components/ngt-sidenav/ngt-sidenav.module.mjs +20 -20
  163. package/esm2020/components/ngt-slider/ngt-slider.component.mjs +100 -100
  164. package/esm2020/components/ngt-slider/ngt-slider.module.mjs +24 -24
  165. package/esm2020/components/ngt-svg/ngt-svg.component.mjs +53 -53
  166. package/esm2020/components/ngt-svg/ngt-svg.module.mjs +28 -28
  167. package/esm2020/components/ngt-tag/ngt-tag.component.mjs +37 -37
  168. package/esm2020/components/ngt-tag/ngt-tag.module.mjs +24 -24
  169. package/esm2020/components/ngt-textarea/ngt-textarea.component.mjs +238 -238
  170. package/esm2020/components/ngt-textarea/ngt-textarea.module.mjs +43 -43
  171. package/esm2020/components/ngt-validation/ngt-validation.component.mjs +26 -26
  172. package/esm2020/components/ngt-validation/ngt-validation.module.mjs +20 -20
  173. package/esm2020/directives/ngt-stylizable/ngt-stylizable.directive.mjs +290 -290
  174. package/esm2020/directives/ngt-stylizable/ngt-stylizable.module.mjs +20 -20
  175. package/esm2020/enums/size.enum.mjs +11 -11
  176. package/esm2020/helpers/enum/enum.mjs +7 -7
  177. package/esm2020/helpers/form/form.mjs +14 -14
  178. package/esm2020/helpers/input-mask/input-mask.helper.mjs +26 -26
  179. package/esm2020/helpers/promise/promise-helper.mjs +4 -4
  180. package/esm2020/helpers/routing/route.mjs +11 -11
  181. package/esm2020/helpers/uuid.mjs +10 -10
  182. package/esm2020/ng-tailwind.mjs +4 -4
  183. package/esm2020/public-api.mjs +127 -127
  184. package/esm2020/services/http/ngt-attachment-http.service.mjs +3 -3
  185. package/esm2020/services/http/ngt-http-form.service.mjs +3 -3
  186. package/esm2020/services/http/ngt-http-resource.service.mjs +3 -3
  187. package/esm2020/services/http/ngt-http-validation.service.mjs +3 -3
  188. package/esm2020/services/http/ngt-http.service.mjs +3 -3
  189. package/esm2020/services/http/ngt-translate.service.mjs +3 -3
  190. package/esm2020/services/ngt-stylizable/ngt-stylizable.service.mjs +273 -273
  191. package/esm2020/services/validation/ngt-ability-validation.service.mjs +3 -3
  192. package/fesm2015/ng-tailwind.mjs +8656 -8653
  193. package/fesm2015/ng-tailwind.mjs.map +1 -1
  194. package/fesm2020/ng-tailwind.mjs +8481 -8478
  195. package/fesm2020/ng-tailwind.mjs.map +1 -1
  196. package/helpers/enum/enum.d.ts +1 -1
  197. package/helpers/form/form.d.ts +4 -4
  198. package/helpers/input-mask/input-mask.helper.d.ts +20 -20
  199. package/helpers/promise/promise-helper.d.ts +1 -1
  200. package/helpers/routing/route.d.ts +2 -2
  201. package/helpers/uuid.d.ts +1 -1
  202. package/index.d.ts +5 -5
  203. package/package.json +1 -1
  204. package/public-api.d.ts +87 -87
  205. package/services/http/ngt-attachment-http.service.d.ts +9 -9
  206. package/services/http/ngt-http-form.service.d.ts +5 -5
  207. package/services/http/ngt-http-resource.service.d.ts +12 -12
  208. package/services/http/ngt-http-validation.service.d.ts +12 -12
  209. package/services/http/ngt-http.service.d.ts +27 -27
  210. package/services/http/ngt-translate.service.d.ts +33 -33
  211. package/services/ngt-stylizable/ngt-stylizable.service.d.ts +96 -96
  212. package/services/validation/ngt-ability-validation.service.d.ts +5 -5
@@ -1,844 +1,844 @@
1
- import { Component, EventEmitter, Host, Input, Optional, Output, Self, SkipSelf, ViewChild, } from '@angular/core';
2
- import { ControlContainer, NgForm, Validators } from '@angular/forms';
3
- import { NgtBaseNgModel, NgtMakeProvider } from '../../base/ngt-base-ng-model';
4
- import { applyInputMask, InputMaskEnum, removeInputMask } from '../../helpers/input-mask/input-mask.helper';
5
- import { NgtStylizableService } from '../../services/ngt-stylizable/ngt-stylizable.service';
6
- import * as i0 from "@angular/core";
7
- import * as i1 from "../../directives/ngt-stylizable/ngt-stylizable.directive";
8
- import * as i2 from "@angular/forms";
9
- import * as i3 from "../ngt-form/ngt-form.component";
10
- import * as i4 from "../../services/http/ngt-http-validation.service";
11
- import * as i5 from "../../services/http/ngt-http-resource.service";
12
- import * as i6 from "../ngt-section/ngt-section.component";
13
- import * as i7 from "../ngt-modal/ngt-modal.component";
14
- import * as i8 from "../../services/http/ngt-translate.service";
15
- import * as i9 from "@angular/common";
16
- import * as i10 from "../ngt-validation/ngt-validation.component";
17
- import * as i11 from "../ngt-shining/ngt-shining.component";
18
- import * as i12 from "../ngt-svg/ngt-svg.component";
19
- import * as i13 from "../ngt-helper/ngt-helper.component";
20
- export class NgtInputComponent extends NgtBaseNgModel {
21
- constructor(injector, renderer, changeDetector, ngtStylizableDirective, formContainer, ngtFormComponent, ngtValidationService, ngtResourceService, ngtForm, ngtSection, ngtModal, ngtTranslateService) {
22
- super();
23
- this.injector = injector;
24
- this.renderer = renderer;
25
- this.changeDetector = changeDetector;
26
- this.ngtStylizableDirective = ngtStylizableDirective;
27
- this.formContainer = formContainer;
28
- this.ngtFormComponent = ngtFormComponent;
29
- this.ngtValidationService = ngtValidationService;
30
- this.ngtResourceService = ngtResourceService;
31
- this.ngtForm = ngtForm;
32
- this.ngtSection = ngtSection;
33
- this.ngtModal = ngtModal;
34
- this.ngtTranslateService = ngtTranslateService;
35
- this.placeholder = '';
36
- this.helpTextColor = 'text-green-500';
37
- this.decimalMaskPrecision = 2;
38
- this.showCharactersLength = false;
39
- this.uppercase = false;
40
- this.helperAutoXReverse = true;
41
- this.type = 'text';
42
- this.onClickLeftIcon = new EventEmitter();
43
- this.onClickRightIcon = new EventEmitter();
44
- this.validatePhoneResult = new EventEmitter();
45
- this.inputProperties = {};
46
- this.subscriptions = [];
47
- if (this.ngtFormComponent) {
48
- this.shining = this.ngtFormComponent.isShining();
49
- this.subscriptions.push(this.ngtFormComponent.onShiningChange.subscribe((shining) => {
50
- this.shining = shining;
51
- }));
52
- }
53
- if (this.ngtStylizableDirective) {
54
- this.ngtStyle = this.ngtStylizableDirective.getNgtStylizableService();
55
- }
56
- else {
57
- this.ngtStyle = new NgtStylizableService();
58
- }
59
- this.ngtStyle.load(this.injector, 'NgtInput', {
60
- h: 'h-12',
61
- rounded: 'rounded',
62
- text: 'text-sm',
63
- font: 'font-normal',
64
- color: {
65
- border: 'border-gray-400 focus:border-gray-700',
66
- bg: 'bg-bg-white focus:bg-white',
67
- text: 'text-gray-800'
68
- }
69
- });
70
- }
71
- ngOnInit() {
72
- if (!this.formContainer) {
73
- console.error("The element must be inside a <form #form='ngForm'> tag!", this.element.nativeElement);
74
- }
75
- if (!this.name) {
76
- console.error("The element must contain a name attribute!", this.element.nativeElement);
77
- }
78
- else {
79
- setTimeout(() => {
80
- this.componentReady = true;
81
- this.changeDetector.detectChanges();
82
- setTimeout(() => {
83
- this.initComponent();
84
- this.changeDetector.detectChanges();
85
- if (!this.getElementTitle() || this.getElementTitle() === 'null') {
86
- this.element.nativeElement.parentElement.parentElement.title = '';
87
- }
88
- this.changeDetector.detectChanges();
89
- });
90
- }, 500);
91
- }
92
- }
93
- ngOnChanges(changes) {
94
- this.setupMasks(changes.mask ? changes.mask.previousValue : null);
95
- if (changes.match || changes.isRequired || changes.type || changes.mask || changes.minValue) {
96
- this.updateValidations();
97
- }
98
- }
99
- ngOnDestroy() {
100
- this.destroySubscriptions();
101
- }
102
- onNativeChange() {
103
- if (this.hasChangesBetweenModels()) {
104
- this.value = this.removeMasks(this.getNativeValue());
105
- }
106
- }
107
- change(value) {
108
- if (value && typeof value === 'string' && this.mask == 'decimal') {
109
- value = parseFloat(value);
110
- }
111
- if (!this.getNativeValue() || (this.validateMinValueOnMask)) {
112
- this.element.nativeElement.value = value ?? '';
113
- }
114
- if (!value && value !== 0) {
115
- this.clearInput();
116
- }
117
- let nativeValue = this.getNativeValue();
118
- if (this.mask) {
119
- let ngModelValue = this.removeMasks(nativeValue);
120
- if (nativeValue && ngModelValue != this.value) {
121
- this.value = ngModelValue;
122
- }
123
- if ((this.mask == InputMaskEnum.CELLPHONE || this.mask == InputMaskEnum.INTERNATIONAL_PHONE)
124
- && this.allowPhoneValidation && this.value) {
125
- this.validatePhone();
126
- }
127
- }
128
- else {
129
- let ngModelValue = this.removeMasks(value);
130
- if (value && ngModelValue != value) {
131
- this.value = ngModelValue;
132
- }
133
- if (this.value != nativeValue) {
134
- this.element.nativeElement.value = ngModelValue;
135
- }
136
- }
137
- if (this.componentReady) {
138
- this.onValueChangeEvent.emit(this.value);
139
- }
140
- if (this.ngtResourceService && this.findExistingResource && this.value) {
141
- this.searchExistingResource();
142
- }
143
- }
144
- setFocus() {
145
- setTimeout(() => {
146
- this.element.nativeElement.focus();
147
- }, 200);
148
- }
149
- clearInput(event) {
150
- if (event) {
151
- event.stopPropagation();
152
- }
153
- this.element.nativeElement.value = '';
154
- this.value = '';
155
- this.markAsPristine();
156
- }
157
- restorePlaceholder() {
158
- setTimeout(() => this.element.nativeElement.placeholder = this.placeholder);
159
- }
160
- showPassword() {
161
- this.element.nativeElement.type = 'text';
162
- this.changeDetector.detectChanges();
163
- }
164
- hidePassword() {
165
- this.element.nativeElement.type = 'password';
166
- this.changeDetector.detectChanges();
167
- }
168
- getInputPaddings() {
169
- let paddingClass = '';
170
- if (this.innerLeftIcon || this.customInnerContentTemplate) {
171
- paddingClass += 'pl-10 pr-4 ';
172
- }
173
- else {
174
- paddingClass += 'px-4 ';
175
- }
176
- if (this.innerRightIcon || this.allowClear || this.type == 'password') {
177
- if (this.allowClear && this.value && (this.innerRightIcon || this.type == 'password')) {
178
- paddingClass += 'pr-10 ';
179
- }
180
- else {
181
- paddingClass += 'pr-8 ';
182
- }
183
- }
184
- return paddingClass;
185
- }
186
- getRemainingCharacters() {
187
- if (this.element?.nativeElement?.value?.length) {
188
- if ((this.maxTotalCharsCount - this.element.nativeElement.value.length) > 0) {
189
- return this.maxTotalCharsCount - this.element.nativeElement.value.length;
190
- }
191
- else {
192
- return 0;
193
- }
194
- }
195
- return this.maxTotalCharsCount;
196
- }
197
- hasFocus() {
198
- return document.activeElement === this.element.nativeElement;
199
- }
200
- disabled() {
201
- return this.isDisabled || this.isDisabledByParent();
202
- }
203
- initComponent() {
204
- if (this.formContainer && this.formContainer.control && (this.formControl = this.formContainer.control.get(this.name))) {
205
- if (this.focus) {
206
- this.setFocus();
207
- }
208
- let watch = "change";
209
- if (this.jit) {
210
- watch += " keyup keydown keypress";
211
- }
212
- watch.split(' ').forEach((evt) => {
213
- this.renderer.listen(this.element.nativeElement, evt, () => {
214
- let nativeValue = this.removeMasks(this.getNativeValue());
215
- if (this.value != nativeValue) {
216
- this.value = nativeValue;
217
- }
218
- });
219
- });
220
- this.renderer.listen(this.element.nativeElement, "keydown", (event) => {
221
- if (this.element.nativeElement && this.element.nativeElement.value && this.element.nativeElement.value.length >= this.maxLength) {
222
- // Backspace and delete
223
- if (event.keyCode != 8 && event.keyCode != 46) {
224
- event.preventDefault();
225
- return false;
226
- }
227
- }
228
- });
229
- this.maxTotalCharsCount = this.maxLength;
230
- this.updateValidations();
231
- if (this.match) {
232
- this.renderer.listen(this.element.nativeElement, "keypress", () => {
233
- this.matchValidator();
234
- });
235
- }
236
- if (this.value) {
237
- this.formControl.markAsDirty();
238
- }
239
- else {
240
- this.formControl.markAsPristine();
241
- }
242
- }
243
- this.setupProperties();
244
- }
245
- updateValidations() {
246
- if (!this.formControl) {
247
- return;
248
- }
249
- const syncValidators = [];
250
- if (this.type == 'email') {
251
- syncValidators.push(Validators.email);
252
- }
253
- if (this.isRequired) {
254
- syncValidators.push(Validators.required);
255
- }
256
- if (this.maxLength) {
257
- syncValidators.push(Validators.maxLength(this.maxLength));
258
- }
259
- if (this.minLength) {
260
- syncValidators.push(Validators.minLength(this.minLength));
261
- }
262
- if (this.mask == 'cnpj-cpf' || this.mask == 'cnpj-cpf-rut' || this.mask == 'cpf') {
263
- syncValidators.push(this.cnpjCpfValidator());
264
- }
265
- if (this.mask == 'time') {
266
- syncValidators.push(this.timeValidator());
267
- }
268
- if (this.match) {
269
- syncValidators.push(this.matchValidator());
270
- }
271
- if (this.minValue !== undefined) {
272
- syncValidators.push(this.minValueValidator());
273
- }
274
- if (this.multipleOf) {
275
- syncValidators.push(this.multipleOfValidator());
276
- }
277
- if (this.externalServerDependency) {
278
- syncValidators.push(this.externalServerDependencyValidator());
279
- }
280
- setTimeout(() => {
281
- this.formControl.setValidators(syncValidators);
282
- const asyncValidators = [];
283
- if (this.uniqueResource) {
284
- asyncValidators.push(this.uniqueValidator());
285
- }
286
- if (this.type == 'email' && this.hasEmailServiceValidation()) {
287
- asyncValidators.push(this.emailValidator());
288
- }
289
- if (this.type == 'login' && this.hasEmailServiceValidation()) {
290
- asyncValidators.push(this.emailValidator(true));
291
- }
292
- if (this.type == 'password' && this.validatePassword && this.hasPasswordValidation()) {
293
- asyncValidators.push(this.passwordValidator());
294
- }
295
- if (this.customValidator) {
296
- asyncValidators.push(this.customValidator());
297
- }
298
- this.formControl.setAsyncValidators(asyncValidators);
299
- this.formControl.updateValueAndValidity();
300
- });
301
- }
302
- setupMasks(previousMask) {
303
- if (this.mask != previousMask && !this.mask) {
304
- removeInputMask(this.element.nativeElement);
305
- return this.clearInput();
306
- }
307
- let masks = {
308
- [InputMaskEnum.CPF]: {
309
- mask: ['999.999.999-99'],
310
- showMaskOnHover: false
311
- },
312
- [InputMaskEnum.CNPJ]: {
313
- mask: ['99.999.999/9999-99'],
314
- showMaskOnHover: false
315
- },
316
- [InputMaskEnum.CUIT]: {
317
- mask: ['99-99999999-9'],
318
- clearMaskOnLostFocus: false
319
- },
320
- [InputMaskEnum.RUT]: {
321
- mask: ['999999999999'],
322
- clearMaskOnLostFocus: false
323
- },
324
- [InputMaskEnum.CPF_CNPJ_RUT]: {
325
- mask: ['999.999.999-99', '999999999999', '99.999.999/9999-99'],
326
- keepStatic: true,
327
- showMaskOnHover: false
328
- },
329
- [InputMaskEnum.CPF_CNPJ]: {
330
- mask: ['999.999.999-99', '99.999.999/9999-99'],
331
- keepStatic: true,
332
- showMaskOnHover: false
333
- },
334
- [InputMaskEnum.DECIMAL]: {
335
- digits: this.decimalMaskPrecision,
336
- groupSeparator: '.',
337
- radixPoint: ',',
338
- autoGroup: true,
339
- repeat: 16,
340
- rightAlign: false,
341
- max: this.maxValue,
342
- showMaskOnHover: false
343
- },
344
- [InputMaskEnum.CELLPHONE]: {
345
- mask: ['(99) 999-999', '(99) 9999-9999', '(99) 99999-9999'],
346
- keepStatic: true,
347
- showMaskOnHover: false
348
- },
349
- [InputMaskEnum.INTERNATIONAL_PHONE]: {
350
- mask: ['+999 99 999-999', '+99 (99) 9999-9999', '+99 (99) 99999-9999', '+999 (99) 9999-9999', '+999 (99) 99999-9999'],
351
- keepStatic: true,
352
- showMaskOnHover: false
353
- },
354
- [InputMaskEnum.PLATE]: {
355
- mask: ['AAA-9&99'],
356
- keepStatic: true,
357
- showMaskOnHover: false
358
- },
359
- [InputMaskEnum.CEP]: {
360
- mask: ['99999-999'],
361
- showMaskOnHover: false
362
- },
363
- [InputMaskEnum.INTEGER]: {
364
- max: this.maxValue,
365
- min: this.validateMinValueOnMask ? this.minValue : undefined,
366
- rightAlign: false,
367
- showMaskOnHover: false
368
- },
369
- [InputMaskEnum.NUMERIC_STRING]: {
370
- regex: "[0-9]*",
371
- showMaskOnHover: false
372
- },
373
- [InputMaskEnum.TIME]: '99:99',
374
- };
375
- if (this.mask == InputMaskEnum.DECIMAL) {
376
- applyInputMask(this.element.nativeElement, InputMaskEnum.DECIMAL, masks[this.mask]);
377
- }
378
- else if (this.mask == InputMaskEnum.INTEGER) {
379
- applyInputMask(this.element.nativeElement, InputMaskEnum.INTEGER, masks[this.mask]);
380
- }
381
- else {
382
- applyInputMask(this.element.nativeElement, masks[this.mask]);
383
- }
384
- }
385
- setupProperties() {
386
- let props = {
387
- shortText: {
388
- htmlType: "text",
389
- length: 30
390
- },
391
- text: {
392
- htmlType: "text",
393
- length: 100
394
- },
395
- longText: {
396
- htmlType: "text",
397
- length: 150
398
- },
399
- extraLongText: {
400
- htmlType: "text",
401
- length: 300
402
- },
403
- customText: {
404
- htmlType: "text",
405
- length: this.maxLength
406
- },
407
- password: {
408
- htmlType: "password",
409
- length: 150
410
- },
411
- email: {
412
- htmlType: "text",
413
- length: 100,
414
- },
415
- decimal: {
416
- htmlType: "text",
417
- length: 9,
418
- }
419
- };
420
- if (this.type in props) {
421
- this.inputProperties = props[this.type];
422
- this.maxLength = this.inputProperties.length;
423
- }
424
- else {
425
- console.warn("Type [" + this.type + "] is not a valid tail-form-input type!", this.element.nativeElement);
426
- }
427
- }
428
- minValueValidator() {
429
- return (control) => parseFloat(control.value) < this.minValue ? { 'minValue': true } : null;
430
- }
431
- multipleOfValidator() {
432
- return (control) => {
433
- if (control.value) {
434
- return (control.value % this.multipleOf !== 0) ? { 'multipleOf': true } : null;
435
- }
436
- };
437
- }
438
- externalServerDependencyValidator() {
439
- // TODO: Validar tempo de requisição
440
- return (control) => !control.value ? { 'externalServerDependency': true } : null;
441
- }
442
- timeValidator() {
443
- const regexExp = new RegExp('^(0[0-9]|1[0-9]|2[0-3]):[0-5][0-9]$');
444
- return (control) => {
445
- if (control.value) {
446
- if (regexExp.test(control.value)) {
447
- return null;
448
- }
449
- else {
450
- return { 'time': true };
451
- }
452
- }
453
- };
454
- }
455
- cnpjCpfValidator() {
456
- return (control) => {
457
- if (!control.value) {
458
- return null;
459
- }
460
- if (control.value && control.value.length <= 11) {
461
- if (this.validatorCPF(control.value)) {
462
- return null;
463
- }
464
- else {
465
- return { 'cpf': true };
466
- }
467
- }
468
- else if (control.value && control.value.length == 12) {
469
- return null;
470
- }
471
- else {
472
- if (control.value && this.validatorCNPJ(control.value)) {
473
- return null;
474
- }
475
- else {
476
- return { 'cnpj': true };
477
- }
478
- }
479
- };
480
- }
481
- matchValidator() {
482
- return (control) => {
483
- if (this.value != this.match) {
484
- return { 'match': true };
485
- }
486
- else {
487
- return null;
488
- }
489
- };
490
- }
491
- emailValidator(isLoginValidation = false) {
492
- return (control) => {
493
- if (this.emailValidatorTimeout) {
494
- clearTimeout(this.emailValidatorTimeout);
495
- }
496
- if (this.value) {
497
- return new Promise((resolve) => {
498
- this.emailValidatorTimeout = setTimeout(() => {
499
- this.loading = true;
500
- this.ngtValidationService.emailValidation(this.value)
501
- .then((response) => {
502
- this.loading = false;
503
- if (isLoginValidation) {
504
- resolve(response.valid ? { 'login': true } : null);
505
- }
506
- resolve(response.valid ? null : { 'email': true });
507
- })
508
- .catch(() => {
509
- this.loading = false;
510
- resolve(null);
511
- });
512
- }, 500);
513
- });
514
- }
515
- return Promise.resolve(null);
516
- };
517
- }
518
- passwordValidator() {
519
- return (control) => {
520
- if (this.passwordValidatorTimeout) {
521
- clearTimeout(this.passwordValidatorTimeout);
522
- }
523
- if (this.value) {
524
- return new Promise((resolve) => {
525
- this.passwordValidatorTimeout = setTimeout(() => {
526
- this.loading = true;
527
- this.ngtValidationService.passwordValidation(this.value, this.passwordableId, this.passwordPolicyId)
528
- .then((response) => {
529
- this.loading = false;
530
- resolve(response.valid ? null : { 'invalid_password': true });
531
- })
532
- .catch(() => {
533
- this.loading = false;
534
- resolve(null);
535
- });
536
- }, 500);
537
- });
538
- }
539
- return Promise.resolve(null);
540
- };
541
- }
542
- async searchExistingResource() {
543
- if (this.searchExistingResourceTimeout) {
544
- clearTimeout(this.searchExistingResourceTimeout);
545
- }
546
- this.searchExistingResourceTimeout = setTimeout(() => {
547
- this.loading = true;
548
- this.findExistingResource.value = this.value;
549
- this.ngtResourceService.findExisting(this.findExistingResource)
550
- .then((response) => this.existingResourceId = response.id)
551
- .catch(() => this.existingResourceId = null)
552
- .finally(() => this.loading = false);
553
- }, 500);
554
- }
555
- async validatePhone() {
556
- if (this.phoneValidatorTimeout) {
557
- clearTimeout(this.phoneValidatorTimeout);
558
- }
559
- this.phoneValidatorTimeout = setTimeout(() => {
560
- this.loading = true;
561
- this.ngtValidationService.phoneValidation(this.value)
562
- .then((response) => this.validatePhoneResult.emit(response))
563
- .finally(() => this.loading = false);
564
- });
565
- }
566
- uniqueValidator() {
567
- if (!this.ngtValidationService) {
568
- throw new Error("In order to use unique validation you must provide a implementation for NgtHttpValidationService class!");
569
- }
570
- return (control) => {
571
- if (this.uniqueValidatorTimeout) {
572
- clearTimeout(this.uniqueValidatorTimeout);
573
- }
574
- if (this.value && this.uniqueResource) {
575
- return new Promise((resolve) => {
576
- this.uniqueValidatorTimeout = setTimeout(() => {
577
- this.loading = true;
578
- this.ngtValidationService.unique(this.uniqueResource, this.value).then((response) => {
579
- this.loading = false;
580
- resolve(response.valid ? null : { 'unique': true });
581
- }).catch(() => {
582
- this.loading = false;
583
- resolve(null);
584
- });
585
- }, 500);
586
- });
587
- }
588
- return Promise.resolve(null);
589
- };
590
- }
591
- validatorCNPJ(value) {
592
- let b = [6, 5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2];
593
- if ((value = value.replace(/[^\d]/g, "")).length != 14) {
594
- return false;
595
- }
596
- if (/0{14}/.test(value)) {
597
- return false;
598
- }
599
- let n = 0;
600
- for (let i = 0; i < 12; n += value[i] * b[++i]) {
601
- ;
602
- }
603
- if (value[12] != (((n %= 11) < 2) ? 0 : 11 - n)) {
604
- return false;
605
- }
606
- n = 0;
607
- for (let i = 0; i <= 12; n += value[i] * b[i++]) {
608
- ;
609
- }
610
- if (value[13] != (((n %= 11) < 2) ? 0 : 11 - n)) {
611
- return false;
612
- }
613
- return true;
614
- }
615
- ;
616
- validatorCPF(value) {
617
- let numeros, digitos, soma, i, resultado, digitos_iguais;
618
- digitos_iguais = 1;
619
- if (value.length < 11) {
620
- return false;
621
- }
622
- for (i = 0; i < value.length - 1; i++) {
623
- if (value.charAt(i) != value.charAt(i + 1)) {
624
- digitos_iguais = 0;
625
- break;
626
- }
627
- }
628
- if (!digitos_iguais) {
629
- numeros = value.substring(0, 9);
630
- digitos = value.substring(9);
631
- soma = 0;
632
- for (i = 10; i > 1; i--) {
633
- soma += numeros.charAt(10 - i) * i;
634
- }
635
- resultado = soma % 11 < 2 ? 0 : 11 - soma % 11;
636
- if (resultado != digitos.charAt(0)) {
637
- return false;
638
- }
639
- numeros = value.substring(0, 10);
640
- soma = 0;
641
- for (i = 11; i > 1; i--) {
642
- soma += numeros.charAt(11 - i) * i;
643
- }
644
- resultado = soma % 11 < 2 ? 0 : 11 - soma % 11;
645
- if (resultado != digitos.charAt(1)) {
646
- return false;
647
- }
648
- return true;
649
- }
650
- else {
651
- return false;
652
- }
653
- }
654
- getNativeValue() {
655
- return this.element.nativeElement.value;
656
- }
657
- getElementTitle() {
658
- return this.element.nativeElement.parentElement.parentElement.title;
659
- }
660
- removeMasks(value) {
661
- if (this.mask == "decimal") {
662
- value = (value + "")
663
- .replace(/\./g, '')
664
- .replace(',', '.');
665
- }
666
- else if (this.mask == "cnpj-cpf" || this.mask == "cpf" || this.mask == "cnpj" || this.mask == "cnpj-cpf-rut" || this.mask == "cuit") {
667
- value = (value + "")
668
- .replace(/[^\d]/g, '');
669
- }
670
- else if (this.mask == InputMaskEnum.CELLPHONE
671
- || this.mask == InputMaskEnum.INTERNATIONAL_PHONE) {
672
- value = (value + "")
673
- .replace('(', '')
674
- .replace(')', '')
675
- .replace(' ', '')
676
- .replace(' ', '')
677
- .replace('-', '')
678
- .replace('+', '');
679
- }
680
- return value;
681
- }
682
- hasEmailServiceValidation() {
683
- return typeof this.ngtValidationService?.emailValidation === 'function';
684
- }
685
- hasPasswordValidation() {
686
- return typeof this.ngtValidationService?.passwordValidation === 'function';
687
- }
688
- isDisabledByParent() {
689
- return this.ngtForm?.isDisabled
690
- || this.ngtSection?.isDisabled
691
- || this.ngtModal?.isDisabled;
692
- }
693
- hasChangesBetweenModels() {
694
- return this.removeMasks(this.getNativeValue()) !== this.value;
695
- }
696
- destroySubscriptions() {
697
- this.subscriptions.forEach(subscription => subscription.unsubscribe());
698
- this.subscriptions = [];
699
- }
700
- }
701
- NgtInputComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.8", ngImport: i0, type: NgtInputComponent, deps: [{ token: i0.Injector }, { token: i0.Renderer2 }, { token: i0.ChangeDetectorRef }, { token: i1.NgtStylizableDirective, optional: true, self: true }, { token: i2.ControlContainer, host: true, optional: true }, { token: i3.NgtFormComponent, optional: true, skipSelf: true }, { token: i4.NgtHttpValidationService, optional: true, skipSelf: true }, { token: i5.NgtHttpResourceService, optional: true, skipSelf: true }, { token: i3.NgtFormComponent, optional: true, skipSelf: true }, { token: i6.NgtSectionComponent, optional: true, skipSelf: true }, { token: i7.NgtModalComponent, optional: true, skipSelf: true }, { token: i8.NgtTranslateService, optional: true }], target: i0.ɵɵFactoryTarget.Component });
702
- NgtInputComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.8", type: NgtInputComponent, selector: "ngt-input", inputs: { label: "label", placeholder: "placeholder", shining: "shining", loading: "loading", helpTitle: "helpTitle", helpTextColor: "helpTextColor", helpText: "helpText", innerLeftIcon: "innerLeftIcon", innerLeftIconColor: "innerLeftIconColor", innerRightIcon: "innerRightIcon", innerRightIconColor: "innerRightIconColor", decimalMaskPrecision: "decimalMaskPrecision", showCharactersLength: "showCharactersLength", uppercase: "uppercase", customInnerContentTemplate: "customInnerContentTemplate", helperReverseYPosition: "helperReverseYPosition", helperAutoXReverse: "helperAutoXReverse", isDisabled: "isDisabled", isReadonly: "isReadonly", showRoundedIcon: "showRoundedIcon", type: "type", name: "name", mask: "mask", focus: "focus", allowClear: "allowClear", jit: "jit", useInputEvent: "useInputEvent", findExistingResource: "findExistingResource", allowPhoneValidation: "allowPhoneValidation", validatePassword: "validatePassword", passwordableId: "passwordableId", passwordPolicyId: "passwordPolicyId", isRequired: "isRequired", uniqueResource: "uniqueResource", minValue: "minValue", maxValue: "maxValue", maxLength: "maxLength", minLength: "minLength", match: "match", multipleOf: "multipleOf", validateMinValueOnMask: "validateMinValueOnMask", externalServerDependency: "externalServerDependency", customValidator: "customValidator" }, outputs: { onClickLeftIcon: "onClickLeftIcon", onClickRightIcon: "onClickRightIcon", validatePhoneResult: "validatePhoneResult" }, providers: [
703
- NgtMakeProvider(NgtInputComponent),
704
- ], viewQueries: [{ propertyName: "element", first: true, predicate: ["element"], descendants: true, static: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<label *ngIf=\"label\" class=\"mb-2 flex {{ ngtStyle.compile(['color.text', 'text', 'font']) }}\" [hidden]='shining'>\n {{ label }}:\n\n <span *ngIf=\"isRequired\" class=\"text-red-500 font-bold text-md ml-1\">*</span>\n\n <ngt-helper *ngIf=\"helpText\" [helpTitle]=\"helpTitle\" [iconColor]=\"helpTextColor\"\n [helperReverseYPosition]=\"helperReverseYPosition\" [autoXReverse]=\"helperAutoXReverse\" class=\"ml-1\">\n <span [innerHtml]=\"helpText\"></span>\n </ngt-helper>\n</label>\n\n<div class=\"{{ shining ? 'hidden' : 'flex relative'}}\">\n <input autocomplete=\"new-password\"\n class=\"flex border appearance-none focus:outline-none leading-tight w-full {{ getInputPaddings() }} {{ ngtStyle.compile(['h', 'text', 'color.border', 'color.bg', 'color.text', 'rounded', 'cursor']) }}\"\n [disabled]=\"disabled()\" [readonly]=\"isReadonly || loading\" [placeholder]=\"placeholder\"\n [style]=\"uppercase ? 'text-transform: uppercase!important':''\"\n [ngClass]=\"{'input-has-error border-red-700': formControl?.errors && (formControl?.dirty || (formContainer && formContainer['submitted']))}\"\n [attr.type]=\"inputProperties.htmlType\" (mouseleave)=\"restorePlaceholder()\" (focusout)=\"restorePlaceholder()\"\n (input)=\"useInputEvent ? onNativeChange() : null\" (change)=\"!useInputEvent ? onNativeChange() : null\" #element>\n <span *ngIf=\"innerLeftIcon\"\n class=\"absolute self-center px-2 {{ innerLeftIconColor }} {{ onClickLeftIcon ? 'cursor-pointer' : '' }}\"\n (click)=\"onClickLeftIcon.emit()\">\n\n <ngt-svg *ngIf=\"!showRoundedIcon\" class=\"text-xs fill-current\" [src]='innerLeftIcon'></ngt-svg>\n <img *ngIf=\"showRoundedIcon\" class=\"rounded-full h-4\" [src]='innerLeftIcon'>\n </span>\n\n <div *ngIf=\"customInnerContentTemplate\" class=\"absolute self-center px-2\">\n <ng-container [ngTemplateOutlet]=\"customInnerContentTemplate\"></ng-container>\n </div>\n\n <div class=\"flex absolute h-full justify-end right-0 w-auto\">\n <span *ngIf=\"!disabled() && allowClear && value && !loading\"\n class=\"self-center right-0 px-2 text-red-400 cursor-pointer\" (click)='clearInput($event)'>\n <svg class=\"fill-current self-center\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\">\n <path\n d=\"M19.1 17.2l-5.3-5.3 5.3-5.3-1.8-1.8-5.3 5.4-5.3-5.3-1.8 1.7 5.3 5.3-5.3 5.3L6.7 19l5.3-5.3 5.3 5.3 1.8-1.8z\" />\n </svg>\n </span>\n\n <span *ngIf=\"loading\" class=\"self-center right-0 px-2 text-gray-500\">\n <div class=\"div-loader\"></div>\n </span>\n\n <span *ngIf=\"type == 'password' && value\" class=\"self-center px-2 cursor-pointer\">\n <svg *ngIf=\"element.type == 'password'\" class=\"fill-current\" xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 20 20\" (click)='showPassword()'>\n <path\n d=\"M.2 10a11 11 0 0 1 19.6 0A11 11 0 0 1 .2 10zm9.8 4a4 4 0 1 0 0-8 4 4 0 0 0 0 8zm0-2a2 2 0 1 1 0-4 2 2 0 0 1 0 4z\" />\n </svg>\n\n <svg *ngIf=\"element.type == 'text'\" class=\"fill-current\" xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 20 20\" (click)='hidePassword()'>\n <path\n d=\"M12.81 4.36l-1.77 1.78a4 4 0 0 0-4.9 4.9l-2.76 2.75C2.06 12.79.96 11.49.2 10a11 11 0 0 1 12.6-5.64zm3.8 1.85c1.33 1 2.43 2.3 3.2 3.79a11 11 0 0 1-12.62 5.64l1.77-1.78a4 4 0 0 0 4.9-4.9l2.76-2.75zm-.25-3.99l1.42 1.42L3.64 17.78l-1.42-1.42L16.36 2.22z\" />\n </svg>\n </span>\n\n <span *ngIf=\"innerRightIcon && type != 'password'\"\n class=\"self-center px-2 {{ innerRightIconColor }} {{ onClickRightIcon ? 'cursor-pointer' : '' }}\"\n (click)=\"onClickRightIcon.emit()\">\n <ngt-svg class=\"text-xxs fill-current\" [src]='innerRightIcon'></ngt-svg>\n </span>\n </div>\n</div>\n\n<ng-container *ngIf=\"showCharactersLength && maxTotalCharsCount && !shining\">\n <p class=\"text-xxs mt-1\">\n {{ ngtTranslateService.ngtTextAreaRemainingCharacters }}:\n <span class=\"font-semibold\">{{ getRemainingCharacters() }}</span>\n </p>\n</ng-container>\n\n<ng-container *ngIf='shining'>\n <div class=\"flex\">\n <ngt-shining class=\"{{ ngtStyle.compile(['h']) }} w-full\"></ngt-shining>\n </div>\n</ng-container>\n\n<input *ngIf='componentReady' type=\"hidden\" [ngModel]=\"value\" [name]=\"name\" [value]=\"value\">\n\n<ng-content></ng-content>\n\n<ngt-validation [control]=\"formControl\" [container]=\"formContainer\" [minValue]='minValue' [minLength]='minLength'>\n</ngt-validation>\n", styles: [".div-loader{width:20px;height:20px;border:3px solid #a0aec038;border-top-color:#a0aec0;border-radius:50%;animation:spin 1s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}\n"], dependencies: [{ kind: "directive", type: i9.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i9.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i9.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i10.NgtValidationComponent, selector: "ngt-validation", inputs: ["control", "container", "minValue", "minLength"] }, { kind: "component", type: i11.NgtShiningComponent, selector: "ngt-shining", inputs: ["shiningWidth"] }, { kind: "component", type: i12.NgtSvgComponent, selector: "ngt-svg", inputs: ["src", "class"] }, { kind: "component", type: i13.NgtHelperComponent, selector: "ngt-helper", inputs: ["helpTextColor", "helpText", "helpTitle", "icon", "iconSize", "iconColor", "iconTitle", "tooltipSize", "autoXReverse", "helperReverseYPosition"] }], viewProviders: [
705
- { provide: ControlContainer, useExisting: NgForm }
706
- ] });
707
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.8", ngImport: i0, type: NgtInputComponent, decorators: [{
708
- type: Component,
709
- args: [{ selector: 'ngt-input', providers: [
710
- NgtMakeProvider(NgtInputComponent),
711
- ], viewProviders: [
712
- { provide: ControlContainer, useExisting: NgForm }
713
- ], template: "<label *ngIf=\"label\" class=\"mb-2 flex {{ ngtStyle.compile(['color.text', 'text', 'font']) }}\" [hidden]='shining'>\n {{ label }}:\n\n <span *ngIf=\"isRequired\" class=\"text-red-500 font-bold text-md ml-1\">*</span>\n\n <ngt-helper *ngIf=\"helpText\" [helpTitle]=\"helpTitle\" [iconColor]=\"helpTextColor\"\n [helperReverseYPosition]=\"helperReverseYPosition\" [autoXReverse]=\"helperAutoXReverse\" class=\"ml-1\">\n <span [innerHtml]=\"helpText\"></span>\n </ngt-helper>\n</label>\n\n<div class=\"{{ shining ? 'hidden' : 'flex relative'}}\">\n <input autocomplete=\"new-password\"\n class=\"flex border appearance-none focus:outline-none leading-tight w-full {{ getInputPaddings() }} {{ ngtStyle.compile(['h', 'text', 'color.border', 'color.bg', 'color.text', 'rounded', 'cursor']) }}\"\n [disabled]=\"disabled()\" [readonly]=\"isReadonly || loading\" [placeholder]=\"placeholder\"\n [style]=\"uppercase ? 'text-transform: uppercase!important':''\"\n [ngClass]=\"{'input-has-error border-red-700': formControl?.errors && (formControl?.dirty || (formContainer && formContainer['submitted']))}\"\n [attr.type]=\"inputProperties.htmlType\" (mouseleave)=\"restorePlaceholder()\" (focusout)=\"restorePlaceholder()\"\n (input)=\"useInputEvent ? onNativeChange() : null\" (change)=\"!useInputEvent ? onNativeChange() : null\" #element>\n <span *ngIf=\"innerLeftIcon\"\n class=\"absolute self-center px-2 {{ innerLeftIconColor }} {{ onClickLeftIcon ? 'cursor-pointer' : '' }}\"\n (click)=\"onClickLeftIcon.emit()\">\n\n <ngt-svg *ngIf=\"!showRoundedIcon\" class=\"text-xs fill-current\" [src]='innerLeftIcon'></ngt-svg>\n <img *ngIf=\"showRoundedIcon\" class=\"rounded-full h-4\" [src]='innerLeftIcon'>\n </span>\n\n <div *ngIf=\"customInnerContentTemplate\" class=\"absolute self-center px-2\">\n <ng-container [ngTemplateOutlet]=\"customInnerContentTemplate\"></ng-container>\n </div>\n\n <div class=\"flex absolute h-full justify-end right-0 w-auto\">\n <span *ngIf=\"!disabled() && allowClear && value && !loading\"\n class=\"self-center right-0 px-2 text-red-400 cursor-pointer\" (click)='clearInput($event)'>\n <svg class=\"fill-current self-center\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\">\n <path\n d=\"M19.1 17.2l-5.3-5.3 5.3-5.3-1.8-1.8-5.3 5.4-5.3-5.3-1.8 1.7 5.3 5.3-5.3 5.3L6.7 19l5.3-5.3 5.3 5.3 1.8-1.8z\" />\n </svg>\n </span>\n\n <span *ngIf=\"loading\" class=\"self-center right-0 px-2 text-gray-500\">\n <div class=\"div-loader\"></div>\n </span>\n\n <span *ngIf=\"type == 'password' && value\" class=\"self-center px-2 cursor-pointer\">\n <svg *ngIf=\"element.type == 'password'\" class=\"fill-current\" xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 20 20\" (click)='showPassword()'>\n <path\n d=\"M.2 10a11 11 0 0 1 19.6 0A11 11 0 0 1 .2 10zm9.8 4a4 4 0 1 0 0-8 4 4 0 0 0 0 8zm0-2a2 2 0 1 1 0-4 2 2 0 0 1 0 4z\" />\n </svg>\n\n <svg *ngIf=\"element.type == 'text'\" class=\"fill-current\" xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 20 20\" (click)='hidePassword()'>\n <path\n d=\"M12.81 4.36l-1.77 1.78a4 4 0 0 0-4.9 4.9l-2.76 2.75C2.06 12.79.96 11.49.2 10a11 11 0 0 1 12.6-5.64zm3.8 1.85c1.33 1 2.43 2.3 3.2 3.79a11 11 0 0 1-12.62 5.64l1.77-1.78a4 4 0 0 0 4.9-4.9l2.76-2.75zm-.25-3.99l1.42 1.42L3.64 17.78l-1.42-1.42L16.36 2.22z\" />\n </svg>\n </span>\n\n <span *ngIf=\"innerRightIcon && type != 'password'\"\n class=\"self-center px-2 {{ innerRightIconColor }} {{ onClickRightIcon ? 'cursor-pointer' : '' }}\"\n (click)=\"onClickRightIcon.emit()\">\n <ngt-svg class=\"text-xxs fill-current\" [src]='innerRightIcon'></ngt-svg>\n </span>\n </div>\n</div>\n\n<ng-container *ngIf=\"showCharactersLength && maxTotalCharsCount && !shining\">\n <p class=\"text-xxs mt-1\">\n {{ ngtTranslateService.ngtTextAreaRemainingCharacters }}:\n <span class=\"font-semibold\">{{ getRemainingCharacters() }}</span>\n </p>\n</ng-container>\n\n<ng-container *ngIf='shining'>\n <div class=\"flex\">\n <ngt-shining class=\"{{ ngtStyle.compile(['h']) }} w-full\"></ngt-shining>\n </div>\n</ng-container>\n\n<input *ngIf='componentReady' type=\"hidden\" [ngModel]=\"value\" [name]=\"name\" [value]=\"value\">\n\n<ng-content></ng-content>\n\n<ngt-validation [control]=\"formControl\" [container]=\"formContainer\" [minValue]='minValue' [minLength]='minLength'>\n</ngt-validation>\n", styles: [".div-loader{width:20px;height:20px;border:3px solid #a0aec038;border-top-color:#a0aec0;border-radius:50%;animation:spin 1s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}\n"] }]
714
- }], ctorParameters: function () { return [{ type: i0.Injector }, { type: i0.Renderer2 }, { type: i0.ChangeDetectorRef }, { type: i1.NgtStylizableDirective, decorators: [{
715
- type: Self
716
- }, {
717
- type: Optional
718
- }] }, { type: i2.ControlContainer, decorators: [{
719
- type: Optional
720
- }, {
721
- type: Host
722
- }] }, { type: i3.NgtFormComponent, decorators: [{
723
- type: Optional
724
- }, {
725
- type: SkipSelf
726
- }] }, { type: i4.NgtHttpValidationService, decorators: [{
727
- type: Optional
728
- }, {
729
- type: SkipSelf
730
- }] }, { type: i5.NgtHttpResourceService, decorators: [{
731
- type: Optional
732
- }, {
733
- type: SkipSelf
734
- }] }, { type: i3.NgtFormComponent, decorators: [{
735
- type: Optional
736
- }, {
737
- type: SkipSelf
738
- }] }, { type: i6.NgtSectionComponent, decorators: [{
739
- type: Optional
740
- }, {
741
- type: SkipSelf
742
- }] }, { type: i7.NgtModalComponent, decorators: [{
743
- type: Optional
744
- }, {
745
- type: SkipSelf
746
- }] }, { type: i8.NgtTranslateService, decorators: [{
747
- type: Optional
748
- }] }]; }, propDecorators: { element: [{
749
- type: ViewChild,
750
- args: ["element", { static: true }]
751
- }], label: [{
752
- type: Input
753
- }], placeholder: [{
754
- type: Input
755
- }], shining: [{
756
- type: Input
757
- }], loading: [{
758
- type: Input
759
- }], helpTitle: [{
760
- type: Input
761
- }], helpTextColor: [{
762
- type: Input
763
- }], helpText: [{
764
- type: Input
765
- }], innerLeftIcon: [{
766
- type: Input
767
- }], innerLeftIconColor: [{
768
- type: Input
769
- }], innerRightIcon: [{
770
- type: Input
771
- }], innerRightIconColor: [{
772
- type: Input
773
- }], decimalMaskPrecision: [{
774
- type: Input
775
- }], showCharactersLength: [{
776
- type: Input
777
- }], uppercase: [{
778
- type: Input
779
- }], customInnerContentTemplate: [{
780
- type: Input
781
- }], helperReverseYPosition: [{
782
- type: Input
783
- }], helperAutoXReverse: [{
784
- type: Input
785
- }], isDisabled: [{
786
- type: Input
787
- }], isReadonly: [{
788
- type: Input
789
- }], showRoundedIcon: [{
790
- type: Input
791
- }], type: [{
792
- type: Input
793
- }], name: [{
794
- type: Input
795
- }], mask: [{
796
- type: Input
797
- }], focus: [{
798
- type: Input
799
- }], allowClear: [{
800
- type: Input
801
- }], jit: [{
802
- type: Input
803
- }], useInputEvent: [{
804
- type: Input
805
- }], findExistingResource: [{
806
- type: Input
807
- }], allowPhoneValidation: [{
808
- type: Input
809
- }], validatePassword: [{
810
- type: Input
811
- }], passwordableId: [{
812
- type: Input
813
- }], passwordPolicyId: [{
814
- type: Input
815
- }], isRequired: [{
816
- type: Input
817
- }], uniqueResource: [{
818
- type: Input
819
- }], minValue: [{
820
- type: Input
821
- }], maxValue: [{
822
- type: Input
823
- }], maxLength: [{
824
- type: Input
825
- }], minLength: [{
826
- type: Input
827
- }], match: [{
828
- type: Input
829
- }], multipleOf: [{
830
- type: Input
831
- }], validateMinValueOnMask: [{
832
- type: Input
833
- }], externalServerDependency: [{
834
- type: Input
835
- }], customValidator: [{
836
- type: Input
837
- }], onClickLeftIcon: [{
838
- type: Output
839
- }], onClickRightIcon: [{
840
- type: Output
841
- }], validatePhoneResult: [{
842
- type: Output
843
- }] } });
844
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd0LWlucHV0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLXRhaWx3aW5kL3NyYy9jb21wb25lbnRzL25ndC1pbnB1dC9uZ3QtaW5wdXQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctdGFpbHdpbmQvc3JjL2NvbXBvbmVudHMvbmd0LWlucHV0L25ndC1pbnB1dC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUgsU0FBUyxFQUVULFlBQVksRUFDWixJQUFJLEVBRUosS0FBSyxFQUdMLFFBQVEsRUFDUixNQUFNLEVBRU4sSUFBSSxFQUVKLFFBQVEsRUFFUixTQUFTLEdBQ1osTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFxQyxnQkFBZ0IsRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFHekcsT0FBTyxFQUFFLGNBQWMsRUFBRSxlQUFlLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUUvRSxPQUFPLEVBQUUsY0FBYyxFQUFFLGFBQWEsRUFBRSxlQUFlLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQVE1RyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxzREFBc0QsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7O0FBZ0I1RixNQUFNLE9BQU8saUJBQWtCLFNBQVEsY0FBYztJQXlFakQsWUFDWSxRQUFrQixFQUNsQixRQUFtQixFQUNuQixjQUFpQyxFQUdqQyxzQkFBOEMsRUFHL0MsYUFBK0IsRUFHOUIsZ0JBQWtDLEVBR2xDLG9CQUE4QyxFQUc5QyxrQkFBMEMsRUFHMUMsT0FBeUIsRUFHekIsVUFBK0IsRUFHL0IsUUFBMkIsRUFHNUIsbUJBQXdDO1FBRS9DLEtBQUssRUFBRSxDQUFDO1FBL0JBLGFBQVEsR0FBUixRQUFRLENBQVU7UUFDbEIsYUFBUSxHQUFSLFFBQVEsQ0FBVztRQUNuQixt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O3NCQUFyQyxLQUFLO2dCQUNVLGtCQUFrQjtzQkFBakMsS0FBSztnQkFHVSxVQUFVO3NCQUF6QixLQUFLO2dCQUNVLFVBQVU7c0JBQXpCLEtBQUs7Z0JBQ1UsZUFBZTtzQkFBOUIsS0FBSztnQkFDVSxJQUFJO3NCQUFuQixLQUFLO2dCQUNVLElBQUk7c0JBQW5CLEtBQUs7Z0JBQ1UsSUFBSTtzQkFBbkIsS0FBSztnQkFDVSxLQUFLO3NCQUFwQixLQUFLO2dCQUNVLFVBQVU7c0JBQXpCLEtBQUs7Z0JBQ1UsR0FBRztzQkFBbEIsS0FBSztnQkFDVSxhQUFhO3NCQUE1QixLQUFLO2dCQUdVLG9CQUFvQjtzQkFBbkMsS0FBSztnQkFDVSxvQkFBb0I7c0JBQW5DLEtBQUs7Z0JBQ1UsZ0JBQWdCO3NCQUEvQixLQUFLO2dCQUNVLGNBQWM7c0JBQTdCLEtBQUs7Z0JBQ1UsZ0JBQWdCO3NCQUEvQixLQUFLO2dCQUNVLFVBQVU7c0JBQXpCLEtBQUs7Z0JBQ1UsY0FBYztzQkFBN0IsS0FBSztnQkFDVSxRQUFRO3NCQUF2QixLQUFLO2dCQUNVLFFBQVE7c0JBQXZCLEtBQUs7Z0JBQ1UsU0FBUztzQkFBeEIsS0FBSztnQkFDVSxTQUFTO3NCQUF4QixLQUFLO2dCQUNVLEtBQUs7c0JBQXBCLEtBQUs7Z0JBQ1UsVUFBVTtzQkFBekIsS0FBSztnQkFDVSxzQkFBc0I7c0JBQXJDLEtBQUs7Z0JBQ1Usd0JBQXdCO3NCQUF2QyxLQUFLO2dCQUNVLGVBQWU7c0JBQTlCLEtBQUs7Z0JBRVcsZUFBZTtzQkFBL0IsTUFBTTtnQkFDVSxnQkFBZ0I7c0JBQWhDLE1BQU07Z0JBQ1UsbUJBQW1CO3NCQUFuQyxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBDb21wb25lbnQsXG4gICAgRWxlbWVudFJlZixcbiAgICBFdmVudEVtaXR0ZXIsXG4gICAgSG9zdCxcbiAgICBJbmplY3RvcixcbiAgICBJbnB1dCxcbiAgICBPbkRlc3Ryb3ksXG4gICAgT25Jbml0LFxuICAgIE9wdGlvbmFsLFxuICAgIE91dHB1dCxcbiAgICBSZW5kZXJlcjIsXG4gICAgU2VsZixcbiAgICBTaW1wbGVDaGFuZ2VzLFxuICAgIFNraXBTZWxmLFxuICAgIFRlbXBsYXRlUmVmLFxuICAgIFZpZXdDaGlsZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBYnN0cmFjdENvbnRyb2wsIEFzeW5jVmFsaWRhdG9yRm4sIENvbnRyb2xDb250YWluZXIsIE5nRm9ybSwgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyBOZ3RCYXNlTmdNb2RlbCwgTmd0TWFrZVByb3ZpZGVyIH0gZnJvbSAnLi4vLi4vYmFzZS9uZ3QtYmFzZS1uZy1tb2RlbCc7XG5pbXBvcnQgeyBOZ3RTdHlsaXphYmxlRGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vZGlyZWN0aXZlcy9uZ3Qtc3R5bGl6YWJsZS9uZ3Qtc3R5bGl6YWJsZS5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgYXBwbHlJbnB1dE1hc2ssIElucHV0TWFza0VudW0sIHJlbW92ZUlucHV0TWFzayB9IGZyb20gJy4uLy4uL2hlbHBlcnMvaW5wdXQtbWFzay9pbnB1dC1tYXNrLmhlbHBlcic7XG5pbXBvcnQge1xuICAgIE5ndEh0dHBGaW5kRXhpc3RpbmdSZXNvdXJjZUludGVyZmFjZSxcbiAgICBOZ3RIdHRwRmluZEV4aXN0aW5nUmVzb3VyY2VSZXNwb25zZSxcbiAgICBOZ3RIdHRwUmVzb3VyY2VTZXJ2aWNlLFxufSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9odHRwL25ndC1odHRwLXJlc291cmNlLnNlcnZpY2UnO1xuaW1wb3J0IHsgTmd0SHR0cFZhbGlkYXRpb25SZXNwb25zZSwgTmd0SHR0cFZhbGlkYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvaHR0cC9uZ3QtaHR0cC12YWxpZGF0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgTmd0VHJhbnNsYXRlU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2h0dHAvbmd0LXRyYW5zbGF0ZS5zZXJ2aWNlJztcbmltcG9ydCB7IE5ndFN0eWxpemFibGVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvbmd0LXN0eWxpemFibGUvbmd0LXN0eWxpemFibGUuc2VydmljZSc7XG5pbXBvcnQgeyBOZ3RGb3JtQ29tcG9uZW50IH0gZnJvbSAnLi4vbmd0LWZvcm0vbmd0LWZvcm0uY29tcG9uZW50JztcbmltcG9ydCB7IE5ndFNlY3Rpb25Db21wb25lbnQgfSBmcm9tICcuLi9uZ3Qtc2VjdGlvbi9uZ3Qtc2VjdGlvbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgTmd0TW9kYWxDb21wb25lbnQgfSBmcm9tICcuLi9uZ3QtbW9kYWwvbmd0LW1vZGFsLmNvbXBvbmVudCc7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnbmd0LWlucHV0JyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vbmd0LWlucHV0LmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9uZ3QtaW5wdXQuY29tcG9uZW50LmNzcyddLFxuICAgIHByb3ZpZGVyczogW1xuICAgICAgICBOZ3RNYWtlUHJvdmlkZXIoTmd0SW5wdXRDb21wb25lbnQpLFxuICAgIF0sXG4gICAgdmlld1Byb3ZpZGVyczogW1xuICAgICAgICB7IHByb3ZpZGU6IENvbnRyb2xDb250YWluZXIsIHVzZUV4aXN0aW5nOiBOZ0Zvcm0gfVxuICAgIF1cbn0pXG5leHBvcnQgY2xhc3MgTmd0SW5wdXRDb21wb25lbnQgZXh0ZW5kcyBOZ3RCYXNlTmdNb2RlbCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgICBAVmlld0NoaWxkKFwiZWxlbWVudFwiLCB7IHN0YXRpYzogdHJ1ZSB9KSBwdWJsaWMgZWxlbWVudDogRWxlbWVudFJlZjtcblxuICAgIC8vIFZpc3VhbFxuICAgIEBJbnB1dCgpIHB1YmxpYyBsYWJlbDogc3RyaW5nO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBwbGFjZWhvbGRlcjogc3RyaW5nID0gJyc7XG4gICAgQElucHV0KCkgcHVibGljIHNoaW5pbmc6IGJvb2xlYW47XG4gICAgQElucHV0KCkgcHVibGljIGxvYWRpbmc6IGJvb2xlYW47XG4gICAgQElucHV0KCkgcHVibGljIGhlbHBUaXRsZTogc3RyaW5nO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBoZWxwVGV4dENvbG9yOiBzdHJpbmcgPSAndGV4dC1ncmVlbi01MDAnO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBoZWxwVGV4dDogc3RyaW5nO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBpbm5lckxlZnRJY29uOiBzdHJpbmc7XG4gICAgQElucHV0KCkgcHVibGljIGlubmVyTGVmdEljb25Db2xvcjogc3RyaW5nO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBpbm5lclJpZ2h0SWNvbjogc3RyaW5nO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBpbm5lclJpZ2h0SWNvbkNvbG9yOiBzdHJpbmc7XG4gICAgQElucHV0KCkgcHVibGljIGRlY2ltYWxNYXNrUHJlY2lzaW9uOiBudW1iZXIgPSAyO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBzaG93Q2hhcmFjdGVyc0xlbmd0aDogYm9vbGVhbiA9IGZhbHNlO1xuICAgIEBJbnB1dCgpIHB1YmxpYyB1cHBlcmNhc2U6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBASW5wdXQoKSBwdWJsaWMgY3VzdG9tSW5uZXJDb250ZW50VGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XG4gICAgQElucHV0KCkgcHVibGljIGhlbHBlclJldmVyc2VZUG9zaXRpb246IGJvb2xlYW47XG4gICAgQElucHV0KCkgcHVibGljIGhlbHBlckF1dG9YUmV2ZXJzZTogYm9vbGVhbiA9IHRydWU7XG5cbiAgICAvL0JlaGF2aW9yXG4gICAgQElucHV0KCkgcHVibGljIGlzRGlzYWJsZWQ6IGJvb2xlYW47XG4gICAgQElucHV0KCkgcHVibGljIGlzUmVhZG9ubHk6IGJvb2xlYW47XG4gICAgQElucHV0KCkgcHVibGljIHNob3dSb3VuZGVkSWNvbjogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBwdWJsaWMgdHlwZTogc3RyaW5nID0gJ3RleHQnO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBuYW1lOiBzdHJpbmc7XG4gICAgQElucHV0KCkgcHVibGljIG1hc2s6IHN0cmluZztcbiAgICBASW5wdXQoKSBwdWJsaWMgZm9jdXM6IGJvb2xlYW47XG4gICAgQElucHV0KCkgcHVibGljIGFsbG93Q2xlYXI6IGJvb2xlYW47XG4gICAgQElucHV0KCkgcHVibGljIGppdDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBwdWJsaWMgdXNlSW5wdXRFdmVudDogYm9vbGVhbjtcblxuICAgIC8vVmFsaWRhdGlvbnNcbiAgICBASW5wdXQoKSBwdWJsaWMgZmluZEV4aXN0aW5nUmVzb3VyY2U6IE5ndEh0dHBGaW5kRXhpc3RpbmdSZXNvdXJjZUludGVyZmFjZTtcbiAgICBASW5wdXQoKSBwdWJsaWMgYWxsb3dQaG9uZVZhbGlkYXRpb246IGJvb2xlYW47XG4gICAgQElucHV0KCkgcHVibGljIHZhbGlkYXRlUGFzc3dvcmQ6IGJvb2xlYW47XG4gICAgQElucHV0KCkgcHVibGljIHBhc3N3b3JkYWJsZUlkOiBzdHJpbmc7XG4gICAgQElucHV0KCkgcHVibGljIHBhc3N3b3JkUG9saWN5SWQ6IHN0cmluZztcbiAgICBASW5wdXQoKSBwdWJsaWMgaXNSZXF1aXJlZDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBwdWJsaWMgdW5pcXVlUmVzb3VyY2U6IGFueTtcbiAgICBASW5wdXQoKSBwdWJsaWMgbWluVmFsdWU6IG51bWJlcjtcbiAgICBASW5wdXQoKSBwdWJsaWMgbWF4VmFsdWU6IG51bWJlcjtcbiAgICBASW5wdXQoKSBwdWJsaWMgbWF4TGVuZ3RoOiBudW1iZXI7XG4gICAgQElucHV0KCkgcHVibGljIG1pbkxlbmd0aDogbnVtYmVyO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBtYXRjaDogc3RyaW5nO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBtdWx0aXBsZU9mOiBudW1iZXI7XG4gICAgQElucHV0KCkgcHVibGljIHZhbGlkYXRlTWluVmFsdWVPbk1hc2s6IGJvb2xlYW47XG4gICAgQElucHV0KCkgcHVibGljIGV4dGVybmFsU2VydmVyRGVwZW5kZW5jeTogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBwdWJsaWMgY3VzdG9tVmFsaWRhdG9yOiAoKSA9PiBBc3luY1ZhbGlkYXRvckZuO1xuXG4gICAgQE91dHB1dCgpIHB1YmxpYyBvbkNsaWNrTGVmdEljb246IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gICAgQE91dHB1dCgpIHB1YmxpYyBvbkNsaWNrUmlnaHRJY29uOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICAgIEBPdXRwdXQoKSBwdWJsaWMgdmFsaWRhdGVQaG9uZVJlc3VsdDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICAgIHB1YmxpYyBtYXhUb3RhbENoYXJzQ291bnQ6IG51bWJlcjtcbiAgICBwdWJsaWMgZXhpc3RpbmdSZXNvdXJjZUlkOiBzdHJpbmc7XG4gICAgcHVibGljIGNvbXBvbmVudFJlYWR5OiBib29sZWFuO1xuICAgIHB1YmxpYyBpbnB1dFByb3BlcnRpZXM6IHtcbiAgICAgICAgaHRtbFR5cGU/OiBzdHJpbmc7XG4gICAgICAgIGxlbmd0aD86IG51bWJlcjtcbiAgICB9ID0ge307XG5cbiAgICBwdWJsaWMgbmd0U3R5bGU6IE5ndFN0eWxpemFibGVTZXJ2aWNlO1xuXG4gICAgcHJpdmF0ZSBlbWFpbFZhbGlkYXRvclRpbWVvdXQ6IGFueTtcbiAgICBwcml2YXRlIHBhc3N3b3JkVmFsaWRhdG9yVGltZW91dDogYW55O1xuICAgIHByaXZhdGUgcGhvbmVWYWxpZGF0b3JUaW1lb3V0OiBhbnk7XG4gICAgcHJpdmF0ZSB1bmlxdWVWYWxpZGF0b3JUaW1lb3V0OiBhbnk7XG4gICAgcHJpdmF0ZSBzZWFyY2hFeGlzdGluZ1Jlc291cmNlVGltZW91dDogYW55O1xuICAgIHByaXZhdGUgc3Vic2NyaXB0aW9uczogQXJyYXk8U3Vic2NyaXB0aW9uPiA9IFtdO1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIGluamVjdG9yOiBJbmplY3RvcixcbiAgICAgICAgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyLFxuICAgICAgICBwcml2YXRlIGNoYW5nZURldGVjdG9yOiBDaGFuZ2VEZXRlY3RvclJlZixcblxuICAgICAgICBAU2VsZigpIEBPcHRpb25hbCgpXG4gICAgICAgIHByaXZhdGUgbmd0U3R5bGl6YWJsZURpcmVjdGl2ZTogTmd0U3R5bGl6YWJsZURpcmVjdGl2ZSxcblxuICAgICAgICBAT3B0aW9uYWwoKSBASG9zdCgpXG4gICAgICAgIHB1YmxpYyBmb3JtQ29udGFpbmVyOiBDb250cm9sQ29udGFpbmVyLFxuXG4gICAgICAgIEBPcHRpb25hbCgpIEBTa2lwU2VsZigpXG4gICAgICAgIHByaXZhdGUgbmd0Rm9ybUNvbXBvbmVudDogTmd0Rm9ybUNvbXBvbmVudCxcblxuICAgICAgICBAT3B0aW9uYWwoKSBAU2tpcFNlbGYoKVxuICAgICAgICBwcml2YXRlIG5ndFZhbGlkYXRpb25TZXJ2aWNlOiBOZ3RIdHRwVmFsaWRhdGlvblNlcnZpY2UsXG5cbiAgICAgICAgQE9wdGlvbmFsKCkgQFNraXBTZWxmKClcbiAgICAgICAgcHJpdmF0ZSBuZ3RSZXNvdXJjZVNlcnZpY2U6IE5ndEh0dHBSZXNvdXJjZVNlcnZpY2UsXG5cbiAgICAgICAgQE9wdGlvbmFsKCkgQFNraXBTZWxmKClcbiAgICAgICAgcHJpdmF0ZSBuZ3RGb3JtOiBOZ3RGb3JtQ29tcG9uZW50LFxuXG4gICAgICAgIEBPcHRpb25hbCgpIEBTa2lwU2VsZigpXG4gICAgICAgIHByaXZhdGUgbmd0U2VjdGlvbjogTmd0U2VjdGlvbkNvbXBvbmVudCxcblxuICAgICAgICBAT3B0aW9uYWwoKSBAU2tpcFNlbGYoKVxuICAgICAgICBwcml2YXRlIG5ndE1vZGFsOiBOZ3RNb2RhbENvbXBvbmVudCxcblxuICAgICAgICBAT3B0aW9uYWwoKVxuICAgICAgICBwdWJsaWMgbmd0VHJhbnNsYXRlU2VydmljZTogTmd0VHJhbnNsYXRlU2VydmljZVxuICAgICkge1xuICAgICAgICBzdXBlcigpO1xuXG4gICAgICAgIGlmICh0aGlzLm5ndEZvcm1Db21wb25lbnQpIHtcbiAgICAgICAgICAgIHRoaXMuc2hpbmluZyA9IHRoaXMubmd0Rm9ybUNvbXBvbmVudC5pc1NoaW5pbmcoKTtcblxuICAgICAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICAgICAgICAgICAgdGhpcy5uZ3RGb3JtQ29tcG9uZW50Lm9uU2hpbmluZ0NoYW5nZS5zdWJzY3JpYmUoKHNoaW5pbmc6IGJvb2xlYW4pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zaGluaW5nID0gc2hpbmluZztcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLm5ndFN0eWxpemFibGVEaXJlY3RpdmUpIHtcbiAgICAgICAgICAgIHRoaXMubmd0U3R5bGUgPSB0aGlzLm5ndFN0eWxpemFibGVEaXJlY3RpdmUuZ2V0Tmd0U3R5bGl6YWJsZVNlcnZpY2UoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMubmd0U3R5bGUgPSBuZXcgTmd0U3R5bGl6YWJsZVNlcnZpY2UoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubmd0U3R5bGUubG9hZCh0aGlzLmluamVjdG9yLCAnTmd0SW5wdXQnLCB7XG4gICAgICAgICAgICBoOiAnaC0xMicsXG4gICAgICAgICAgICByb3VuZGVkOiAncm91bmRlZCcsXG4gICAgICAgICAgICB0ZXh0OiAndGV4dC1zbScsXG4gICAgICAgICAgICBmb250OiAnZm9udC1ub3JtYWwnLFxuICAgICAgICAgICAgY29sb3I6IHtcbiAgICAgICAgICAgICAgICBib3JkZXI6ICdib3JkZXItZ3JheS00MDAgZm9jdXM6Ym9yZGVyLWdyYXktNzAwJyxcbiAgICAgICAgICAgICAgICBiZzogJ2JnLWJnLXdoaXRlIGZvY3VzOmJnLXdoaXRlJyxcbiAgICAgICAgICAgICAgICB0ZXh0OiAndGV4dC1ncmF5LTgwMCdcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIG5nT25Jbml0KCkge1xuICAgICAgICBpZiAoIXRoaXMuZm9ybUNvbnRhaW5lcikge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIlRoZSBlbGVtZW50IG11c3QgYmUgaW5zaWRlIGEgPGZvcm0gI2Zvcm09J25nRm9ybSc+IHRhZyFcIiwgdGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLm5hbWUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJUaGUgZWxlbWVudCBtdXN0IGNvbnRhaW4gYSBuYW1lIGF0dHJpYnV0ZSFcIiwgdGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb21wb25lbnRSZWFkeSA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XG5cbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbml0Q29tcG9uZW50KCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IuZGV0ZWN0Q2hhbmdlcygpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5nZXRFbGVtZW50VGl0bGUoKSB8fCB0aGlzLmdldEVsZW1lbnRUaXRsZSgpID09PSAnbnVsbCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50LnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC50aXRsZSA9ICcnO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9LCA1MDApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICAgICAgdGhpcy5zZXR1cE1hc2tzKGNoYW5nZXMubWFzayA/IGNoYW5nZXMubWFzay5wcmV2aW91c1ZhbHVlIDogbnVsbCk7XG5cbiAgICAgICAgaWYgKGNoYW5nZXMubWF0Y2ggfHwgY2hhbmdlcy5pc1JlcXVpcmVkIHx8IGNoYW5nZXMudHlwZSB8fCBjaGFuZ2VzLm1hc2sgfHwgY2hhbmdlcy5taW5WYWx1ZSkge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVWYWxpZGF0aW9ucygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIG5nT25EZXN0cm95KCkge1xuICAgICAgICB0aGlzLmRlc3Ryb3lTdWJzY3JpcHRpb25zKCk7XG4gICAgfVxuXG4gICAgcHVibGljIG9uTmF0aXZlQ2hhbmdlKCkge1xuICAgICAgICBpZiAodGhpcy5oYXNDaGFuZ2VzQmV0d2Vlbk1vZGVscygpKSB7XG4gICAgICAgICAgICB0aGlzLnZhbHVlID0gdGhpcy5yZW1vdmVNYXNrcyh0aGlzLmdldE5hdGl2ZVZhbHVlKCkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGNoYW5nZSh2YWx1ZTogYW55KSB7XG4gICAgICAgIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmIHRoaXMubWFzayA9PSAnZGVjaW1hbCcpIHtcbiAgICAgICAgICAgIHZhbHVlID0gcGFyc2VGbG9hdCh2YWx1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuZ2V0TmF0aXZlVmFsdWUoKSB8fCAodGhpcy52YWxpZGF0ZU1pblZhbHVlT25NYXNrKSkge1xuICAgICAgICAgICAgdGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQudmFsdWUgPSB2YWx1ZSA/PyAnJztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdmFsdWUgJiYgdmFsdWUgIT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuY2xlYXJJbnB1dCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IG5hdGl2ZVZhbHVlID0gdGhpcy5nZXROYXRpdmVWYWx1ZSgpO1xuXG4gICAgICAgIGlmICh0aGlzLm1hc2spIHtcbiAgICAgICAgICAgIGxldCBuZ01vZGVsVmFsdWUgPSB0aGlzLnJlbW92ZU1hc2tzKG5hdGl2ZVZhbHVlKTtcblxuICAgICAgICAgICAgaWYgKG5hdGl2ZVZhbHVlICYmIG5nTW9kZWxWYWx1ZSAhPSB0aGlzLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy52YWx1ZSA9IG5nTW9kZWxWYWx1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICh0aGlzLm1hc2sgPT0gSW5wdXRNYXNrRW51bS5DRUxMUEhPTkUgfHwgdGhpcy5tYXNrID09IElucHV0TWFza0VudW0uSU5URVJOQVRJT05BTF9QSE9ORSlcbiAgICAgICAgICAgICAgICAmJiB0aGlzLmFsbG93UGhvbmVWYWxpZGF0aW9uICYmIHRoaXMudmFsdWVcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHRoaXMudmFsaWRhdGVQaG9uZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IG5nTW9kZWxWYWx1ZSA9IHRoaXMucmVtb3ZlTWFza3ModmFsdWUpO1xuXG4gICAgICAgICAgICBpZiAodmFsdWUgJiYgbmdNb2RlbFZhbHVlICE9IHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy52YWx1ZSA9IG5nTW9kZWxWYWx1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRoaXMudmFsdWUgIT0gbmF0aXZlVmFsdWUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudC52YWx1ZSA9IG5nTW9kZWxWYWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmNvbXBvbmVudFJlYWR5KSB7XG4gICAgICAgICAgICB0aGlzLm9uVmFsdWVDaGFuZ2VFdmVudC5lbWl0KHRoaXMudmFsdWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMubmd0UmVzb3VyY2VTZXJ2aWNlICYmIHRoaXMuZmluZEV4aXN0aW5nUmVzb3VyY2UgJiYgdGhpcy52YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5zZWFyY2hFeGlzdGluZ1Jlc291cmNlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0Rm9jdXMoKSB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgfSwgMjAwKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgY2xlYXJJbnB1dChldmVudD86IEV2ZW50KSB7XG4gICAgICAgIGlmIChldmVudCkge1xuICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudC52YWx1ZSA9ICcnO1xuICAgICAgICB0aGlzLnZhbHVlID0gJyc7XG5cbiAgICAgICAgdGhpcy5tYXJrQXNQcmlzdGluZSgpO1xuICAgIH1cblxuICAgIHB1YmxpYyByZXN0b3JlUGxhY2Vob2xkZXIoKTogdm9pZCB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQucGxhY2Vob2xkZXIgPSB0aGlzLnBsYWNlaG9sZGVyKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2hvd1Bhc3N3b3JkKCkge1xuICAgICAgICB0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudC50eXBlID0gJ3RleHQnO1xuICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaGlkZVBhc3N3b3JkKCkge1xuICAgICAgICB0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudC50eXBlID0gJ3Bhc3N3b3JkJztcbiAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldElucHV0UGFkZGluZ3MoKSB7XG4gICAgICAgIGxldCBwYWRkaW5nQ2xhc3M6IHN0cmluZyA9ICcnO1xuXG4gICAgICAgIGlmICh0aGlzLmlubmVyTGVmdEljb24gfHwgdGhpcy5jdXN0b21Jbm5lckNvbnRlbnRUZW1wbGF0ZSkge1xuICAgICAgICAgICAgcGFkZGluZ0NsYXNzICs9ICdwbC0xMCBwci00ICc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwYWRkaW5nQ2xhc3MgKz0gJ3B4LTQgJztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmlubmVyUmlnaHRJY29uIHx8IHRoaXMuYWxsb3dDbGVhciB8fCB0aGlzLnR5cGUgPT0gJ3Bhc3N3b3JkJykge1xuICAgICAgICAgICAgaWYgKHRoaXMuYWxsb3dDbGVhciAmJiB0aGlzLnZhbHVlICYmICh0aGlzLmlubmVyUmlnaHRJY29uIHx8IHRoaXMudHlwZSA9PSAncGFzc3dvcmQnKSkge1xuICAgICAgICAgICAgICAgIHBhZGRpbmdDbGFzcyArPSAncHItMTAgJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcGFkZGluZ0NsYXNzICs9ICdwci04ICc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcGFkZGluZ0NsYXNzO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRSZW1haW5pbmdDaGFyYWN0ZXJzKCkge1xuICAgICAgICBpZiAodGhpcy5lbGVtZW50Py5uYXRpdmVFbGVtZW50Py52YWx1ZT8ubGVuZ3RoKSB7XG4gICAgICAgICAgICBpZiAoKHRoaXMubWF4VG90YWxDaGFyc0NvdW50IC0gdGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQudmFsdWUubGVuZ3RoKSA+IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5tYXhUb3RhbENoYXJzQ291bnQgLSB0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudC52YWx1ZS5sZW5ndGg7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMubWF4VG90YWxDaGFyc0NvdW50O1xuICAgIH1cblxuICAgIHB1YmxpYyBoYXNGb2N1cygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgPT09IHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50O1xuICAgIH1cblxuICAgIHB1YmxpYyBkaXNhYmxlZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNEaXNhYmxlZCB8fCB0aGlzLmlzRGlzYWJsZWRCeVBhcmVudCgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgaW5pdENvbXBvbmVudCgpIHtcbiAgICAgICAgaWYgKHRoaXMuZm9ybUNvbnRhaW5lciAmJiB0aGlzLmZvcm1Db250YWluZXIuY29udHJvbCAmJiAodGhpcy5mb3JtQ29udHJvbCA9IHRoaXMuZm9ybUNvbnRhaW5lci5jb250cm9sLmdldCh0aGlzLm5hbWUpKSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuZm9jdXMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldEZvY3VzKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCB3YXRjaCA9IFwiY2hhbmdlXCI7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmppdCkge1xuICAgICAgICAgICAgICAgIHdhdGNoICs9IFwiIGtleXVwIGtleWRvd24ga2V5cHJlc3NcIjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgd2F0Y2guc3BsaXQoJyAnKS5mb3JFYWNoKChldnQpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLmxpc3Rlbih0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudCwgZXZ0LCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBuYXRpdmVWYWx1ZSA9IHRoaXMucmVtb3ZlTWFza3ModGhpcy5nZXROYXRpdmVWYWx1ZSgpKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy52YWx1ZSAhPSBuYXRpdmVWYWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy52YWx1ZSA9IG5hdGl2ZVZhbHVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5saXN0ZW4odGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQsIFwia2V5ZG93blwiLCAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQgJiYgdGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQudmFsdWUgJiYgdGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQudmFsdWUubGVuZ3RoID49IHRoaXMubWF4TGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEJhY2tzcGFjZSBhbmQgZGVsZXRlXG4gICAgICAgICAgICAgICAgICAgIGlmIChldmVudC5rZXlDb2RlICE9IDggJiYgZXZlbnQua2V5Q29kZSAhPSA0Nikge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHRoaXMubWF4VG90YWxDaGFyc0NvdW50ID0gdGhpcy5tYXhMZW5ndGg7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVZhbGlkYXRpb25zKCk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLm1hdGNoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5saXN0ZW4odGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQsIFwia2V5cHJlc3NcIiwgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm1hdGNoVmFsaWRhdG9yKCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5mb3JtQ29udHJvbC5tYXJrQXNEaXJ0eSgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZvcm1Db250cm9sLm1hcmtBc1ByaXN0aW5lKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnNldHVwUHJvcGVydGllcygpO1xuICAgIH1cblxuICAgIHByaXZhdGUgdXBkYXRlVmFsaWRhdGlvbnMoKSB7XG4gICAgICAgIGlmICghdGhpcy5mb3JtQ29udHJvbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc3luY1ZhbGlkYXRvcnMgPSBbXTtcblxuICAgICAgICBpZiAodGhpcy50eXBlID09ICdlbWFpbCcpIHtcbiAgICAgICAgICAgIHN5bmNWYWxpZGF0b3JzLnB1c2goVmFsaWRhdG9ycy5lbWFpbCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5pc1JlcXVpcmVkKSB7XG4gICAgICAgICAgICBzeW5jVmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvcnMucmVxdWlyZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMubWF4TGVuZ3RoKSB7XG4gICAgICAgICAgICBzeW5jVmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvcnMubWF4TGVuZ3RoKHRoaXMubWF4TGVuZ3RoKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5taW5MZW5ndGgpIHtcbiAgICAgICAgICAgIHN5bmNWYWxpZGF0b3JzLnB1c2goVmFsaWRhdG9ycy5taW5MZW5ndGgodGhpcy5taW5MZW5ndGgpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLm1hc2sgPT0gJ2NucGotY3BmJyB8fCB0aGlzLm1hc2sgPT0gJ2NucGotY3BmLXJ1dCcgfHwgdGhpcy5tYXNrID09ICdjcGYnKSB7XG4gICAgICAgICAgICBzeW5jVmFsaWRhdG9ycy5wdXNoKHRoaXMuY25wakNwZlZhbGlkYXRvcigpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLm1hc2sgPT0gJ3RpbWUnKSB7XG4gICAgICAgICAgICBzeW5jVmFsaWRhdG9ycy5wdXNoKHRoaXMudGltZVZhbGlkYXRvcigpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLm1hdGNoKSB7XG4gICAgICAgICAgICBzeW5jVmFsaWRhdG9ycy5wdXNoKHRoaXMubWF0Y2hWYWxpZGF0b3IoKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5taW5WYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBzeW5jVmFsaWRhdG9ycy5wdXNoKHRoaXMubWluVmFsdWVWYWxpZGF0b3IoKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5tdWx0aXBsZU9mKSB7XG4gICAgICAgICAgICBzeW5jVmFsaWRhdG9ycy5wdXNoKHRoaXMubXVsdGlwbGVPZlZhbGlkYXRvcigpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmV4dGVybmFsU2VydmVyRGVwZW5kZW5jeSkge1xuICAgICAgICAgICAgc3luY1ZhbGlkYXRvcnMucHVzaCh0aGlzLmV4dGVybmFsU2VydmVyRGVwZW5kZW5jeVZhbGlkYXRvcigpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5mb3JtQ29udHJvbC5zZXRWYWxpZGF0b3JzKHN5bmNWYWxpZGF0b3JzKTtcblxuICAgICAgICAgICAgY29uc3QgYXN5bmNWYWxpZGF0b3JzID0gW107XG5cbiAgICAgICAgICAgIGlmICh0aGlzLnVuaXF1ZVJlc291cmNlKSB7XG4gICAgICAgICAgICAgICAgYXN5bmNWYWxpZGF0b3JzLnB1c2godGhpcy51bmlxdWVWYWxpZGF0b3IoKSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLnR5cGUgPT0gJ2VtYWlsJyAmJiB0aGlzLmhhc0VtYWlsU2VydmljZVZhbGlkYXRpb24oKSkge1xuICAgICAgICAgICAgICAgIGFzeW5jVmFsaWRhdG9ycy5wdXNoKHRoaXMuZW1haWxWYWxpZGF0b3IoKSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLnR5cGUgPT0gJ2xvZ2luJyAmJiB0aGlzLmhhc0VtYWlsU2VydmljZVZhbGlkYXRpb24oKSkge1xuICAgICAgICAgICAgICAgIGFzeW5jVmFsaWRhdG9ycy5wdXNoKHRoaXMuZW1haWxWYWxpZGF0b3IodHJ1ZSkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy50eXBlID09ICdwYXNzd29yZCcgJiYgdGhpcy52YWxpZGF0ZVBhc3N3b3JkICYmIHRoaXMuaGFzUGFzc3dvcmRWYWxpZGF0aW9uKCkpIHtcbiAgICAgICAgICAgICAgICBhc3luY1ZhbGlkYXRvcnMucHVzaCh0aGlzLnBhc3N3b3JkVmFsaWRhdG9yKCkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy5jdXN0b21WYWxpZGF0b3IpIHtcbiAgICAgICAgICAgICAgICBhc3luY1ZhbGlkYXRvcnMucHVzaCh0aGlzLmN1c3RvbVZhbGlkYXRvcigpKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5mb3JtQ29udHJvbC5zZXRBc3luY1ZhbGlkYXRvcnMoYXN5bmNWYWxpZGF0b3JzKTtcbiAgICAgICAgICAgIHRoaXMuZm9ybUNvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNldHVwTWFza3MocHJldmlvdXNNYXNrPzogc3RyaW5nKSB7XG4gICAgICAgIGlmICh0aGlzLm1hc2sgIT0gcHJldmlvdXNNYXNrICYmICF0aGlzLm1hc2spIHtcbiAgICAgICAgICAgIHJlbW92ZUlucHV0TWFzayh0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudCk7XG5cbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNsZWFySW5wdXQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBtYXNrcyA9IHtcbiAgICAgICAgICAgIFtJbnB1dE1hc2tFbnVtLkNQRl06IHtcbiAgICAgICAgICAgICAgICBtYXNrOiBbJzk5OS45OTkuOTk5LTk5J10sXG4gICAgICAgICAgICAgICAgc2hvd01hc2tPbkhvdmVyOiBmYWxzZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFtJbnB1dE1hc2tFbnVtLkNOUEpdOiB7XG4gICAgICAgICAgICAgICAgbWFzazogWyc5OS45OTkuOTk5Lzk5OTktOTknXSxcbiAgICAgICAgICAgICAgICBzaG93TWFza09uSG92ZXI6IGZhbHNlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgW0lucHV0TWFza0VudW0uQ1VJVF06IHtcbiAgICAgICAgICAgICAgICBtYXNrOiBbJzk5LTk5OTk5OTk5LTknXSxcbiAgICAgICAgICAgICAgICBjbGVhck1hc2tPbkxvc3RGb2N1czogZmFsc2VcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBbSW5wdXRNYXNrRW51bS5SVVRdOiB7XG4gICAgICAgICAgICAgICAgbWFzazogWyc5OTk5OTk5OTk5OTknXSxcbiAgICAgICAgICAgICAgICBjbGVhck1hc2tPbkxvc3RGb2N1czogZmFsc2VcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBbSW5wdXRNYXNrRW51bS5DUEZfQ05QSl9SVVRdOiB7XG4gICAgICAgICAgICAgICAgbWFzazogWyc5OTkuOTk5Ljk5OS05OScsICc5OTk5OTk5OTk5OTknLCAnOTkuOTk5Ljk5OS85OTk5LTk5J10sXG4gICAgICAgICAgICAgICAga2VlcFN0YXRpYzogdHJ1ZSxcbiAgICAgICAgICAgICAgICBzaG93TWFza09uSG92ZXI6IGZhbHNlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgW0lucHV0TWFza0VudW0uQ1BGX0NOUEpdOiB7XG4gICAgICAgICAgICAgICAgbWFzazogWyc5OTkuOTk5Ljk5OS05OScsICc5OS45OTkuOTk5Lzk5OTktOTknXSxcbiAgICAgICAgICAgICAgICBrZWVwU3RhdGljOiB0cnVlLFxuICAgICAgICAgICAgICAgIHNob3dNYXNrT25Ib3ZlcjogZmFsc2VcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBbSW5wdXRNYXNrRW51bS5ERUNJTUFMXToge1xuICAgICAgICAgICAgICAgIGRpZ2l0czogdGhpcy5kZWNpbWFsTWFza1ByZWNpc2lvbixcbiAgICAgICAgICAgICAgICBncm91cFNlcGFyYXRvcjogJy4nLFxuICAgICAgICAgICAgICAgIHJhZGl4UG9pbnQ6ICcsJyxcbiAgICAgICAgICAgICAgICBhdXRvR3JvdXA6IHRydWUsXG4gICAgICAgICAgICAgICAgcmVwZWF0OiAxNixcbiAgICAgICAgICAgICAgICByaWdodEFsaWduOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBtYXg6IHRoaXMubWF4VmFsdWUsXG4gICAgICAgICAgICAgICAgc2hvd01hc2tPbkhvdmVyOiBmYWxzZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFtJbnB1dE1hc2tFbnVtLkNFTExQSE9ORV06IHtcbiAgICAgICAgICAgICAgICBtYXNrOiBbJyg5OSkgOTk5LTk5OScsICcoOTkpIDk5OTktOTk5OScsICcoOTkpIDk5OTk5LTk5OTknXSxcbiAgICAgICAgICAgICAgICBrZWVwU3RhdGljOiB0cnVlLFxuICAgICAgICAgICAgICAgIHNob3dNYXNrT25Ib3ZlcjogZmFsc2VcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBbSW5wdXRNYXNrRW51bS5JTlRFUk5BVElPTkFMX1BIT05FXToge1xuICAgICAgICAgICAgICAgIG1hc2s6IFsnKzk5OSA5OSA5OTktOTk5JywgJys5OSAoOTkpIDk5OTktOTk5OScsICcrOTkgKDk5KSA5OTk5OS05OTk5JywgJys5OTkgKDk5KSA5OTk5LTk5OTknLCAnKzk5OSAoOTkpIDk5OTk5LTk5OTknXSxcbiAgICAgICAgICAgICAgICBrZWVwU3RhdGljOiB0cnVlLFxuICAgICAgICAgICAgICAgIHNob3dNYXNrT25Ib3ZlcjogZmFsc2VcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBbSW5wdXRNYXNrRW51bS5QTEFURV06IHtcbiAgICAgICAgICAgICAgICBtYXNrOiBbJ0FBQS05Jjk5J10sXG4gICAgICAgICAgICAgICAga2VlcFN0YXRpYzogdHJ1ZSxcbiAgICAgICAgICAgICAgICBzaG93TWFza09uSG92ZXI6IGZhbHNlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgW0lucHV0TWFza0VudW0uQ0VQXToge1xuICAgICAgICAgICAgICAgIG1hc2s6IFsnOTk5OTktOTk5J10sXG4gICAgICAgICAgICAgICAgc2hvd01hc2tPbkhvdmVyOiBmYWxzZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFtJbnB1dE1hc2tFbnVtLklOVEVHRVJdOiB7XG4gICAgICAgICAgICAgICAgbWF4OiB0aGlzLm1heFZhbHVlLFxuICAgICAgICAgICAgICAgIG1pbjogdGhpcy52YWxpZGF0ZU1pblZhbHVlT25NYXNrID8gdGhpcy5taW5WYWx1ZSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICByaWdodEFsaWduOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBzaG93TWFza09uSG92ZXI6IGZhbHNlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgW0lucHV0TWFza0VudW0uTlVNRVJJQ19TVFJJTkddOiB7XG4gICAgICAgICAgICAgICAgcmVnZXg6IFwiWzAtOV0qXCIsXG4gICAgICAgICAgICAgICAgc2hvd01hc2tPbkhvdmVyOiBmYWxzZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFtJbnB1dE1hc2tFbnVtLlRJTUVdOiAnOTk6OTknLFxuICAgICAgICB9O1xuXG4gICAgICAgIGlmICh0aGlzLm1hc2sgPT0gSW5wdXRNYXNrRW51bS5ERUNJTUFMKSB7XG4gICAgICAgICAgICBhcHBseUlucHV0TWFzayh0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudCwgSW5wdXRNYXNrRW51bS5ERUNJTUFMLCBtYXNrc1t0aGlzLm1hc2tdKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLm1hc2sgPT0gSW5wdXRNYXNrRW51bS5JTlRFR0VSKSB7XG4gICAgICAgICAgICBhcHBseUlucHV0TWFzayh0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudCwgSW5wdXRNYXNrRW51bS5JTlRFR0VSLCBtYXNrc1t0aGlzLm1hc2tdKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGFwcGx5SW5wdXRNYXNrKHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50LCBtYXNrc1t0aGlzLm1hc2tdKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgc2V0dXBQcm9wZXJ0aWVzKCkge1xuICAgICAgICBsZXQgcHJvcHMgPSB7XG4gICAgICAgICAgICBzaG9ydFRleHQ6IHtcbiAgICAgICAgICAgICAgICBodG1sVHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgICAgbGVuZ3RoOiAzMFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHRleHQ6IHtcbiAgICAgICAgICAgICAgICBodG1sVHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgICAgbGVuZ3RoOiAxMDBcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsb25nVGV4dDoge1xuICAgICAgICAgICAgICAgIGh0bWxUeXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgICBsZW5ndGg6IDE1MFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGV4dHJhTG9uZ1RleHQ6IHtcbiAgICAgICAgICAgICAgICBodG1sVHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgICAgbGVuZ3RoOiAzMDBcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjdXN0b21UZXh0OiB7XG4gICAgICAgICAgICAgICAgaHRtbFR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgICAgIGxlbmd0aDogdGhpcy5tYXhMZW5ndGhcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBwYXNzd29yZDoge1xuICAgICAgICAgICAgICAgIGh0bWxUeXBlOiBcInBhc3N3b3JkXCIsXG4gICAgICAgICAgICAgICAgbGVuZ3RoOiAxNTBcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlbWFpbDoge1xuICAgICAgICAgICAgICAgIGh0bWxUeXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgICBsZW5ndGg6IDEwMCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkZWNpbWFsOiB7XG4gICAgICAgICAgICAgICAgaHRtbFR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgICAgIGxlbmd0aDogOSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBpZiAodGhpcy50eXBlIGluIHByb3BzKSB7XG4gICAgICAgICAgICB0aGlzLmlucHV0UHJvcGVydGllcyA9IHByb3BzW3RoaXMudHlwZV07XG4gICAgICAgICAgICB0aGlzLm1heExlbmd0aCA9IHRoaXMuaW5wdXRQcm9wZXJ0aWVzLmxlbmd0aDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihcIlR5cGUgW1wiICsgdGhpcy50eXBlICsgXCJdIGlzIG5vdCBhIHZhbGlkIHRhaWwtZm9ybS1pbnB1dCB0eXBlIVwiLCB0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIG1pblZhbHVlVmFsaWRhdG9yKCkge1xuICAgICAgICByZXR1cm4gKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCkgPT4gcGFyc2VGbG9hdChjb250cm9sLnZhbHVlKSA8IHRoaXMubWluVmFsdWUgPyB7ICdtaW5WYWx1ZSc6IHRydWUgfSA6IG51bGw7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBtdWx0aXBsZU9mVmFsaWRhdG9yKCkge1xuICAgICAgICByZXR1cm4gKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCkgPT4ge1xuICAgICAgICAgICAgaWYgKGNvbnRyb2wudmFsdWUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKGNvbnRyb2wudmFsdWUgJSB0aGlzLm11bHRpcGxlT2YgIT09IDApID8geyAnbXVsdGlwbGVPZic6IHRydWUgfSA6IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBleHRlcm5hbFNlcnZlckRlcGVuZGVuY3lWYWxpZGF0b3IoKSB7XG4gICAgICAgIC8vIFRPRE86IFZhbGlkYXIgdGVtcG8gZGUgcmVxdWlzacOnw6NvXG4gICAgICAgIHJldHVybiAoY29udHJvbDogQWJzdHJhY3RDb250cm9sKSA9PiAhY29udHJvbC52YWx1ZSA/IHsgJ2V4dGVybmFsU2VydmVyRGVwZW5kZW5jeSc6IHRydWUgfSA6IG51bGw7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB0aW1lVmFsaWRhdG9yKCkge1xuICAgICAgICBjb25zdCByZWdleEV4cCA9IG5ldyBSZWdFeHAoJ14oMFswLTldfDFbMC05XXwyWzAtM10pOlswLTVdWzAtOV0kJyk7XG5cbiAgICAgICAgcmV0dXJuIChjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpID0+IHtcbiAgICAgICAgICAgIGlmIChjb250cm9sLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHJlZ2V4RXhwLnRlc3QoY29udHJvbC52YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgJ3RpbWUnOiB0cnVlIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgY25wakNwZlZhbGlkYXRvcigpIHtcbiAgICAgICAgcmV0dXJuIChjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpID0+IHtcbiAgICAgICAgICAgIGlmICghY29udHJvbC52YWx1ZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoY29udHJvbC52YWx1ZSAmJiBjb250cm9sLnZhbHVlLmxlbmd0aCA8PSAxMSkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnZhbGlkYXRvckNQRihjb250cm9sLnZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyAnY3BmJzogdHJ1ZSB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY29udHJvbC52YWx1ZSAmJiBjb250cm9sLnZhbHVlLmxlbmd0aCA9PSAxMikge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoY29udHJvbC52YWx1ZSAmJiB0aGlzLnZhbGlkYXRvckNOUEooY29udHJvbC52YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgJ2NucGonOiB0cnVlIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgbWF0Y2hWYWxpZGF0b3IoKSB7XG4gICAgICAgIHJldHVybiAoY29udHJvbDogQWJzdHJhY3RDb250cm9sKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy52YWx1ZSAhPSB0aGlzLm1hdGNoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgJ21hdGNoJzogdHJ1ZSB9O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGVtYWlsVmFsaWRhdG9yKGlzTG9naW5WYWxpZGF0aW9uOiBib29sZWFuID0gZmFsc2UpOiBBc3luY1ZhbGlkYXRvckZuIHtcbiAgICAgICAgcmV0dXJuIChjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmVtYWlsVmFsaWRhdG9yVGltZW91dCkge1xuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLmVtYWlsVmFsaWRhdG9yVGltZW91dCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZW1haWxWYWxpZGF0b3JUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5ndFZhbGlkYXRpb25TZXJ2aWNlLmVtYWlsVmFsaWRhdGlvbih0aGlzLnZhbHVlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKChyZXNwb25zZTogTmd0SHR0cFZhbGlkYXRpb25SZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNMb2dpblZhbGlkYXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUocmVzcG9uc2UudmFsaWQgPyB7ICdsb2dpbic6IHRydWUgfSA6IG51bGwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXNwb25zZS52YWxpZCA/IG51bGwgOiB7ICdlbWFpbCc6IHRydWUgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY2F0Y2goKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShudWxsKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSwgNTAwKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShudWxsKTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHBhc3N3b3JkVmFsaWRhdG9yKCk6IEFzeW5jVmFsaWRhdG9yRm4ge1xuICAgICAgICByZXR1cm4gKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMucGFzc3dvcmRWYWxpZGF0b3JUaW1lb3V0KSB7XG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMucGFzc3dvcmRWYWxpZGF0b3JUaW1lb3V0KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRoaXMudmFsdWUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXNzd29yZFZhbGlkYXRvclRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IHRydWU7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubmd0VmFsaWRhdGlvblNlcnZpY2UucGFzc3dvcmRWYWxpZGF0aW9uKHRoaXMudmFsdWUsIHRoaXMucGFzc3dvcmRhYmxlSWQsIHRoaXMucGFzc3dvcmRQb2xpY3lJZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAudGhlbigocmVzcG9uc2U6IE5ndEh0dHBWYWxpZGF0aW9uUmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXNwb25zZS52YWxpZCA/IG51bGwgOiB7ICdpbnZhbGlkX3Bhc3N3b3JkJzogdHJ1ZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jYXRjaCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUobnVsbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH0sIDUwMCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobnVsbCk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBzZWFyY2hFeGlzdGluZ1Jlc291cmNlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAodGhpcy5zZWFyY2hFeGlzdGluZ1Jlc291cmNlVGltZW91dCkge1xuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuc2VhcmNoRXhpc3RpbmdSZXNvdXJjZVRpbWVvdXQpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zZWFyY2hFeGlzdGluZ1Jlc291cmNlVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuZmluZEV4aXN0aW5nUmVzb3VyY2UudmFsdWUgPSB0aGlzLnZhbHVlO1xuXG4gICAgICAgICAgICB0aGlzLm5ndFJlc291cmNlU2VydmljZS5maW5kRXhpc3RpbmcodGhpcy5maW5kRXhpc3RpbmdSZXNvdXJjZSlcbiAgICAgICAgICAgICAgICAudGhlbigocmVzcG9uc2U6IE5ndEh0dHBGaW5kRXhpc3RpbmdSZXNvdXJjZVJlc3BvbnNlKSA9PiB0aGlzLmV4aXN0aW5nUmVzb3VyY2VJZCA9IHJlc3BvbnNlLmlkKVxuICAgICAgICAgICAgICAgIC5jYXRjaCgoKSA9PiB0aGlzLmV4aXN0aW5nUmVzb3VyY2VJZCA9IG51bGwpXG4gICAgICAgICAgICAgICAgLmZpbmFsbHkoKCkgPT4gdGhpcy5sb2FkaW5nID0gZmFsc2UpO1xuICAgICAgICB9LCA1MDApO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgdmFsaWRhdGVQaG9uZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKHRoaXMucGhvbmVWYWxpZGF0b3JUaW1lb3V0KSB7XG4gICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5waG9uZVZhbGlkYXRvclRpbWVvdXQpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5waG9uZVZhbGlkYXRvclRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IHRydWU7XG5cbiAgICAgICAgICAgIHRoaXMubmd0VmFsaWRhdGlvblNlcnZpY2UucGhvbmVWYWxpZGF0aW9uKHRoaXMudmFsdWUpXG4gICAgICAgICAgICAgICAgLnRoZW4oKHJlc3BvbnNlOiBhbnkpID0+IHRoaXMudmFsaWRhdGVQaG9uZVJlc3VsdC5lbWl0KHJlc3BvbnNlKSlcbiAgICAgICAgICAgICAgICAuZmluYWxseSgoKSA9PiB0aGlzLmxvYWRpbmcgPSBmYWxzZSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgdW5pcXVlVmFsaWRhdG9yKCk6IEFzeW5jVmFsaWRhdG9yRm4ge1xuICAgICAgICBpZiAoIXRoaXMubmd0VmFsaWRhdGlvblNlcnZpY2UpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkluIG9yZGVyIHRvIHVzZSB1bmlxdWUgdmFsaWRhdGlvbiB5b3UgbXVzdCBwcm92aWRlIGEgaW1wbGVtZW50YXRpb24gZm9yIE5ndEh0dHBWYWxpZGF0aW9uU2VydmljZSBjbGFzcyFcIik7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMudW5pcXVlVmFsaWRhdG9yVGltZW91dCkge1xuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLnVuaXF1ZVZhbGlkYXRvclRpbWVvdXQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy52YWx1ZSAmJiB0aGlzLnVuaXF1ZVJlc291cmNlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudW5pcXVlVmFsaWRhdG9yVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5uZ3RWYWxpZGF0aW9uU2VydmljZS51bmlxdWUodGhpcy51bmlxdWVSZXNvdXJjZSwgdGhpcy52YWx1ZSkudGhlbigocmVzcG9uc2U6IE5ndEh0dHBWYWxpZGF0aW9uUmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUocmVzcG9uc2UudmFsaWQgPyBudWxsIDogeyAndW5pcXVlJzogdHJ1ZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLmNhdGNoKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKG51bGwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH0sIDUwMCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobnVsbCk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB2YWxpZGF0b3JDTlBKKHZhbHVlKSB7XG4gICAgICAgIGxldCBiID0gWzYsIDUsIDQsIDMsIDIsIDksIDgsIDcsIDYsIDUsIDQsIDMsIDJdO1xuXG4gICAgICAgIGlmICgodmFsdWUgPSB2YWx1ZS5yZXBsYWNlKC9bXlxcZF0vZywgXCJcIikpLmxlbmd0aCAhPSAxNCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKC8wezE0fS8udGVzdCh2YWx1ZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBuID0gMDtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDEyOyBuICs9IHZhbHVlW2ldICogYlsrK2ldKSB7XG4gICAgICAgICAgICA7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodmFsdWVbMTJdICE9ICgoKG4gJT0gMTEpIDwgMikgPyAwIDogMTEgLSBuKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgbiA9IDA7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPD0gMTI7IG4gKz0gdmFsdWVbaV0gKiBiW2krK10pIHtcbiAgICAgICAgICAgIDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh2YWx1ZVsxM10gIT0gKCgobiAlPSAxMSkgPCAyKSA/IDAgOiAxMSAtIG4pKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSB2YWxpZGF0b3JDUEYodmFsdWUpIHtcbiAgICAgICAgbGV0IG51bWVyb3MsIGRpZ2l0b3MsIHNvbWEsIGksIHJlc3VsdGFkbywgZGlnaXRvc19pZ3VhaXM7XG5cbiAgICAgICAgZGlnaXRvc19pZ3VhaXMgPSAxO1xuXG4gICAgICAgIGlmICh2YWx1ZS5sZW5ndGggPCAxMSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChpID0gMDsgaSA8IHZhbHVlLmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgICAgICAgaWYgKHZhbHVlLmNoYXJBdChpKSAhPSB2YWx1ZS5jaGFyQXQoaSArIDEpKSB7XG4gICAgICAgICAgICAgICAgZGlnaXRvc19pZ3VhaXMgPSAwO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFkaWdpdG9zX2lndWFpcykge1xuICAgICAgICAgICAgbnVtZXJvcyA9IHZhbHVlLnN1YnN0cmluZygwLCA5KTtcbiAgICAgICAgICAgIGRpZ2l0b3MgPSB2YWx1ZS5zdWJzdHJpbmcoOSk7XG4gICAgICAgICAgICBzb21hID0gMDtcblxuICAgICAgICAgICAgZm9yIChpID0gMTA7IGkgPiAxOyBpLS0pIHtcbiAgICAgICAgICAgICAgICBzb21hICs9IG51bWVyb3MuY2hhckF0KDEwIC0gaSkgKiBpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXN1bHRhZG8gPSBzb21hICUgMTEgPCAyID8gMCA6IDExIC0gc29tYSAlIDExO1xuXG4gICAgICAgICAgICBpZiAocmVzdWx0YWRvICE9IGRpZ2l0b3MuY2hhckF0KDApKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBudW1lcm9zID0gdmFsdWUuc3Vic3RyaW5nKDAsIDEwKTtcbiAgICAgICAgICAgIHNvbWEgPSAwO1xuXG4gICAgICAgICAgICBmb3IgKGkgPSAxMTsgaSA+IDE7IGktLSkge1xuICAgICAgICAgICAgICAgIHNvbWEgKz0gbnVtZXJvcy5jaGFyQXQoMTEgLSBpKSAqIGk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJlc3VsdGFkbyA9IHNvbWEgJSAxMSA8IDIgPyAwIDogMTEgLSBzb21hICUgMTE7XG5cbiAgICAgICAgICAgIGlmIChyZXN1bHRhZG8gIT0gZGlnaXRvcy5jaGFyQXQoMSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXROYXRpdmVWYWx1ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50LnZhbHVlO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0RWxlbWVudFRpdGxlKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudC5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQudGl0bGU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZW1vdmVNYXNrcyh2YWx1ZTogc3RyaW5nKSB7XG4gICAgICAgIGlmICh0aGlzLm1hc2sgPT0gXCJkZWNpbWFsXCIpIHtcbiAgICAgICAgICAgIHZhbHVlID0gKHZhbHVlICsgXCJcIilcbiAgICAgICAgICAgICAgICAucmVwbGFjZSgvXFwuL2csICcnKVxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKCcsJywgJy4nKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLm1hc2sgPT0gXCJjbnBqLWNwZlwiIHx8IHRoaXMubWFzayA9PSBcImNwZlwiIHx8IHRoaXMubWFzayA9PSBcImNucGpcIiB8fCB0aGlzLm1hc2sgPT0gXCJjbnBqLWNwZi1ydXRcIiB8fCB0aGlzLm1hc2sgPT0gXCJjdWl0XCIpIHtcbiAgICAgICAgICAgIHZhbHVlID0gKHZhbHVlICsgXCJcIilcbiAgICAgICAgICAgICAgICAucmVwbGFjZSgvW15cXGRdL2csICcnKTtcbiAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgIHRoaXMubWFzayA9PSBJbnB1dE1hc2tFbnVtLkNFTExQSE9ORVxuICAgICAgICAgICAgfHwgdGhpcy5tYXNrID09IElucHV0TWFza0VudW0uSU5URVJOQVRJT05BTF9QSE9ORVxuICAgICAgICApIHtcbiAgICAgICAgICAgIHZhbHVlID0gKHZhbHVlICsgXCJcIilcbiAgICAgICAgICAgICAgICAucmVwbGFjZSgnKCcsICcnKVxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKCcpJywgJycpXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoJyAnLCAnJylcbiAgICAgICAgICAgICAgICAucmVwbGFjZSgnICcsICcnKVxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKCctJywgJycpXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoJysnLCAnJyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBoYXNFbWFpbFNlcnZpY2VWYWxpZGF0aW9uKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdHlwZW9mIHRoaXMubmd0VmFsaWRhdGlvblNlcnZpY2U/LmVtYWlsVmFsaWRhdGlvbiA9PT0gJ2Z1bmN0aW9uJztcbiAgICB9XG5cbiAgICBwcml2YXRlIGhhc1Bhc3N3b3JkVmFsaWRhdGlvbigpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB0aGlzLm5ndFZhbGlkYXRpb25TZXJ2aWNlPy5wYXNzd29yZFZhbGlkYXRpb24gPT09ICdmdW5jdGlvbic7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc0Rpc2FibGVkQnlQYXJlbnQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLm5ndEZvcm0/LmlzRGlzYWJsZWRcbiAgICAgICAgICAgIHx8IHRoaXMubmd0U2VjdGlvbj8uaXNEaXNhYmxlZFxuICAgICAgICAgICAgfHwgdGhpcy5uZ3RNb2RhbD8uaXNEaXNhYmxlZDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGhhc0NoYW5nZXNCZXR3ZWVuTW9kZWxzKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5yZW1vdmVNYXNrcyh0aGlzLmdldE5hdGl2ZVZhbHVlKCkpICE9PSB0aGlzLnZhbHVlO1xuICAgIH1cblxuICAgIHByaXZhdGUgZGVzdHJveVN1YnNjcmlwdGlvbnMoKSB7XG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5mb3JFYWNoKHN1YnNjcmlwdGlvbiA9PiBzdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKSk7XG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucyA9IFtdO1xuICAgIH1cbn1cbiIsIjxsYWJlbCAqbmdJZj1cImxhYmVsXCIgY2xhc3M9XCJtYi0yIGZsZXgge3sgbmd0U3R5bGUuY29tcGlsZShbJ2NvbG9yLnRleHQnLCAndGV4dCcsICdmb250J10pIH19XCIgW2hpZGRlbl09J3NoaW5pbmcnPlxuICAgIHt7IGxhYmVsIH19OlxuXG4gICAgPHNwYW4gKm5nSWY9XCJpc1JlcXVpcmVkXCIgY2xhc3M9XCJ0ZXh0LXJlZC01MDAgZm9udC1ib2xkIHRleHQtbWQgbWwtMVwiPio8L3NwYW4+XG5cbiAgICA8bmd0LWhlbHBlciAqbmdJZj1cImhlbHBUZXh0XCIgW2hlbHBUaXRsZV09XCJoZWxwVGl0bGVcIiBbaWNvbkNvbG9yXT1cImhlbHBUZXh0Q29sb3JcIlxuICAgICAgICBbaGVscGVyUmV2ZXJzZVlQb3NpdGlvbl09XCJoZWxwZXJSZXZlcnNlWVBvc2l0aW9uXCIgW2F1dG9YUmV2ZXJzZV09XCJoZWxwZXJBdXRvWFJldmVyc2VcIiBjbGFzcz1cIm1sLTFcIj5cbiAgICAgICAgPHNwYW4gW2lubmVySHRtbF09XCJoZWxwVGV4dFwiPjwvc3Bhbj5cbiAgICA8L25ndC1oZWxwZXI+XG48L2xhYmVsPlxuXG48ZGl2IGNsYXNzPVwie3sgc2hpbmluZyA/ICdoaWRkZW4nIDogJ2ZsZXggcmVsYXRpdmUnfX1cIj5cbiAgICA8aW5wdXQgYXV0b2NvbXBsZXRlPVwibmV3LXBhc3N3b3JkXCJcbiAgICAgICAgY2xhc3M9XCJmbGV4IGJvcmRlciBhcHBlYXJhbmNlLW5vbmUgZm9jdXM6b3V0bGluZS1ub25lIGxlYWRpbmctdGlnaHQgdy1mdWxsIHt7IGdldElucHV0UGFkZGluZ3MoKSB9fSB7eyBuZ3RTdHlsZS5jb21waWxlKFsnaCcsICd0ZXh0JywgJ2NvbG9yLmJvcmRlcicsICdjb2xvci5iZycsICdjb2xvci50ZXh0JywgJ3JvdW5kZWQnLCAnY3Vyc29yJ10pIH19XCJcbiAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkKClcIiBbcmVhZG9ubHldPVwiaXNSZWFkb25seSB8fCBsb2FkaW5nXCIgW3BsYWNlaG9sZGVyXT1cInBsYWNlaG9sZGVyXCJcbiAgICAgICAgW3N0eWxlXT1cInVwcGVyY2FzZSA/ICd0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlIWltcG9ydGFudCc6JydcIlxuICAgICAgICBbbmdDbGFzc109XCJ7J2lucHV0LWhhcy1lcnJvciBib3JkZXItcmVkLTcwMCc6IGZvcm1Db250cm9sPy5lcnJvcnMgJiYgKGZvcm1Db250cm9sPy5kaXJ0eSB8fCAoZm9ybUNvbnRhaW5lciAmJiBmb3JtQ29udGFpbmVyWydzdWJtaXR0ZWQnXSkpfVwiXG4gICAgICAgIFthdHRyLnR5cGVdPVwiaW5wdXRQcm9wZXJ0aWVzLmh0bWxUeXBlXCIgKG1vdXNlbGVhdmUpPVwicmVzdG9yZVBsYWNlaG9sZGVyKClcIiAoZm9jdXNvdXQpPVwicmVzdG9yZVBsYWNlaG9sZGVyKClcIlxuICAgICAgICAoaW5wdXQpPVwidXNlSW5wdXRFdmVudCA/IG9uTmF0aXZlQ2hhbmdlKCkgOiBudWxsXCIgKGNoYW5nZSk9XCIhdXNlSW5wdXRFdmVudCA/IG9uTmF0aXZlQ2hhbmdlKCkgOiBudWxsXCIgI2VsZW1lbnQ+XG4gICAgPHNwYW4gKm5nSWY9XCJpbm5lckxlZnRJY29uXCJcbiAgICAgICAgY2xhc3M9XCJhYnNvbHV0ZSBzZWxmLWNlbnRlciBweC0yIHt7IGlubmVyTGVmdEljb25Db2xvciB9fSB7eyBvbkNsaWNrTGVmdEljb24gPyAnY3Vyc29yLXBvaW50ZXInIDogJycgfX1cIlxuICAgICAgICAoY2xpY2spPVwib25DbGlja0xlZnRJY29uLmVtaXQoKVwiPlxuXG4gICAgICAgIDxuZ3Qtc3ZnICpuZ0lmPVwiIXNob3dSb3VuZGVkSWNvblwiIGNsYXNzPVwidGV4dC14cyBmaWxsLWN1cnJlbnRcIiBbc3JjXT0naW5uZXJMZWZ0SWNvbic+PC9uZ3Qtc3ZnPlxuICAgICAgICA8aW1nICpuZ0lmPVwic2hvd1JvdW5kZWRJY29uXCIgY2xhc3M9XCJyb3VuZGVkLWZ1bGwgaC00XCIgW3NyY109J2lubmVyTGVmdEljb24nPlxuICAgIDwvc3Bhbj5cblxuICAgIDxkaXYgKm5nSWY9XCJjdXN0b21Jbm5lckNvbnRlbnRUZW1wbGF0ZVwiIGNsYXNzPVwiYWJzb2x1dGUgc2VsZi1jZW50ZXIgcHgtMlwiPlxuICAgICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImN1c3RvbUlubmVyQ29udGVudFRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwiZmxleCBhYnNvbHV0ZSBoLWZ1bGwganVzdGlmeS1lbmQgcmlnaHQtMCB3LWF1dG9cIj5cbiAgICAgICAgPHNwYW4gKm5nSWY9XCIhZGlzYWJsZWQoKSAmJiBhbGxvd0NsZWFyICYmIHZhbHVlICYmICFsb2FkaW5nXCJcbiAgICAgICAgICAgIGNsYXNzPVwic2VsZi1jZW50ZXIgcmlnaHQtMCBweC0yIHRleHQtcmVkLTQwMCBjdXJzb3ItcG9pbnRlclwiIChjbGljayk9J2NsZWFySW5wdXQoJGV2ZW50KSc+XG4gICAgICAgICAgICA8c3ZnIGNsYXNzPVwiZmlsbC1jdXJyZW50IHNlbGYtY2VudGVyXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIj5cbiAgICAgICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICAgICAgICBkPVwiTTE5LjEgMTcuMmwtNS4zLTUuMyA1LjMtNS4zLTEuOC0xLjgtNS4zIDUuNC01LjMtNS4zLTEuOCAxLjcgNS4zIDUuMy01LjMgNS4zTDYuNyAxOWw1LjMtNS4zIDUuMyA1LjMgMS44LTEuOHpcIiAvPlxuICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgIDwvc3Bhbj5cblxuICAgICAgICA8c3BhbiAqbmdJZj1cImxvYWRpbmdcIiBjbGFzcz1cInNlbGYtY2VudGVyIHJpZ2h0LTAgcHgtMiB0ZXh0LWdyYXktNTAwXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGl2LWxvYWRlclwiPjwvZGl2PlxuICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgPHNwYW4gKm5nSWY9XCJ0eXBlID09ICdwYXNzd29yZCcgJiYgdmFsdWVcIiBjbGFzcz1cInNlbGYtY2VudGVyIHB4LTIgY3Vyc29yLXBvaW50ZXJcIj5cbiAgICAgICAgICAgIDxzdmcgKm5nSWY9XCJlbGVtZW50LnR5cGUgPT0gJ3Bhc3N3b3JkJ1wiIGNsYXNzPVwiZmlsbC1jdXJyZW50XCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiXG4gICAgICAgICAgICAgICAgdmlld0JveD1cIjAgMCAyMCAyMFwiIChjbGljayk9J3Nob3dQYXNzd29yZCgpJz5cbiAgICAgICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICAgICAgICBkPVwiTS4yIDEwYTExIDExIDAgMCAxIDE5LjYgMEExMSAxMSAwIDAgMSAuMiAxMHptOS44IDRhNCA0IDAgMSAwIDAtOCA0IDQgMCAwIDAgMCA4em0wLTJhMiAyIDAgMSAxIDAtNCAyIDIgMCAwIDEgMCA0elwiIC8+XG4gICAgICAgICAgICA8L3N2Zz5cblxuICAgICAgICAgICAgPHN2ZyAqbmdJZj1cImVsZW1lbnQudHlwZSA9PSAndGV4dCdcIiBjbGFzcz1cImZpbGwtY3VycmVudFwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIlxuICAgICAgICAgICAgICAgIHZpZXdCb3g9XCIwIDAgMjAgMjBcIiAoY2xpY2spPSdoaWRlUGFzc3dvcmQoKSc+XG4gICAgICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgICAgICAgZD1cIk0xMi44MSA0LjM2bC0xLjc3IDEuNzhhNCA0IDAgMCAwLTQuOSA0LjlsLTIuNzYgMi43NUMyLjA2IDEyLjc5Ljk2IDExLjQ5LjIgMTBhMTEgMTEgMCAwIDEgMTIuNi01LjY0em0zLjggMS44NWMxLjMzIDEgMi40MyAyLjMgMy4yIDMuNzlhMTEgMTEgMCAwIDEtMTIuNjIgNS42NGwxLjc3LTEuNzhhNCA0IDAgMCAwIDQuOS00LjlsMi43Ni0yLjc1em0tLjI1LTMuOTlsMS40MiAxLjQyTDMuNjQgMTcuNzhsLTEuNDItMS40MkwxNi4zNiAyLjIyelwiIC8+XG4gICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgIDxzcGFuICpuZ0lmPVwiaW5uZXJSaWdodEljb24gJiYgdHlwZSAhPSAncGFzc3dvcmQnXCJcbiAgICAgICAgICAgIGNsYXNzPVwic2VsZi1jZW50ZXIgcHgtMiB7eyBpbm5lclJpZ2h0SWNvbkNvbG9yIH19ICB7eyBvbkNsaWNrUmlnaHRJY29uID8gJ2N1cnNvci1wb2ludGVyJyA6ICcnIH19XCJcbiAgICAgICAgICAgIChjbGljayk9XCJvbkNsaWNrUmlnaHRJY29uLmVtaXQoKVwiPlxuICAgICAgICAgICAgPG5ndC1zdmcgY2xhc3M9XCJ0ZXh0LXh4cyBmaWxsLWN1cnJlbnRcIiBbc3JjXT0naW5uZXJSaWdodEljb24nPjwvbmd0LXN2Zz5cbiAgICAgICAgPC9zcGFuPlxuICAgIDwvZGl2PlxuPC9kaXY+XG5cbjxuZy1jb250YWluZXIgKm5nSWY9XCJzaG93Q2hhcmFjdGVyc0xlbmd0aCAmJiBtYXhUb3RhbENoYXJzQ291bnQgJiYgIXNoaW5pbmdcIj5cbiAgICA8cCBjbGFzcz1cInRleHQteHhzIG10LTFcIj5cbiAgICAgICAge3sgbmd0VHJhbnNsYXRlU2VydmljZS5uZ3RUZXh0QXJlYVJlbWFpbmluZ0NoYXJhY3RlcnMgfX06XG4gICAgICAgIDxzcGFuIGNsYXNzPVwiZm9udC1zZW1pYm9sZFwiPnt7IGdldFJlbWFpbmluZ0NoYXJhY3RlcnMoKSB9fTwvc3Bhbj5cbiAgICA8L3A+XG48L25nLWNvbnRhaW5lcj5cblxuPG5nLWNvbnRhaW5lciAqbmdJZj0nc2hpbmluZyc+XG4gICAgPGRpdiBjbGFzcz1cImZsZXhcIj5cbiAgICAgICAgPG5ndC1zaGluaW5nIGNsYXNzPVwie3sgbmd0U3R5bGUuY29tcGlsZShbJ2gnXSkgfX0gdy1mdWxsXCI+PC9uZ3Qtc2hpbmluZz5cbiAgICA8L2Rpdj5cbjwvbmctY29udGFpbmVyPlxuXG48aW5wdXQgKm5nSWY9J2NvbXBvbmVudFJlYWR5JyB0eXBlPVwiaGlkZGVuXCIgW25nTW9kZWxdPVwidmFsdWVcIiBbbmFtZV09XCJuYW1lXCIgW3ZhbHVlXT1cInZhbHVlXCI+XG5cbjxuZy1jb250ZW50PjwvbmctY29udGVudD5cblxuPG5ndC12YWxpZGF0aW9uIFtjb250cm9sXT1cImZvcm1Db250cm9sXCIgW2NvbnRhaW5lcl09XCJmb3JtQ29udGFpbmVyXCIgW21pblZhbHVlXT0nbWluVmFsdWUnIFttaW5MZW5ndGhdPSdtaW5MZW5ndGgnPlxuPC9uZ3QtdmFsaWRhdGlvbj5cbiJdfQ==
1
+ import { Component, EventEmitter, Host, Input, Optional, Output, Self, SkipSelf, ViewChild, } from '@angular/core';
2
+ import { ControlContainer, NgForm, Validators } from '@angular/forms';
3
+ import { NgtBaseNgModel, NgtMakeProvider } from '../../base/ngt-base-ng-model';
4
+ import { applyInputMask, InputMaskEnum, removeInputMask } from '../../helpers/input-mask/input-mask.helper';
5
+ import { NgtStylizableService } from '../../services/ngt-stylizable/ngt-stylizable.service';
6
+ import * as i0 from "@angular/core";
7
+ import * as i1 from "../../directives/ngt-stylizable/ngt-stylizable.directive";
8
+ import * as i2 from "@angular/forms";
9
+ import * as i3 from "../ngt-form/ngt-form.component";
10
+ import * as i4 from "../../services/http/ngt-http-validation.service";
11
+ import * as i5 from "../../services/http/ngt-http-resource.service";
12
+ import * as i6 from "../ngt-section/ngt-section.component";
13
+ import * as i7 from "../ngt-modal/ngt-modal.component";
14
+ import * as i8 from "../../services/http/ngt-translate.service";
15
+ import * as i9 from "@angular/common";
16
+ import * as i10 from "../ngt-validation/ngt-validation.component";
17
+ import * as i11 from "../ngt-shining/ngt-shining.component";
18
+ import * as i12 from "../ngt-svg/ngt-svg.component";
19
+ import * as i13 from "../ngt-helper/ngt-helper.component";
20
+ export class NgtInputComponent extends NgtBaseNgModel {
21
+ constructor(injector, renderer, changeDetector, ngtStylizableDirective, formContainer, ngtFormComponent, ngtValidationService, ngtResourceService, ngtForm, ngtSection, ngtModal, ngtTranslateService) {
22
+ super();
23
+ this.injector = injector;
24
+ this.renderer = renderer;
25
+ this.changeDetector = changeDetector;
26
+ this.ngtStylizableDirective = ngtStylizableDirective;
27
+ this.formContainer = formContainer;
28
+ this.ngtFormComponent = ngtFormComponent;
29
+ this.ngtValidationService = ngtValidationService;
30
+ this.ngtResourceService = ngtResourceService;
31
+ this.ngtForm = ngtForm;
32
+ this.ngtSection = ngtSection;
33
+ this.ngtModal = ngtModal;
34
+ this.ngtTranslateService = ngtTranslateService;
35
+ this.placeholder = '';
36
+ this.helpTextColor = 'text-green-500';
37
+ this.decimalMaskPrecision = 2;
38
+ this.showCharactersLength = false;
39
+ this.uppercase = false;
40
+ this.helperAutoXReverse = true;
41
+ this.type = 'text';
42
+ this.onClickLeftIcon = new EventEmitter();
43
+ this.onClickRightIcon = new EventEmitter();
44
+ this.validatePhoneResult = new EventEmitter();
45
+ this.inputProperties = {};
46
+ this.subscriptions = [];
47
+ if (this.ngtFormComponent) {
48
+ this.shining = this.ngtFormComponent.isShining();
49
+ this.subscriptions.push(this.ngtFormComponent.onShiningChange.subscribe((shining) => {
50
+ this.shining = shining;
51
+ }));
52
+ }
53
+ if (this.ngtStylizableDirective) {
54
+ this.ngtStyle = this.ngtStylizableDirective.getNgtStylizableService();
55
+ }
56
+ else {
57
+ this.ngtStyle = new NgtStylizableService();
58
+ }
59
+ this.ngtStyle.load(this.injector, 'NgtInput', {
60
+ h: 'h-12',
61
+ rounded: 'rounded',
62
+ text: 'text-sm',
63
+ font: 'font-normal',
64
+ color: {
65
+ border: 'border-gray-400 focus:border-gray-700',
66
+ bg: 'bg-bg-white focus:bg-white',
67
+ text: 'text-gray-800'
68
+ }
69
+ });
70
+ }
71
+ ngOnInit() {
72
+ if (!this.formContainer) {
73
+ console.error("The element must be inside a <form #form='ngForm'> tag!", this.element.nativeElement);
74
+ }
75
+ if (!this.name) {
76
+ console.error("The element must contain a name attribute!", this.element.nativeElement);
77
+ }
78
+ else {
79
+ setTimeout(() => {
80
+ this.componentReady = true;
81
+ this.changeDetector.detectChanges();
82
+ setTimeout(() => {
83
+ this.initComponent();
84
+ this.changeDetector.detectChanges();
85
+ if (!this.getElementTitle() || this.getElementTitle() === 'null') {
86
+ this.element.nativeElement.parentElement.parentElement.title = '';
87
+ }
88
+ this.changeDetector.detectChanges();
89
+ });
90
+ }, 500);
91
+ }
92
+ }
93
+ ngOnChanges(changes) {
94
+ this.setupMasks(changes.mask ? changes.mask.previousValue : null);
95
+ if (changes.match || changes.isRequired || changes.type || changes.mask || changes.minValue) {
96
+ this.updateValidations();
97
+ }
98
+ }
99
+ ngOnDestroy() {
100
+ this.destroySubscriptions();
101
+ }
102
+ onNativeChange() {
103
+ if (this.hasChangesBetweenModels()) {
104
+ this.value = this.removeMasks(this.getNativeValue());
105
+ }
106
+ }
107
+ change(value) {
108
+ if (value && typeof value === 'string' && this.mask == 'decimal') {
109
+ value = parseFloat(value);
110
+ }
111
+ if (!this.getNativeValue() || (this.validateMinValueOnMask)) {
112
+ this.element.nativeElement.value = value ?? '';
113
+ }
114
+ if (!value && value !== 0) {
115
+ this.clearInput();
116
+ }
117
+ let nativeValue = this.getNativeValue();
118
+ if (this.mask) {
119
+ let ngModelValue = this.removeMasks(nativeValue);
120
+ if (nativeValue && ngModelValue != this.value) {
121
+ this.value = ngModelValue;
122
+ }
123
+ if ((this.mask == InputMaskEnum.CELLPHONE || this.mask == InputMaskEnum.INTERNATIONAL_PHONE)
124
+ && this.allowPhoneValidation && this.value) {
125
+ this.validatePhone();
126
+ }
127
+ }
128
+ else {
129
+ let ngModelValue = this.removeMasks(value);
130
+ if (value && ngModelValue != value) {
131
+ this.value = ngModelValue;
132
+ }
133
+ if (this.value != nativeValue) {
134
+ this.element.nativeElement.value = ngModelValue;
135
+ }
136
+ }
137
+ if (this.componentReady) {
138
+ this.onValueChangeEvent.emit(this.value);
139
+ }
140
+ if (this.ngtResourceService && this.findExistingResource && this.value) {
141
+ this.searchExistingResource();
142
+ }
143
+ }
144
+ setFocus() {
145
+ setTimeout(() => {
146
+ this.element.nativeElement.focus();
147
+ }, 200);
148
+ }
149
+ clearInput(event) {
150
+ if (event) {
151
+ event.stopPropagation();
152
+ }
153
+ this.element.nativeElement.value = '';
154
+ this.value = '';
155
+ this.markAsPristine();
156
+ }
157
+ restorePlaceholder() {
158
+ setTimeout(() => this.element.nativeElement.placeholder = this.placeholder);
159
+ }
160
+ showPassword() {
161
+ this.element.nativeElement.type = 'text';
162
+ this.changeDetector.detectChanges();
163
+ }
164
+ hidePassword() {
165
+ this.element.nativeElement.type = 'password';
166
+ this.changeDetector.detectChanges();
167
+ }
168
+ getInputPaddings() {
169
+ let paddingClass = '';
170
+ if (this.innerLeftIcon || this.customInnerContentTemplate) {
171
+ paddingClass += 'pl-10 pr-4 ';
172
+ }
173
+ else {
174
+ paddingClass += 'px-4 ';
175
+ }
176
+ if (this.innerRightIcon || this.allowClear || this.type == 'password') {
177
+ if (this.allowClear && this.value && (this.innerRightIcon || this.type == 'password')) {
178
+ paddingClass += 'pr-10 ';
179
+ }
180
+ else {
181
+ paddingClass += 'pr-8 ';
182
+ }
183
+ }
184
+ return paddingClass;
185
+ }
186
+ getRemainingCharacters() {
187
+ if (this.element?.nativeElement?.value?.length) {
188
+ if ((this.maxTotalCharsCount - this.element.nativeElement.value.length) > 0) {
189
+ return this.maxTotalCharsCount - this.element.nativeElement.value.length;
190
+ }
191
+ else {
192
+ return 0;
193
+ }
194
+ }
195
+ return this.maxTotalCharsCount;
196
+ }
197
+ hasFocus() {
198
+ return document.activeElement === this.element.nativeElement;
199
+ }
200
+ disabled() {
201
+ return this.isDisabled || this.isDisabledByParent();
202
+ }
203
+ initComponent() {
204
+ if (this.formContainer && this.formContainer.control && (this.formControl = this.formContainer.control.get(this.name))) {
205
+ if (this.focus) {
206
+ this.setFocus();
207
+ }
208
+ let watch = "change";
209
+ if (this.jit) {
210
+ watch += " keyup keydown keypress";
211
+ }
212
+ watch.split(' ').forEach((evt) => {
213
+ this.renderer.listen(this.element.nativeElement, evt, () => {
214
+ let nativeValue = this.removeMasks(this.getNativeValue());
215
+ if (this.value != nativeValue) {
216
+ this.value = nativeValue;
217
+ }
218
+ });
219
+ });
220
+ this.renderer.listen(this.element.nativeElement, "keydown", (event) => {
221
+ if (this.element.nativeElement && this.element.nativeElement.value && this.element.nativeElement.value.length >= this.maxLength) {
222
+ // Backspace and delete
223
+ if (event.keyCode != 8 && event.keyCode != 46) {
224
+ event.preventDefault();
225
+ return false;
226
+ }
227
+ }
228
+ });
229
+ this.maxTotalCharsCount = this.maxLength;
230
+ this.updateValidations();
231
+ if (this.match) {
232
+ this.renderer.listen(this.element.nativeElement, "keypress", () => {
233
+ this.matchValidator();
234
+ });
235
+ }
236
+ if (this.value) {
237
+ this.formControl.markAsDirty();
238
+ }
239
+ else {
240
+ this.formControl.markAsPristine();
241
+ }
242
+ }
243
+ this.setupProperties();
244
+ }
245
+ updateValidations() {
246
+ if (!this.formControl) {
247
+ return;
248
+ }
249
+ const syncValidators = [];
250
+ if (this.type == 'email') {
251
+ syncValidators.push(Validators.email);
252
+ }
253
+ if (this.isRequired) {
254
+ syncValidators.push(Validators.required);
255
+ }
256
+ if (this.maxLength) {
257
+ syncValidators.push(Validators.maxLength(this.maxLength));
258
+ }
259
+ if (this.minLength) {
260
+ syncValidators.push(Validators.minLength(this.minLength));
261
+ }
262
+ if (this.mask == 'cnpj-cpf' || this.mask == 'cnpj-cpf-rut' || this.mask == 'cpf') {
263
+ syncValidators.push(this.cnpjCpfValidator());
264
+ }
265
+ if (this.mask == 'time') {
266
+ syncValidators.push(this.timeValidator());
267
+ }
268
+ if (this.match) {
269
+ syncValidators.push(this.matchValidator());
270
+ }
271
+ if (this.minValue !== undefined) {
272
+ syncValidators.push(this.minValueValidator());
273
+ }
274
+ if (this.multipleOf) {
275
+ syncValidators.push(this.multipleOfValidator());
276
+ }
277
+ if (this.externalServerDependency) {
278
+ syncValidators.push(this.externalServerDependencyValidator());
279
+ }
280
+ setTimeout(() => {
281
+ this.formControl.setValidators(syncValidators);
282
+ const asyncValidators = [];
283
+ if (this.uniqueResource) {
284
+ asyncValidators.push(this.uniqueValidator());
285
+ }
286
+ if (this.type == 'email' && this.hasEmailServiceValidation()) {
287
+ asyncValidators.push(this.emailValidator());
288
+ }
289
+ if (this.type == 'login' && this.hasEmailServiceValidation()) {
290
+ asyncValidators.push(this.emailValidator(true));
291
+ }
292
+ if (this.type == 'password' && this.validatePassword && this.hasPasswordValidation()) {
293
+ asyncValidators.push(this.passwordValidator());
294
+ }
295
+ if (this.customValidator) {
296
+ asyncValidators.push(this.customValidator());
297
+ }
298
+ this.formControl.setAsyncValidators(asyncValidators);
299
+ this.formControl.updateValueAndValidity();
300
+ });
301
+ }
302
+ setupMasks(previousMask) {
303
+ if (this.mask != previousMask && !this.mask) {
304
+ removeInputMask(this.element.nativeElement);
305
+ return this.clearInput();
306
+ }
307
+ let masks = {
308
+ [InputMaskEnum.CPF]: {
309
+ mask: ['999.999.999-99'],
310
+ showMaskOnHover: false
311
+ },
312
+ [InputMaskEnum.CNPJ]: {
313
+ mask: ['99.999.999/9999-99'],
314
+ showMaskOnHover: false
315
+ },
316
+ [InputMaskEnum.CUIT]: {
317
+ mask: ['99-99999999-9'],
318
+ clearMaskOnLostFocus: false
319
+ },
320
+ [InputMaskEnum.RUT]: {
321
+ mask: ['999999999999'],
322
+ clearMaskOnLostFocus: false
323
+ },
324
+ [InputMaskEnum.CPF_CNPJ_RUT]: {
325
+ mask: ['999.999.999-99', '999999999999', '99.999.999/9999-99'],
326
+ keepStatic: true,
327
+ showMaskOnHover: false
328
+ },
329
+ [InputMaskEnum.CPF_CNPJ]: {
330
+ mask: ['999.999.999-99', '99.999.999/9999-99'],
331
+ keepStatic: true,
332
+ showMaskOnHover: false
333
+ },
334
+ [InputMaskEnum.DECIMAL]: {
335
+ digits: this.decimalMaskPrecision,
336
+ groupSeparator: '.',
337
+ radixPoint: ',',
338
+ autoGroup: true,
339
+ repeat: 16,
340
+ rightAlign: false,
341
+ max: this.maxValue,
342
+ showMaskOnHover: false
343
+ },
344
+ [InputMaskEnum.CELLPHONE]: {
345
+ mask: ['(99) 999-999', '(99) 9999-9999', '(99) 99999-9999'],
346
+ keepStatic: true,
347
+ showMaskOnHover: false
348
+ },
349
+ [InputMaskEnum.INTERNATIONAL_PHONE]: {
350
+ mask: ['+999 99 999-999', '+99 (99) 9999-9999', '+99 (99) 99999-9999', '+999 (99) 9999-9999', '+999 (99) 99999-9999'],
351
+ keepStatic: true,
352
+ showMaskOnHover: false
353
+ },
354
+ [InputMaskEnum.PLATE]: {
355
+ mask: ['AAA-9&99'],
356
+ keepStatic: true,
357
+ showMaskOnHover: false
358
+ },
359
+ [InputMaskEnum.CEP]: {
360
+ mask: ['99999-999'],
361
+ showMaskOnHover: false
362
+ },
363
+ [InputMaskEnum.INTEGER]: {
364
+ max: this.maxValue,
365
+ min: this.validateMinValueOnMask ? this.minValue : undefined,
366
+ rightAlign: false,
367
+ showMaskOnHover: false
368
+ },
369
+ [InputMaskEnum.NUMERIC_STRING]: {
370
+ regex: "[0-9]*",
371
+ showMaskOnHover: false
372
+ },
373
+ [InputMaskEnum.TIME]: '99:99',
374
+ };
375
+ if (this.mask == InputMaskEnum.DECIMAL) {
376
+ applyInputMask(this.element.nativeElement, InputMaskEnum.DECIMAL, masks[this.mask]);
377
+ }
378
+ else if (this.mask == InputMaskEnum.INTEGER) {
379
+ applyInputMask(this.element.nativeElement, InputMaskEnum.INTEGER, masks[this.mask]);
380
+ }
381
+ else {
382
+ applyInputMask(this.element.nativeElement, masks[this.mask]);
383
+ }
384
+ }
385
+ setupProperties() {
386
+ let props = {
387
+ shortText: {
388
+ htmlType: "text",
389
+ length: 30
390
+ },
391
+ text: {
392
+ htmlType: "text",
393
+ length: 100
394
+ },
395
+ longText: {
396
+ htmlType: "text",
397
+ length: 150
398
+ },
399
+ extraLongText: {
400
+ htmlType: "text",
401
+ length: 300
402
+ },
403
+ customText: {
404
+ htmlType: "text",
405
+ length: this.maxLength
406
+ },
407
+ password: {
408
+ htmlType: "password",
409
+ length: 150
410
+ },
411
+ email: {
412
+ htmlType: "text",
413
+ length: 100,
414
+ },
415
+ decimal: {
416
+ htmlType: "text",
417
+ length: 9,
418
+ }
419
+ };
420
+ if (this.type in props) {
421
+ this.inputProperties = props[this.type];
422
+ this.maxLength = this.inputProperties.length;
423
+ }
424
+ else {
425
+ console.warn("Type [" + this.type + "] is not a valid tail-form-input type!", this.element.nativeElement);
426
+ }
427
+ }
428
+ minValueValidator() {
429
+ return (control) => parseFloat(control.value) < this.minValue ? { 'minValue': true } : null;
430
+ }
431
+ multipleOfValidator() {
432
+ return (control) => {
433
+ if (control.value) {
434
+ return (control.value % this.multipleOf !== 0) ? { 'multipleOf': true } : null;
435
+ }
436
+ };
437
+ }
438
+ externalServerDependencyValidator() {
439
+ // TODO: Validar tempo de requisição
440
+ return (control) => !control.value ? { 'externalServerDependency': true } : null;
441
+ }
442
+ timeValidator() {
443
+ const regexExp = new RegExp('^(0[0-9]|1[0-9]|2[0-3]):[0-5][0-9]$');
444
+ return (control) => {
445
+ if (control.value) {
446
+ if (regexExp.test(control.value)) {
447
+ return null;
448
+ }
449
+ else {
450
+ return { 'time': true };
451
+ }
452
+ }
453
+ };
454
+ }
455
+ cnpjCpfValidator() {
456
+ return (control) => {
457
+ if (!control.value) {
458
+ return null;
459
+ }
460
+ if (control.value && control.value.length <= 11) {
461
+ if (this.validatorCPF(control.value)) {
462
+ return null;
463
+ }
464
+ else {
465
+ return { 'cpf': true };
466
+ }
467
+ }
468
+ else if (control.value && control.value.length == 12) {
469
+ return null;
470
+ }
471
+ else {
472
+ if (control.value && this.validatorCNPJ(control.value)) {
473
+ return null;
474
+ }
475
+ else {
476
+ return { 'cnpj': true };
477
+ }
478
+ }
479
+ };
480
+ }
481
+ matchValidator() {
482
+ return (control) => {
483
+ if (this.value != this.match) {
484
+ return { 'match': true };
485
+ }
486
+ else {
487
+ return null;
488
+ }
489
+ };
490
+ }
491
+ emailValidator(isLoginValidation = false) {
492
+ return (control) => {
493
+ if (this.emailValidatorTimeout) {
494
+ clearTimeout(this.emailValidatorTimeout);
495
+ }
496
+ if (this.value) {
497
+ return new Promise((resolve) => {
498
+ this.emailValidatorTimeout = setTimeout(() => {
499
+ this.loading = true;
500
+ this.ngtValidationService.emailValidation(this.value)
501
+ .then((response) => {
502
+ this.loading = false;
503
+ if (isLoginValidation) {
504
+ resolve(response.valid ? { 'login': true } : null);
505
+ }
506
+ resolve(response.valid ? null : { 'email': true });
507
+ })
508
+ .catch(() => {
509
+ this.loading = false;
510
+ resolve(null);
511
+ });
512
+ }, 500);
513
+ });
514
+ }
515
+ return Promise.resolve(null);
516
+ };
517
+ }
518
+ passwordValidator() {
519
+ return (control) => {
520
+ if (this.passwordValidatorTimeout) {
521
+ clearTimeout(this.passwordValidatorTimeout);
522
+ }
523
+ if (this.value) {
524
+ return new Promise((resolve) => {
525
+ this.passwordValidatorTimeout = setTimeout(() => {
526
+ this.loading = true;
527
+ this.ngtValidationService.passwordValidation(this.value, this.passwordableId, this.passwordPolicyId)
528
+ .then((response) => {
529
+ this.loading = false;
530
+ resolve(response.valid ? null : { 'invalid_password': true });
531
+ })
532
+ .catch(() => {
533
+ this.loading = false;
534
+ resolve(null);
535
+ });
536
+ }, 500);
537
+ });
538
+ }
539
+ return Promise.resolve(null);
540
+ };
541
+ }
542
+ async searchExistingResource() {
543
+ if (this.searchExistingResourceTimeout) {
544
+ clearTimeout(this.searchExistingResourceTimeout);
545
+ }
546
+ this.searchExistingResourceTimeout = setTimeout(() => {
547
+ this.loading = true;
548
+ this.findExistingResource.value = this.value;
549
+ this.ngtResourceService.findExisting(this.findExistingResource)
550
+ .then((response) => this.existingResourceId = response.id)
551
+ .catch(() => this.existingResourceId = null)
552
+ .finally(() => this.loading = false);
553
+ }, 500);
554
+ }
555
+ async validatePhone() {
556
+ if (this.phoneValidatorTimeout) {
557
+ clearTimeout(this.phoneValidatorTimeout);
558
+ }
559
+ this.phoneValidatorTimeout = setTimeout(() => {
560
+ this.loading = true;
561
+ this.ngtValidationService.phoneValidation(this.value)
562
+ .then((response) => this.validatePhoneResult.emit(response))
563
+ .finally(() => this.loading = false);
564
+ });
565
+ }
566
+ uniqueValidator() {
567
+ if (!this.ngtValidationService) {
568
+ throw new Error("In order to use unique validation you must provide a implementation for NgtHttpValidationService class!");
569
+ }
570
+ return (control) => {
571
+ if (this.uniqueValidatorTimeout) {
572
+ clearTimeout(this.uniqueValidatorTimeout);
573
+ }
574
+ if (this.value && this.uniqueResource) {
575
+ return new Promise((resolve) => {
576
+ this.uniqueValidatorTimeout = setTimeout(() => {
577
+ this.loading = true;
578
+ this.ngtValidationService.unique(this.uniqueResource, this.value).then((response) => {
579
+ this.loading = false;
580
+ resolve(response.valid ? null : { 'unique': true });
581
+ }).catch(() => {
582
+ this.loading = false;
583
+ resolve(null);
584
+ });
585
+ }, 500);
586
+ });
587
+ }
588
+ return Promise.resolve(null);
589
+ };
590
+ }
591
+ validatorCNPJ(value) {
592
+ let b = [6, 5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2];
593
+ if ((value = value.replace(/[^\d]/g, "")).length != 14) {
594
+ return false;
595
+ }
596
+ if (/0{14}/.test(value)) {
597
+ return false;
598
+ }
599
+ let n = 0;
600
+ for (let i = 0; i < 12; n += value[i] * b[++i]) {
601
+ ;
602
+ }
603
+ if (value[12] != (((n %= 11) < 2) ? 0 : 11 - n)) {
604
+ return false;
605
+ }
606
+ n = 0;
607
+ for (let i = 0; i <= 12; n += value[i] * b[i++]) {
608
+ ;
609
+ }
610
+ if (value[13] != (((n %= 11) < 2) ? 0 : 11 - n)) {
611
+ return false;
612
+ }
613
+ return true;
614
+ }
615
+ ;
616
+ validatorCPF(value) {
617
+ let numeros, digitos, soma, i, resultado, digitos_iguais;
618
+ digitos_iguais = 1;
619
+ if (value.length < 11) {
620
+ return false;
621
+ }
622
+ for (i = 0; i < value.length - 1; i++) {
623
+ if (value.charAt(i) != value.charAt(i + 1)) {
624
+ digitos_iguais = 0;
625
+ break;
626
+ }
627
+ }
628
+ if (!digitos_iguais) {
629
+ numeros = value.substring(0, 9);
630
+ digitos = value.substring(9);
631
+ soma = 0;
632
+ for (i = 10; i > 1; i--) {
633
+ soma += numeros.charAt(10 - i) * i;
634
+ }
635
+ resultado = soma % 11 < 2 ? 0 : 11 - soma % 11;
636
+ if (resultado != digitos.charAt(0)) {
637
+ return false;
638
+ }
639
+ numeros = value.substring(0, 10);
640
+ soma = 0;
641
+ for (i = 11; i > 1; i--) {
642
+ soma += numeros.charAt(11 - i) * i;
643
+ }
644
+ resultado = soma % 11 < 2 ? 0 : 11 - soma % 11;
645
+ if (resultado != digitos.charAt(1)) {
646
+ return false;
647
+ }
648
+ return true;
649
+ }
650
+ else {
651
+ return false;
652
+ }
653
+ }
654
+ getNativeValue() {
655
+ return this.element.nativeElement.value;
656
+ }
657
+ getElementTitle() {
658
+ return this.element.nativeElement.parentElement.parentElement.title;
659
+ }
660
+ removeMasks(value) {
661
+ if (this.mask == "decimal") {
662
+ value = (value + "")
663
+ .replace(/\./g, '')
664
+ .replace(',', '.');
665
+ }
666
+ else if (this.mask == "cnpj-cpf" || this.mask == "cpf" || this.mask == "cnpj" || this.mask == "cnpj-cpf-rut" || this.mask == "cuit") {
667
+ value = (value + "")
668
+ .replace(/[^\d]/g, '');
669
+ }
670
+ else if (this.mask == InputMaskEnum.CELLPHONE
671
+ || this.mask == InputMaskEnum.INTERNATIONAL_PHONE) {
672
+ value = (value + "")
673
+ .replace('(', '')
674
+ .replace(')', '')
675
+ .replace(' ', '')
676
+ .replace(' ', '')
677
+ .replace('-', '')
678
+ .replace('+', '');
679
+ }
680
+ return value;
681
+ }
682
+ hasEmailServiceValidation() {
683
+ return typeof this.ngtValidationService?.emailValidation === 'function';
684
+ }
685
+ hasPasswordValidation() {
686
+ return typeof this.ngtValidationService?.passwordValidation === 'function';
687
+ }
688
+ isDisabledByParent() {
689
+ return this.ngtForm?.isDisabled
690
+ || this.ngtSection?.isDisabled
691
+ || this.ngtModal?.isDisabled;
692
+ }
693
+ hasChangesBetweenModels() {
694
+ return this.removeMasks(this.getNativeValue()) !== this.value;
695
+ }
696
+ destroySubscriptions() {
697
+ this.subscriptions.forEach(subscription => subscription.unsubscribe());
698
+ this.subscriptions = [];
699
+ }
700
+ }
701
+ NgtInputComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.8", ngImport: i0, type: NgtInputComponent, deps: [{ token: i0.Injector }, { token: i0.Renderer2 }, { token: i0.ChangeDetectorRef }, { token: i1.NgtStylizableDirective, optional: true, self: true }, { token: i2.ControlContainer, host: true, optional: true }, { token: i3.NgtFormComponent, optional: true, skipSelf: true }, { token: i4.NgtHttpValidationService, optional: true, skipSelf: true }, { token: i5.NgtHttpResourceService, optional: true, skipSelf: true }, { token: i3.NgtFormComponent, optional: true, skipSelf: true }, { token: i6.NgtSectionComponent, optional: true, skipSelf: true }, { token: i7.NgtModalComponent, optional: true, skipSelf: true }, { token: i8.NgtTranslateService, optional: true }], target: i0.ɵɵFactoryTarget.Component });
702
+ NgtInputComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.8", type: NgtInputComponent, selector: "ngt-input", inputs: { label: "label", placeholder: "placeholder", shining: "shining", loading: "loading", helpTitle: "helpTitle", helpTextColor: "helpTextColor", helpText: "helpText", innerLeftIcon: "innerLeftIcon", innerLeftIconColor: "innerLeftIconColor", innerRightIcon: "innerRightIcon", innerRightIconColor: "innerRightIconColor", decimalMaskPrecision: "decimalMaskPrecision", showCharactersLength: "showCharactersLength", uppercase: "uppercase", customInnerContentTemplate: "customInnerContentTemplate", helperReverseYPosition: "helperReverseYPosition", helperAutoXReverse: "helperAutoXReverse", isDisabled: "isDisabled", isReadonly: "isReadonly", showRoundedIcon: "showRoundedIcon", type: "type", name: "name", mask: "mask", focus: "focus", allowClear: "allowClear", jit: "jit", useInputEvent: "useInputEvent", findExistingResource: "findExistingResource", allowPhoneValidation: "allowPhoneValidation", validatePassword: "validatePassword", passwordableId: "passwordableId", passwordPolicyId: "passwordPolicyId", isRequired: "isRequired", uniqueResource: "uniqueResource", minValue: "minValue", maxValue: "maxValue", maxLength: "maxLength", minLength: "minLength", match: "match", multipleOf: "multipleOf", validateMinValueOnMask: "validateMinValueOnMask", externalServerDependency: "externalServerDependency", customValidator: "customValidator" }, outputs: { onClickLeftIcon: "onClickLeftIcon", onClickRightIcon: "onClickRightIcon", validatePhoneResult: "validatePhoneResult" }, providers: [
703
+ NgtMakeProvider(NgtInputComponent),
704
+ ], viewQueries: [{ propertyName: "element", first: true, predicate: ["element"], descendants: true, static: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<label *ngIf=\"label\" class=\"mb-2 flex {{ ngtStyle.compile(['color.text', 'text', 'font']) }}\" [hidden]='shining'>\r\n {{ label }}:\r\n\r\n <span *ngIf=\"isRequired\" class=\"text-red-500 font-bold text-md ml-1\">*</span>\r\n\r\n <ngt-helper *ngIf=\"helpText\" [helpTitle]=\"helpTitle\" [iconColor]=\"helpTextColor\"\r\n [helperReverseYPosition]=\"helperReverseYPosition\" [autoXReverse]=\"helperAutoXReverse\" class=\"ml-1\">\r\n <span [innerHtml]=\"helpText\"></span>\r\n </ngt-helper>\r\n</label>\r\n\r\n<div class=\"{{ shining ? 'hidden' : 'flex relative'}}\">\r\n <input autocomplete=\"new-password\"\r\n class=\"flex border appearance-none focus:outline-none leading-tight w-full {{ getInputPaddings() }} {{ ngtStyle.compile(['h', 'text', 'color.border', 'color.bg', 'color.text', 'rounded', 'cursor']) }}\"\r\n [disabled]=\"disabled()\" [readonly]=\"isReadonly || loading\" [placeholder]=\"placeholder\"\r\n [style]=\"uppercase ? 'text-transform: uppercase!important':''\"\r\n [ngClass]=\"{'input-has-error border-red-700': formControl?.errors && (formControl?.dirty || (formContainer && formContainer['submitted']))}\"\r\n [attr.type]=\"inputProperties.htmlType\" (mouseleave)=\"restorePlaceholder()\" (focusout)=\"restorePlaceholder()\"\r\n (input)=\"useInputEvent ? onNativeChange() : null\" (change)=\"!useInputEvent ? onNativeChange() : null\" #element>\r\n <span *ngIf=\"innerLeftIcon\"\r\n class=\"absolute self-center px-2 {{ innerLeftIconColor }} {{ onClickLeftIcon ? 'cursor-pointer' : '' }}\"\r\n (click)=\"onClickLeftIcon.emit()\">\r\n\r\n <ngt-svg *ngIf=\"!showRoundedIcon\" class=\"text-xs fill-current\" [src]='innerLeftIcon'></ngt-svg>\r\n <img *ngIf=\"showRoundedIcon\" class=\"rounded-full h-4\" [src]='innerLeftIcon'>\r\n </span>\r\n\r\n <div *ngIf=\"customInnerContentTemplate\" class=\"absolute self-center px-2\">\r\n <ng-container [ngTemplateOutlet]=\"customInnerContentTemplate\"></ng-container>\r\n </div>\r\n\r\n <div class=\"flex absolute h-full justify-end right-0 w-auto\">\r\n <span *ngIf=\"!disabled() && allowClear && value && !loading\"\r\n class=\"self-center right-0 px-2 text-red-400 cursor-pointer\" (click)='clearInput($event)'>\r\n <svg class=\"fill-current self-center\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\">\r\n <path\r\n d=\"M19.1 17.2l-5.3-5.3 5.3-5.3-1.8-1.8-5.3 5.4-5.3-5.3-1.8 1.7 5.3 5.3-5.3 5.3L6.7 19l5.3-5.3 5.3 5.3 1.8-1.8z\" />\r\n </svg>\r\n </span>\r\n\r\n <span *ngIf=\"loading\" class=\"self-center right-0 px-2 text-gray-500\">\r\n <div class=\"div-loader\"></div>\r\n </span>\r\n\r\n <span *ngIf=\"type == 'password' && value\" class=\"self-center px-2 cursor-pointer\">\r\n <svg *ngIf=\"element.type == 'password'\" class=\"fill-current\" xmlns=\"http://www.w3.org/2000/svg\"\r\n viewBox=\"0 0 20 20\" (click)='showPassword()'>\r\n <path\r\n d=\"M.2 10a11 11 0 0 1 19.6 0A11 11 0 0 1 .2 10zm9.8 4a4 4 0 1 0 0-8 4 4 0 0 0 0 8zm0-2a2 2 0 1 1 0-4 2 2 0 0 1 0 4z\" />\r\n </svg>\r\n\r\n <svg *ngIf=\"element.type == 'text'\" class=\"fill-current\" xmlns=\"http://www.w3.org/2000/svg\"\r\n viewBox=\"0 0 20 20\" (click)='hidePassword()'>\r\n <path\r\n d=\"M12.81 4.36l-1.77 1.78a4 4 0 0 0-4.9 4.9l-2.76 2.75C2.06 12.79.96 11.49.2 10a11 11 0 0 1 12.6-5.64zm3.8 1.85c1.33 1 2.43 2.3 3.2 3.79a11 11 0 0 1-12.62 5.64l1.77-1.78a4 4 0 0 0 4.9-4.9l2.76-2.75zm-.25-3.99l1.42 1.42L3.64 17.78l-1.42-1.42L16.36 2.22z\" />\r\n </svg>\r\n </span>\r\n\r\n <span *ngIf=\"innerRightIcon && type != 'password'\"\r\n class=\"self-center px-2 {{ innerRightIconColor }} {{ onClickRightIcon ? 'cursor-pointer' : '' }}\"\r\n (click)=\"onClickRightIcon.emit()\">\r\n <ngt-svg class=\"text-xxs fill-current\" [src]='innerRightIcon'></ngt-svg>\r\n </span>\r\n </div>\r\n</div>\r\n\r\n<ng-container *ngIf=\"showCharactersLength && maxTotalCharsCount && !shining\">\r\n <p class=\"text-xxs mt-1\">\r\n {{ ngtTranslateService.ngtTextAreaRemainingCharacters }}:\r\n <span class=\"font-semibold\">{{ getRemainingCharacters() }}</span>\r\n </p>\r\n</ng-container>\r\n\r\n<ng-container *ngIf='shining'>\r\n <div class=\"flex\">\r\n <ngt-shining class=\"{{ ngtStyle.compile(['h']) }} w-full\"></ngt-shining>\r\n </div>\r\n</ng-container>\r\n\r\n<input *ngIf='componentReady' type=\"hidden\" [ngModel]=\"value\" [name]=\"name\" [value]=\"value\">\r\n\r\n<ng-content></ng-content>\r\n\r\n<ngt-validation [control]=\"formControl\" [container]=\"formContainer\" [minValue]='minValue' [minLength]='minLength'>\r\n</ngt-validation>\r\n", styles: [".div-loader{width:20px;height:20px;border:3px solid #a0aec038;border-top-color:#a0aec0;border-radius:50%;animation:spin 1s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}\n"], dependencies: [{ kind: "directive", type: i9.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i9.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i9.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i10.NgtValidationComponent, selector: "ngt-validation", inputs: ["control", "container", "minValue", "minLength"] }, { kind: "component", type: i11.NgtShiningComponent, selector: "ngt-shining", inputs: ["shiningWidth"] }, { kind: "component", type: i12.NgtSvgComponent, selector: "ngt-svg", inputs: ["src", "class"] }, { kind: "component", type: i13.NgtHelperComponent, selector: "ngt-helper", inputs: ["helpTextColor", "helpText", "helpTitle", "icon", "iconSize", "iconColor", "iconTitle", "tooltipSize", "autoXReverse", "helperReverseYPosition"] }], viewProviders: [
705
+ { provide: ControlContainer, useExisting: NgForm }
706
+ ] });
707
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.8", ngImport: i0, type: NgtInputComponent, decorators: [{
708
+ type: Component,
709
+ args: [{ selector: 'ngt-input', providers: [
710
+ NgtMakeProvider(NgtInputComponent),
711
+ ], viewProviders: [
712
+ { provide: ControlContainer, useExisting: NgForm }
713
+ ], template: "<label *ngIf=\"label\" class=\"mb-2 flex {{ ngtStyle.compile(['color.text', 'text', 'font']) }}\" [hidden]='shining'>\r\n {{ label }}:\r\n\r\n <span *ngIf=\"isRequired\" class=\"text-red-500 font-bold text-md ml-1\">*</span>\r\n\r\n <ngt-helper *ngIf=\"helpText\" [helpTitle]=\"helpTitle\" [iconColor]=\"helpTextColor\"\r\n [helperReverseYPosition]=\"helperReverseYPosition\" [autoXReverse]=\"helperAutoXReverse\" class=\"ml-1\">\r\n <span [innerHtml]=\"helpText\"></span>\r\n </ngt-helper>\r\n</label>\r\n\r\n<div class=\"{{ shining ? 'hidden' : 'flex relative'}}\">\r\n <input autocomplete=\"new-password\"\r\n class=\"flex border appearance-none focus:outline-none leading-tight w-full {{ getInputPaddings() }} {{ ngtStyle.compile(['h', 'text', 'color.border', 'color.bg', 'color.text', 'rounded', 'cursor']) }}\"\r\n [disabled]=\"disabled()\" [readonly]=\"isReadonly || loading\" [placeholder]=\"placeholder\"\r\n [style]=\"uppercase ? 'text-transform: uppercase!important':''\"\r\n [ngClass]=\"{'input-has-error border-red-700': formControl?.errors && (formControl?.dirty || (formContainer && formContainer['submitted']))}\"\r\n [attr.type]=\"inputProperties.htmlType\" (mouseleave)=\"restorePlaceholder()\" (focusout)=\"restorePlaceholder()\"\r\n (input)=\"useInputEvent ? onNativeChange() : null\" (change)=\"!useInputEvent ? onNativeChange() : null\" #element>\r\n <span *ngIf=\"innerLeftIcon\"\r\n class=\"absolute self-center px-2 {{ innerLeftIconColor }} {{ onClickLeftIcon ? 'cursor-pointer' : '' }}\"\r\n (click)=\"onClickLeftIcon.emit()\">\r\n\r\n <ngt-svg *ngIf=\"!showRoundedIcon\" class=\"text-xs fill-current\" [src]='innerLeftIcon'></ngt-svg>\r\n <img *ngIf=\"showRoundedIcon\" class=\"rounded-full h-4\" [src]='innerLeftIcon'>\r\n </span>\r\n\r\n <div *ngIf=\"customInnerContentTemplate\" class=\"absolute self-center px-2\">\r\n <ng-container [ngTemplateOutlet]=\"customInnerContentTemplate\"></ng-container>\r\n </div>\r\n\r\n <div class=\"flex absolute h-full justify-end right-0 w-auto\">\r\n <span *ngIf=\"!disabled() && allowClear && value && !loading\"\r\n class=\"self-center right-0 px-2 text-red-400 cursor-pointer\" (click)='clearInput($event)'>\r\n <svg class=\"fill-current self-center\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\">\r\n <path\r\n d=\"M19.1 17.2l-5.3-5.3 5.3-5.3-1.8-1.8-5.3 5.4-5.3-5.3-1.8 1.7 5.3 5.3-5.3 5.3L6.7 19l5.3-5.3 5.3 5.3 1.8-1.8z\" />\r\n </svg>\r\n </span>\r\n\r\n <span *ngIf=\"loading\" class=\"self-center right-0 px-2 text-gray-500\">\r\n <div class=\"div-loader\"></div>\r\n </span>\r\n\r\n <span *ngIf=\"type == 'password' && value\" class=\"self-center px-2 cursor-pointer\">\r\n <svg *ngIf=\"element.type == 'password'\" class=\"fill-current\" xmlns=\"http://www.w3.org/2000/svg\"\r\n viewBox=\"0 0 20 20\" (click)='showPassword()'>\r\n <path\r\n d=\"M.2 10a11 11 0 0 1 19.6 0A11 11 0 0 1 .2 10zm9.8 4a4 4 0 1 0 0-8 4 4 0 0 0 0 8zm0-2a2 2 0 1 1 0-4 2 2 0 0 1 0 4z\" />\r\n </svg>\r\n\r\n <svg *ngIf=\"element.type == 'text'\" class=\"fill-current\" xmlns=\"http://www.w3.org/2000/svg\"\r\n viewBox=\"0 0 20 20\" (click)='hidePassword()'>\r\n <path\r\n d=\"M12.81 4.36l-1.77 1.78a4 4 0 0 0-4.9 4.9l-2.76 2.75C2.06 12.79.96 11.49.2 10a11 11 0 0 1 12.6-5.64zm3.8 1.85c1.33 1 2.43 2.3 3.2 3.79a11 11 0 0 1-12.62 5.64l1.77-1.78a4 4 0 0 0 4.9-4.9l2.76-2.75zm-.25-3.99l1.42 1.42L3.64 17.78l-1.42-1.42L16.36 2.22z\" />\r\n </svg>\r\n </span>\r\n\r\n <span *ngIf=\"innerRightIcon && type != 'password'\"\r\n class=\"self-center px-2 {{ innerRightIconColor }} {{ onClickRightIcon ? 'cursor-pointer' : '' }}\"\r\n (click)=\"onClickRightIcon.emit()\">\r\n <ngt-svg class=\"text-xxs fill-current\" [src]='innerRightIcon'></ngt-svg>\r\n </span>\r\n </div>\r\n</div>\r\n\r\n<ng-container *ngIf=\"showCharactersLength && maxTotalCharsCount && !shining\">\r\n <p class=\"text-xxs mt-1\">\r\n {{ ngtTranslateService.ngtTextAreaRemainingCharacters }}:\r\n <span class=\"font-semibold\">{{ getRemainingCharacters() }}</span>\r\n </p>\r\n</ng-container>\r\n\r\n<ng-container *ngIf='shining'>\r\n <div class=\"flex\">\r\n <ngt-shining class=\"{{ ngtStyle.compile(['h']) }} w-full\"></ngt-shining>\r\n </div>\r\n</ng-container>\r\n\r\n<input *ngIf='componentReady' type=\"hidden\" [ngModel]=\"value\" [name]=\"name\" [value]=\"value\">\r\n\r\n<ng-content></ng-content>\r\n\r\n<ngt-validation [control]=\"formControl\" [container]=\"formContainer\" [minValue]='minValue' [minLength]='minLength'>\r\n</ngt-validation>\r\n", styles: [".div-loader{width:20px;height:20px;border:3px solid #a0aec038;border-top-color:#a0aec0;border-radius:50%;animation:spin 1s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}\n"] }]
714
+ }], ctorParameters: function () { return [{ type: i0.Injector }, { type: i0.Renderer2 }, { type: i0.ChangeDetectorRef }, { type: i1.NgtStylizableDirective, decorators: [{
715
+ type: Self
716
+ }, {
717
+ type: Optional
718
+ }] }, { type: i2.ControlContainer, decorators: [{
719
+ type: Optional
720
+ }, {
721
+ type: Host
722
+ }] }, { type: i3.NgtFormComponent, decorators: [{
723
+ type: Optional
724
+ }, {
725
+ type: SkipSelf
726
+ }] }, { type: i4.NgtHttpValidationService, decorators: [{
727
+ type: Optional
728
+ }, {
729
+ type: SkipSelf
730
+ }] }, { type: i5.NgtHttpResourceService, decorators: [{
731
+ type: Optional
732
+ }, {
733
+ type: SkipSelf
734
+ }] }, { type: i3.NgtFormComponent, decorators: [{
735
+ type: Optional
736
+ }, {
737
+ type: SkipSelf
738
+ }] }, { type: i6.NgtSectionComponent, decorators: [{
739
+ type: Optional
740
+ }, {
741
+ type: SkipSelf
742
+ }] }, { type: i7.NgtModalComponent, decorators: [{
743
+ type: Optional
744
+ }, {
745
+ type: SkipSelf
746
+ }] }, { type: i8.NgtTranslateService, decorators: [{
747
+ type: Optional
748
+ }] }]; }, propDecorators: { element: [{
749
+ type: ViewChild,
750
+ args: ["element", { static: true }]
751
+ }], label: [{
752
+ type: Input
753
+ }], placeholder: [{
754
+ type: Input
755
+ }], shining: [{
756
+ type: Input
757
+ }], loading: [{
758
+ type: Input
759
+ }], helpTitle: [{
760
+ type: Input
761
+ }], helpTextColor: [{
762
+ type: Input
763
+ }], helpText: [{
764
+ type: Input
765
+ }], innerLeftIcon: [{
766
+ type: Input
767
+ }], innerLeftIconColor: [{
768
+ type: Input
769
+ }], innerRightIcon: [{
770
+ type: Input
771
+ }], innerRightIconColor: [{
772
+ type: Input
773
+ }], decimalMaskPrecision: [{
774
+ type: Input
775
+ }], showCharactersLength: [{
776
+ type: Input
777
+ }], uppercase: [{
778
+ type: Input
779
+ }], customInnerContentTemplate: [{
780
+ type: Input
781
+ }], helperReverseYPosition: [{
782
+ type: Input
783
+ }], helperAutoXReverse: [{
784
+ type: Input
785
+ }], isDisabled: [{
786
+ type: Input
787
+ }], isReadonly: [{
788
+ type: Input
789
+ }], showRoundedIcon: [{
790
+ type: Input
791
+ }], type: [{
792
+ type: Input
793
+ }], name: [{
794
+ type: Input
795
+ }], mask: [{
796
+ type: Input
797
+ }], focus: [{
798
+ type: Input
799
+ }], allowClear: [{
800
+ type: Input
801
+ }], jit: [{
802
+ type: Input
803
+ }], useInputEvent: [{
804
+ type: Input
805
+ }], findExistingResource: [{
806
+ type: Input
807
+ }], allowPhoneValidation: [{
808
+ type: Input
809
+ }], validatePassword: [{
810
+ type: Input
811
+ }], passwordableId: [{
812
+ type: Input
813
+ }], passwordPolicyId: [{
814
+ type: Input
815
+ }], isRequired: [{
816
+ type: Input
817
+ }], uniqueResource: [{
818
+ type: Input
819
+ }], minValue: [{
820
+ type: Input
821
+ }], maxValue: [{
822
+ type: Input
823
+ }], maxLength: [{
824
+ type: Input
825
+ }], minLength: [{
826
+ type: Input
827
+ }], match: [{
828
+ type: Input
829
+ }], multipleOf: [{
830
+ type: Input
831
+ }], validateMinValueOnMask: [{
832
+ type: Input
833
+ }], externalServerDependency: [{
834
+ type: Input
835
+ }], customValidator: [{
836
+ type: Input
837
+ }], onClickLeftIcon: [{
838
+ type: Output
839
+ }], onClickRightIcon: [{
840
+ type: Output
841
+ }], validatePhoneResult: [{
842
+ type: Output
843
+ }] } });
844
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd0LWlucHV0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLXRhaWx3aW5kL3NyYy9jb21wb25lbnRzL25ndC1pbnB1dC9uZ3QtaW5wdXQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctdGFpbHdpbmQvc3JjL2NvbXBvbmVudHMvbmd0LWlucHV0L25ndC1pbnB1dC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUgsU0FBUyxFQUVULFlBQVksRUFDWixJQUFJLEVBRUosS0FBSyxFQUdMLFFBQVEsRUFDUixNQUFNLEVBRU4sSUFBSSxFQUVKLFFBQVEsRUFFUixTQUFTLEdBQ1osTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFxQyxnQkFBZ0IsRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFHekcsT0FBTyxFQUFFLGNBQWMsRUFBRSxlQUFlLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUUvRSxPQUFPLEVBQUUsY0FBYyxFQUFFLGFBQWEsRUFBRSxlQUFlLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQVE1RyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxzREFBc0QsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7O0FBZ0I1RixNQUFNLE9BQU8saUJBQWtCLFNBQVEsY0FBYztJQXlFakQsWUFDWSxRQUFrQixFQUNsQixRQUFtQixFQUNuQixjQUFpQyxFQUdqQyxzQkFBOEMsRUFHL0MsYUFBK0IsRUFHOUIsZ0JBQWtDLEVBR2xDLG9CQUE4QyxFQUc5QyxrQkFBMEMsRUFHMUMsT0FBeUIsRUFHekIsVUFBK0IsRUFHL0IsUUFBMkIsRUFHNUIsbUJBQXdDO1FBRS9DLEtBQUssRUFBRSxDQUFDO1FBL0JBLGFBQVEsR0FBUixRQUFRLENBQVU7UUFDbEIsYUFBUSxHQUFSLFFBQVEsQ0FBVztRQUNuQixt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O3NCQUFyQyxLQUFLO2dCQUNVLGtCQUFrQjtzQkFBakMsS0FBSztnQkFHVSxVQUFVO3NCQUF6QixLQUFLO2dCQUNVLFVBQVU7c0JBQXpCLEtBQUs7Z0JBQ1UsZUFBZTtzQkFBOUIsS0FBSztnQkFDVSxJQUFJO3NCQUFuQixLQUFLO2dCQUNVLElBQUk7c0JBQW5CLEtBQUs7Z0JBQ1UsSUFBSTtzQkFBbkIsS0FBSztnQkFDVSxLQUFLO3NCQUFwQixLQUFLO2dCQUNVLFVBQVU7c0JBQXpCLEtBQUs7Z0JBQ1UsR0FBRztzQkFBbEIsS0FBSztnQkFDVSxhQUFhO3NCQUE1QixLQUFLO2dCQUdVLG9CQUFvQjtzQkFBbkMsS0FBSztnQkFDVSxvQkFBb0I7c0JBQW5DLEtBQUs7Z0JBQ1UsZ0JBQWdCO3NCQUEvQixLQUFLO2dCQUNVLGNBQWM7c0JBQTdCLEtBQUs7Z0JBQ1UsZ0JBQWdCO3NCQUEvQixLQUFLO2dCQUNVLFVBQVU7c0JBQXpCLEtBQUs7Z0JBQ1UsY0FBYztzQkFBN0IsS0FBSztnQkFDVSxRQUFRO3NCQUF2QixLQUFLO2dCQUNVLFFBQVE7c0JBQXZCLEtBQUs7Z0JBQ1UsU0FBUztzQkFBeEIsS0FBSztnQkFDVSxTQUFTO3NCQUF4QixLQUFLO2dCQUNVLEtBQUs7c0JBQXBCLEtBQUs7Z0JBQ1UsVUFBVTtzQkFBekIsS0FBSztnQkFDVSxzQkFBc0I7c0JBQXJDLEtBQUs7Z0JBQ1Usd0JBQXdCO3NCQUF2QyxLQUFLO2dCQUNVLGVBQWU7c0JBQTlCLEtBQUs7Z0JBRVcsZUFBZTtzQkFBL0IsTUFBTTtnQkFDVSxnQkFBZ0I7c0JBQWhDLE1BQU07Z0JBQ1UsbUJBQW1CO3NCQUFuQyxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICAgIENoYW5nZURldGVjdG9yUmVmLFxyXG4gICAgQ29tcG9uZW50LFxyXG4gICAgRWxlbWVudFJlZixcclxuICAgIEV2ZW50RW1pdHRlcixcclxuICAgIEhvc3QsXHJcbiAgICBJbmplY3RvcixcclxuICAgIElucHV0LFxyXG4gICAgT25EZXN0cm95LFxyXG4gICAgT25Jbml0LFxyXG4gICAgT3B0aW9uYWwsXHJcbiAgICBPdXRwdXQsXHJcbiAgICBSZW5kZXJlcjIsXHJcbiAgICBTZWxmLFxyXG4gICAgU2ltcGxlQ2hhbmdlcyxcclxuICAgIFNraXBTZWxmLFxyXG4gICAgVGVtcGxhdGVSZWYsXHJcbiAgICBWaWV3Q2hpbGQsXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEFic3RyYWN0Q29udHJvbCwgQXN5bmNWYWxpZGF0b3JGbiwgQ29udHJvbENvbnRhaW5lciwgTmdGb3JtLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcclxuXHJcbmltcG9ydCB7IE5ndEJhc2VOZ01vZGVsLCBOZ3RNYWtlUHJvdmlkZXIgfSBmcm9tICcuLi8uLi9iYXNlL25ndC1iYXNlLW5nLW1vZGVsJztcclxuaW1wb3J0IHsgTmd0U3R5bGl6YWJsZURpcmVjdGl2ZSB9IGZyb20gJy4uLy4uL2RpcmVjdGl2ZXMvbmd0LXN0eWxpemFibGUvbmd0LXN0eWxpemFibGUuZGlyZWN0aXZlJztcclxuaW1wb3J0IHsgYXBwbHlJbnB1dE1hc2ssIElucHV0TWFza0VudW0sIHJlbW92ZUlucHV0TWFzayB9IGZyb20gJy4uLy4uL2hlbHBlcnMvaW5wdXQtbWFzay9pbnB1dC1tYXNrLmhlbHBlcic7XHJcbmltcG9ydCB7XHJcbiAgICBOZ3RIdHRwRmluZEV4aXN0aW5nUmVzb3VyY2VJbnRlcmZhY2UsXHJcbiAgICBOZ3RIdHRwRmluZEV4aXN0aW5nUmVzb3VyY2VSZXNwb25zZSxcclxuICAgIE5ndEh0dHBSZXNvdXJjZVNlcnZpY2UsXHJcbn0gZnJvbSAnLi4vLi4vc2VydmljZXMvaHR0cC9uZ3QtaHR0cC1yZXNvdXJjZS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgTmd0SHR0cFZhbGlkYXRpb25SZXNwb25zZSwgTmd0SHR0cFZhbGlkYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvaHR0cC9uZ3QtaHR0cC12YWxpZGF0aW9uLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBOZ3RUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvaHR0cC9uZ3QtdHJhbnNsYXRlLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBOZ3RTdHlsaXphYmxlU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL25ndC1zdHlsaXphYmxlL25ndC1zdHlsaXphYmxlLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBOZ3RGb3JtQ29tcG9uZW50IH0gZnJvbSAnLi4vbmd0LWZvcm0vbmd0LWZvcm0uY29tcG9uZW50JztcclxuaW1wb3J0IHsgTmd0U2VjdGlvbkNvbXBvbmVudCB9IGZyb20gJy4uL25ndC1zZWN0aW9uL25ndC1zZWN0aW9uLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IE5ndE1vZGFsQ29tcG9uZW50IH0gZnJvbSAnLi4vbmd0LW1vZGFsL25ndC1tb2RhbC5jb21wb25lbnQnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgICBzZWxlY3RvcjogJ25ndC1pbnB1dCcsXHJcbiAgICB0ZW1wbGF0ZVVybDogJy4vbmd0LWlucHV0LmNvbXBvbmVudC5odG1sJyxcclxuICAgIHN0eWxlVXJsczogWycuL25ndC1pbnB1dC5jb21wb25lbnQuY3NzJ10sXHJcbiAgICBwcm92aWRlcnM6IFtcclxuICAgICAgICBOZ3RNYWtlUHJvdmlkZXIoTmd0SW5wdXRDb21wb25lbnQpLFxyXG4gICAgXSxcclxuICAgIHZpZXdQcm92aWRlcnM6IFtcclxuICAgICAgICB7IHByb3ZpZGU6IENvbnRyb2xDb250YWluZXIsIHVzZUV4aXN0aW5nOiBOZ0Zvcm0gfVxyXG4gICAgXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgTmd0SW5wdXRDb21wb25lbnQgZXh0ZW5kcyBOZ3RCYXNlTmdNb2RlbCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcclxuICAgIEBWaWV3Q2hpbGQoXCJlbGVtZW50XCIsIHsgc3RhdGljOiB0cnVlIH0pIHB1YmxpYyBlbGVtZW50OiBFbGVtZW50UmVmO1xyXG5cclxuICAgIC8vIFZpc3VhbFxyXG4gICAgQElucHV0KCkgcHVibGljIGxhYmVsOiBzdHJpbmc7XHJcbiAgICBASW5wdXQoKSBwdWJsaWMgcGxhY2Vob2xkZXI6IHN0cmluZyA9ICcnO1xyXG4gICAgQElucHV0KCkgcHVibGljIHNoaW5pbmc6IGJvb2xlYW47XHJcbiAgICBASW5wdXQoKSBwdWJsaWMgbG9hZGluZzogYm9vbGVhbjtcclxuICAgIEBJbnB1dCgpIHB1YmxpYyBoZWxwVGl0bGU6IHN0cmluZztcclxuICAgIEBJbnB1dCgpIHB1YmxpYyBoZWxwVGV4dENvbG9yOiBzdHJpbmcgPSAndGV4dC1ncmVlbi01MDAnO1xyXG4gICAgQElucHV0KCkgcHVibGljIGhlbHBUZXh0OiBzdHJpbmc7XHJcbiAgICBASW5wdXQoKSBwdWJsaWMgaW5uZXJMZWZ0SWNvbjogc3RyaW5nO1xyXG4gICAgQElucHV0KCkgcHVibGljIGlubmVyTGVmdEljb25Db2xvcjogc3RyaW5nO1xyXG4gICAgQElucHV0KCkgcHVibGljIGlubmVyUmlnaHRJY29uOiBzdHJpbmc7XHJcbiAgICBASW5wdXQoKSBwdWJsaWMgaW5uZXJSaWdodEljb25Db2xvcjogc3RyaW5nO1xyXG4gICAgQElucHV0KCkgcHVibGljIGRlY2ltYWxNYXNrUHJlY2lzaW9uOiBudW1iZXIgPSAyO1xyXG4gICAgQElucHV0KCkgcHVibGljIHNob3dDaGFyYWN0ZXJzTGVuZ3RoOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBASW5wdXQoKSBwdWJsaWMgdXBwZXJjYXNlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBASW5wdXQoKSBwdWJsaWMgY3VzdG9tSW5uZXJDb250ZW50VGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XHJcbiAgICBASW5wdXQoKSBwdWJsaWMgaGVscGVyUmV2ZXJzZVlQb3NpdGlvbjogYm9vbGVhbjtcclxuICAgIEBJbnB1dCgpIHB1YmxpYyBoZWxwZXJBdXRvWFJldmVyc2U6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICAgIC8vQmVoYXZpb3JcclxuICAgIEBJbnB1dCgpIHB1YmxpYyBpc0Rpc2FibGVkOiBib29sZWFuO1xyXG4gICAgQElucHV0KCkgcHVibGljIGlzUmVhZG9ubHk6IGJvb2xlYW47XHJcbiAgICBASW5wdXQoKSBwdWJsaWMgc2hvd1JvdW5kZWRJY29uOiBib29sZWFuO1xyXG4gICAgQElucHV0KCkgcHVibGljIHR5cGU6IHN0cmluZyA9ICd0ZXh0JztcclxuICAgIEBJbnB1dCgpIHB1YmxpYyBuYW1lOiBzdHJpbmc7XHJcbiAgICBASW5wdXQoKSBwdWJsaWMgbWFzazogc3RyaW5nO1xyXG4gICAgQElucHV0KCkgcHVibGljIGZvY3VzOiBib29sZWFuO1xyXG4gICAgQElucHV0KCkgcHVibGljIGFsbG93Q2xlYXI6IGJvb2xlYW47XHJcbiAgICBASW5wdXQoKSBwdWJsaWMgaml0OiBib29sZWFuO1xyXG4gICAgQElucHV0KCkgcHVibGljIHVzZUlucHV0RXZlbnQ6IGJvb2xlYW47XHJcblxyXG4gICAgLy9WYWxpZGF0aW9uc1xyXG4gICAgQElucHV0KCkgcHVibGljIGZpbmRFeGlzdGluZ1Jlc291cmNlOiBOZ3RIdHRwRmluZEV4aXN0aW5nUmVzb3VyY2VJbnRlcmZhY2U7XHJcbiAgICBASW5wdXQoKSBwdWJsaWMgYWxsb3dQaG9uZVZhbGlkYXRpb246IGJvb2xlYW47XHJcbiAgICBASW5wdXQoKSBwdWJsaWMgdmFsaWRhdGVQYXNzd29yZDogYm9vbGVhbjtcclxuICAgIEBJbnB1dCgpIHB1YmxpYyBwYXNzd29yZGFibGVJZDogc3RyaW5nO1xyXG4gICAgQElucHV0KCkgcHVibGljIHBhc3N3b3JkUG9saWN5SWQ6IHN0cmluZztcclxuICAgIEBJbnB1dCgpIHB1YmxpYyBpc1JlcXVpcmVkOiBib29sZWFuO1xyXG4gICAgQElucHV0KCkgcHVibGljIHVuaXF1ZVJlc291cmNlOiBhbnk7XHJcbiAgICBASW5wdXQoKSBwdWJsaWMgbWluVmFsdWU6IG51bWJlcjtcclxuICAgIEBJbnB1dCgpIHB1YmxpYyBtYXhWYWx1ZTogbnVtYmVyO1xyXG4gICAgQElucHV0KCkgcHVibGljIG1heExlbmd0aDogbnVtYmVyO1xyXG4gICAgQElucHV0KCkgcHVibGljIG1pbkxlbmd0aDogbnVtYmVyO1xyXG4gICAgQElucHV0KCkgcHVibGljIG1hdGNoOiBzdHJpbmc7XHJcbiAgICBASW5wdXQoKSBwdWJsaWMgbXVsdGlwbGVPZjogbnVtYmVyO1xyXG4gICAgQElucHV0KCkgcHVibGljIHZhbGlkYXRlTWluVmFsdWVPbk1hc2s6IGJvb2xlYW47XHJcbiAgICBASW5wdXQoKSBwdWJsaWMgZXh0ZXJuYWxTZXJ2ZXJEZXBlbmRlbmN5OiBib29sZWFuO1xyXG4gICAgQElucHV0KCkgcHVibGljIGN1c3RvbVZhbGlkYXRvcjogKCkgPT4gQXN5bmNWYWxpZGF0b3JGbjtcclxuXHJcbiAgICBAT3V0cHV0KCkgcHVibGljIG9uQ2xpY2tMZWZ0SWNvbjogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICAgIEBPdXRwdXQoKSBwdWJsaWMgb25DbGlja1JpZ2h0SWNvbjogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICAgIEBPdXRwdXQoKSBwdWJsaWMgdmFsaWRhdGVQaG9uZVJlc3VsdDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuXHJcbiAgICBwdWJsaWMgbWF4VG90YWxDaGFyc0NvdW50OiBudW1iZXI7XHJcbiAgICBwdWJsaWMgZXhpc3RpbmdSZXNvdXJjZUlkOiBzdHJpbmc7XHJcbiAgICBwdWJsaWMgY29tcG9uZW50UmVhZHk6IGJvb2xlYW47XHJcbiAgICBwdWJsaWMgaW5wdXRQcm9wZXJ0aWVzOiB7XHJcbiAgICAgICAgaHRtbFR5cGU/OiBzdHJpbmc7XHJcbiAgICAgICAgbGVuZ3RoPzogbnVtYmVyO1xyXG4gICAgfSA9IHt9O1xyXG5cclxuICAgIHB1YmxpYyBuZ3RTdHlsZTogTmd0U3R5bGl6YWJsZVNlcnZpY2U7XHJcblxyXG4gICAgcHJpdmF0ZSBlbWFpbFZhbGlkYXRvclRpbWVvdXQ6IGFueTtcclxuICAgIHByaXZhdGUgcGFzc3dvcmRWYWxpZGF0b3JUaW1lb3V0OiBhbnk7XHJcbiAgICBwcml2YXRlIHBob25lVmFsaWRhdG9yVGltZW91dDogYW55O1xyXG4gICAgcHJpdmF0ZSB1bmlxdWVWYWxpZGF0b3JUaW1lb3V0OiBhbnk7XHJcbiAgICBwcml2YXRlIHNlYXJjaEV4aXN0aW5nUmVzb3VyY2VUaW1lb3V0OiBhbnk7XHJcbiAgICBwcml2YXRlIHN1YnNjcmlwdGlvbnM6IEFycmF5PFN1YnNjcmlwdGlvbj4gPSBbXTtcclxuXHJcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoXHJcbiAgICAgICAgcHJpdmF0ZSBpbmplY3RvcjogSW5qZWN0b3IsXHJcbiAgICAgICAgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyLFxyXG4gICAgICAgIHByaXZhdGUgY2hhbmdlRGV0ZWN0b3I6IENoYW5nZURldGVjdG9yUmVmLFxyXG5cclxuICAgICAgICBAU2VsZigpIEBPcHRpb25hbCgpXHJcbiAgICAgICAgcHJpdmF0ZSBuZ3RTdHlsaXphYmxlRGlyZWN0aXZlOiBOZ3RTdHlsaXphYmxlRGlyZWN0aXZlLFxyXG5cclxuICAgICAgICBAT3B0aW9uYWwoKSBASG9zdCgpXHJcbiAgICAgICAgcHVibGljIGZvcm1Db250YWluZXI6IENvbnRyb2xDb250YWluZXIsXHJcblxyXG4gICAgICAgIEBPcHRpb25hbCgpIEBTa2lwU2VsZigpXHJcbiAgICAgICAgcHJpdmF0ZSBuZ3RGb3JtQ29tcG9uZW50OiBOZ3RGb3JtQ29tcG9uZW50LFxyXG5cclxuICAgICAgICBAT3B0aW9uYWwoKSBAU2tpcFNlbGYoKVxyXG4gICAgICAgIHByaXZhdGUgbmd0VmFsaWRhdGlvblNlcnZpY2U6IE5ndEh0dHBWYWxpZGF0aW9uU2VydmljZSxcclxuXHJcbiAgICAgICAgQE9wdGlvbmFsKCkgQFNraXBTZWxmKClcclxuICAgICAgICBwcml2YXRlIG5ndFJlc291cmNlU2VydmljZTogTmd0SHR0cFJlc291cmNlU2VydmljZSxcclxuXHJcbiAgICAgICAgQE9wdGlvbmFsKCkgQFNraXBTZWxmKClcclxuICAgICAgICBwcml2YXRlIG5ndEZvcm06IE5ndEZvcm1Db21wb25lbnQsXHJcblxyXG4gICAgICAgIEBPcHRpb25hbCgpIEBTa2lwU2VsZigpXHJcbiAgICAgICAgcHJpdmF0ZSBuZ3RTZWN0aW9uOiBOZ3RTZWN0aW9uQ29tcG9uZW50LFxyXG5cclxuICAgICAgICBAT3B0aW9uYWwoKSBAU2tpcFNlbGYoKVxyXG4gICAgICAgIHByaXZhdGUgbmd0TW9kYWw6IE5ndE1vZGFsQ29tcG9uZW50LFxyXG5cclxuICAgICAgICBAT3B0aW9uYWwoKVxyXG4gICAgICAgIHB1YmxpYyBuZ3RUcmFuc2xhdGVTZXJ2aWNlOiBOZ3RUcmFuc2xhdGVTZXJ2aWNlXHJcbiAgICApIHtcclxuICAgICAgICBzdXBlcigpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5uZ3RGb3JtQ29tcG9uZW50KSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2hpbmluZyA9IHRoaXMubmd0Rm9ybUNvbXBvbmVudC5pc1NoaW5pbmcoKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxyXG4gICAgICAgICAgICAgICAgdGhpcy5uZ3RGb3JtQ29tcG9uZW50Lm9uU2hpbmluZ0NoYW5nZS5zdWJzY3JpYmUoKHNoaW5pbmc6IGJvb2xlYW4pID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNoaW5pbmcgPSBzaGluaW5nO1xyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLm5ndFN0eWxpemFibGVEaXJlY3RpdmUpIHtcclxuICAgICAgICAgICAgdGhpcy5uZ3RTdHlsZSA9IHRoaXMubmd0U3R5bGl6YWJsZURpcmVjdGl2ZS5nZXROZ3RTdHlsaXphYmxlU2VydmljZSgpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMubmd0U3R5bGUgPSBuZXcgTmd0U3R5bGl6YWJsZVNlcnZpY2UoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMubmd0U3R5bGUubG9hZCh0aGlzLmluamVjdG9yLCAnTmd0SW5wdXQnLCB7XHJcbiAgICAgICAgICAgIGg6ICdoLTEyJyxcclxuICAgICAgICAgICAgcm91bmRlZDogJ3JvdW5kZWQnLFxyXG4gICAgICAgICAgICB0ZXh0OiAndGV4dC1zbScsXHJcbiAgICAgICAgICAgIGZvbnQ6ICdmb250LW5vcm1hbCcsXHJcbiAgICAgICAgICAgIGNvbG9yOiB7XHJcbiAgICAgICAgICAgICAgICBib3JkZXI6ICdib3JkZXItZ3JheS00MDAgZm9jdXM6Ym9yZGVyLWdyYXktNzAwJyxcclxuICAgICAgICAgICAgICAgIGJnOiAnYmctYmctd2hpdGUgZm9jdXM6Ymctd2hpdGUnLFxyXG4gICAgICAgICAgICAgICAgdGV4dDogJ3RleHQtZ3JheS04MDAnXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgbmdPbkluaXQoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmZvcm1Db250YWluZXIpIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIlRoZSBlbGVtZW50IG11c3QgYmUgaW5zaWRlIGEgPGZvcm0gI2Zvcm09J25nRm9ybSc+IHRhZyFcIiwgdGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLm5hbWUpIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIlRoZSBlbGVtZW50IG11c3QgY29udGFpbiBhIG5hbWUgYXR0cmlidXRlIVwiLCB0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvbXBvbmVudFJlYWR5ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IuZGV0ZWN0Q2hhbmdlcygpO1xyXG5cclxuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5pdENvbXBvbmVudCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IuZGV0ZWN0Q2hhbmdlcygpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuZ2V0RWxlbWVudFRpdGxlKCkgfHwgdGhpcy5nZXRFbGVtZW50VGl0bGUoKSA9PT0gJ251bGwnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50LnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC50aXRsZSA9ICcnO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSwgNTAwKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcclxuICAgICAgICB0aGlzLnNldHVwTWFza3MoY2hhbmdlcy5tYXNrID8gY2hhbmdlcy5tYXNrLnByZXZpb3VzVmFsdWUgOiBudWxsKTtcclxuXHJcbiAgICAgICAgaWYgKGNoYW5nZXMubWF0Y2ggfHwgY2hhbmdlcy5pc1JlcXVpcmVkIHx8IGNoYW5nZXMudHlwZSB8fCBjaGFuZ2VzLm1hc2sgfHwgY2hhbmdlcy5taW5WYWx1ZSkge1xyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVZhbGlkYXRpb25zKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBuZ09uRGVzdHJveSgpIHtcclxuICAgICAgICB0aGlzLmRlc3Ryb3lTdWJzY3JpcHRpb25zKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9uTmF0aXZlQ2hhbmdlKCkge1xyXG4gICAgICAgIGlmICh0aGlzLmhhc0NoYW5nZXNCZXR3ZWVuTW9kZWxzKCkpIHtcclxuICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHRoaXMucmVtb3ZlTWFza3ModGhpcy5nZXROYXRpdmVWYWx1ZSgpKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGNoYW5nZSh2YWx1ZTogYW55KSB7XHJcbiAgICAgICAgaWYgKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgdGhpcy5tYXNrID09ICdkZWNpbWFsJykge1xyXG4gICAgICAgICAgICB2YWx1ZSA9IHBhcnNlRmxvYXQodmFsdWUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLmdldE5hdGl2ZVZhbHVlKCkgfHwgKHRoaXMudmFsaWRhdGVNaW5WYWx1ZU9uTWFzaykpIHtcclxuICAgICAgICAgICAgdGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQudmFsdWUgPSB2YWx1ZSA/PyAnJztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghdmFsdWUgJiYgdmFsdWUgIT09IDApIHtcclxuICAgICAgICAgICAgdGhpcy5jbGVhcklucHV0KCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgbmF0aXZlVmFsdWUgPSB0aGlzLmdldE5hdGl2ZVZhbHVlKCk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLm1hc2spIHtcclxuICAgICAgICAgICAgbGV0IG5nTW9kZWxWYWx1ZSA9IHRoaXMucmVtb3ZlTWFza3MobmF0aXZlVmFsdWUpO1xyXG5cclxuICAgICAgICAgICAgaWYgKG5hdGl2ZVZhbHVlICYmIG5nTW9kZWxWYWx1ZSAhPSB0aGlzLnZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnZhbHVlID0gbmdNb2RlbFZhbHVlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgICAodGhpcy5tYXNrID09IElucHV0TWFza0VudW0uQ0VMTFBIT05FIHx8IHRoaXMubWFzayA9PSBJbnB1dE1hc2tFbnVtLklOVEVSTkFUSU9OQUxfUEhPTkUpXHJcbiAgICAgICAgICAgICAgICAmJiB0aGlzLmFsbG93UGhvbmVWYWxpZGF0aW9uICYmIHRoaXMudmFsdWVcclxuICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnZhbGlkYXRlUGhvbmUoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGxldCBuZ01vZGVsVmFsdWUgPSB0aGlzLnJlbW92ZU1hc2tzKHZhbHVlKTtcclxuXHJcbiAgICAgICAgICAgIGlmICh2YWx1ZSAmJiBuZ01vZGVsVmFsdWUgIT0gdmFsdWUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMudmFsdWUgPSBuZ01vZGVsVmFsdWU7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLnZhbHVlICE9IG5hdGl2ZVZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudC52YWx1ZSA9IG5nTW9kZWxWYWx1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuY29tcG9uZW50UmVhZHkpIHtcclxuICAgICAgICAgICAgdGhpcy5vblZhbHVlQ2hhbmdlRXZlbnQuZW1pdCh0aGlzLnZhbHVlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLm5ndFJlc291cmNlU2VydmljZSAmJiB0aGlzLmZpbmRFeGlzdGluZ1Jlc291cmNlICYmIHRoaXMudmFsdWUpIHtcclxuICAgICAgICAgICAgdGhpcy5zZWFyY2hFeGlzdGluZ1Jlc291cmNlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXRGb2N1cygpIHtcclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcclxuICAgICAgICB9LCAyMDApO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBjbGVhcklucHV0KGV2ZW50PzogRXZlbnQpIHtcclxuICAgICAgICBpZiAoZXZlbnQpIHtcclxuICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudC52YWx1ZSA9ICcnO1xyXG4gICAgICAgIHRoaXMudmFsdWUgPSAnJztcclxuXHJcbiAgICAgICAgdGhpcy5tYXJrQXNQcmlzdGluZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyByZXN0b3JlUGxhY2Vob2xkZXIoKTogdm9pZCB7XHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudC5wbGFjZWhvbGRlciA9IHRoaXMucGxhY2Vob2xkZXIpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzaG93UGFzc3dvcmQoKSB7XHJcbiAgICAgICAgdGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQudHlwZSA9ICd0ZXh0JztcclxuICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yLmRldGVjdENoYW5nZXMoKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgaGlkZVBhc3N3b3JkKCkge1xyXG4gICAgICAgIHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50LnR5cGUgPSAncGFzc3dvcmQnO1xyXG4gICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRJbnB1dFBhZGRpbmdzKCkge1xyXG4gICAgICAgIGxldCBwYWRkaW5nQ2xhc3M6IHN0cmluZyA9ICcnO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5pbm5lckxlZnRJY29uIHx8IHRoaXMuY3VzdG9tSW5uZXJDb250ZW50VGVtcGxhdGUpIHtcclxuICAgICAgICAgICAgcGFkZGluZ0NsYXNzICs9ICdwbC0xMCBwci00ICc7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcGFkZGluZ0NsYXNzICs9ICdweC00ICc7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5pbm5lclJpZ2h0SWNvbiB8fCB0aGlzLmFsbG93Q2xlYXIgfHwgdGhpcy50eXBlID09ICdwYXNzd29yZCcpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuYWxsb3dDbGVhciAmJiB0aGlzLnZhbHVlICYmICh0aGlzLmlubmVyUmlnaHRJY29uIHx8IHRoaXMudHlwZSA9PSAncGFzc3dvcmQnKSkge1xyXG4gICAgICAgICAgICAgICAgcGFkZGluZ0NsYXNzICs9ICdwci0xMCAnO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcGFkZGluZ0NsYXNzICs9ICdwci04ICc7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBwYWRkaW5nQ2xhc3M7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldFJlbWFpbmluZ0NoYXJhY3RlcnMoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuZWxlbWVudD8ubmF0aXZlRWxlbWVudD8udmFsdWU/Lmxlbmd0aCkge1xyXG4gICAgICAgICAgICBpZiAoKHRoaXMubWF4VG90YWxDaGFyc0NvdW50IC0gdGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQudmFsdWUubGVuZ3RoKSA+IDApIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm1heFRvdGFsQ2hhcnNDb3VudCAtIHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50LnZhbHVlLmxlbmd0aDtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiAwO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5tYXhUb3RhbENoYXJzQ291bnQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGhhc0ZvY3VzKCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiBkb2N1bWVudC5hY3RpdmVFbGVtZW50ID09PSB0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZGlzYWJsZWQoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNEaXNhYmxlZCB8fCB0aGlzLmlzRGlzYWJsZWRCeVBhcmVudCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaW5pdENvbXBvbmVudCgpIHtcclxuICAgICAgICBpZiAodGhpcy5mb3JtQ29udGFpbmVyICYmIHRoaXMuZm9ybUNvbnRhaW5lci5jb250cm9sICYmICh0aGlzLmZvcm1Db250cm9sID0gdGhpcy5mb3JtQ29udGFpbmVyLmNvbnRyb2wuZ2V0KHRoaXMubmFtZSkpKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmZvY3VzKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNldEZvY3VzKCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGxldCB3YXRjaCA9IFwiY2hhbmdlXCI7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5qaXQpIHtcclxuICAgICAgICAgICAgICAgIHdhdGNoICs9IFwiIGtleXVwIGtleWRvd24ga2V5cHJlc3NcIjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgd2F0Y2guc3BsaXQoJyAnKS5mb3JFYWNoKChldnQpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIubGlzdGVuKHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50LCBldnQsICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgbmF0aXZlVmFsdWUgPSB0aGlzLnJlbW92ZU1hc2tzKHRoaXMuZ2V0TmF0aXZlVmFsdWUoKSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnZhbHVlICE9IG5hdGl2ZVZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudmFsdWUgPSBuYXRpdmVWYWx1ZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLmxpc3Rlbih0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudCwgXCJrZXlkb3duXCIsIChldmVudCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50ICYmIHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50LnZhbHVlICYmIHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50LnZhbHVlLmxlbmd0aCA+PSB0aGlzLm1heExlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIEJhY2tzcGFjZSBhbmQgZGVsZXRlXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGV2ZW50LmtleUNvZGUgIT0gOCAmJiBldmVudC5rZXlDb2RlICE9IDQ2KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMubWF4VG90YWxDaGFyc0NvdW50ID0gdGhpcy5tYXhMZW5ndGg7XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlVmFsaWRhdGlvbnMoKTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLm1hdGNoKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLmxpc3Rlbih0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudCwgXCJrZXlwcmVzc1wiLCAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXRjaFZhbGlkYXRvcigpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLnZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmZvcm1Db250cm9sLm1hcmtBc0RpcnR5KCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmZvcm1Db250cm9sLm1hcmtBc1ByaXN0aW5lKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuc2V0dXBQcm9wZXJ0aWVzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSB1cGRhdGVWYWxpZGF0aW9ucygpIHtcclxuICAgICAgICBpZiAoIXRoaXMuZm9ybUNvbnRyb2wpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3Qgc3luY1ZhbGlkYXRvcnMgPSBbXTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMudHlwZSA9PSAnZW1haWwnKSB7XHJcbiAgICAgICAgICAgIHN5bmNWYWxpZGF0b3JzLnB1c2goVmFsaWRhdG9ycy5lbWFpbCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5pc1JlcXVpcmVkKSB7XHJcbiAgICAgICAgICAgIHN5bmNWYWxpZGF0b3JzLnB1c2goVmFsaWRhdG9ycy5yZXF1aXJlZCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5tYXhMZW5ndGgpIHtcclxuICAgICAgICAgICAgc3luY1ZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3JzLm1heExlbmd0aCh0aGlzLm1heExlbmd0aCkpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMubWluTGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHN5bmNWYWxpZGF0b3JzLnB1c2goVmFsaWRhdG9ycy5taW5MZW5ndGgodGhpcy5taW5MZW5ndGgpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLm1hc2sgPT0gJ2NucGotY3BmJyB8fCB0aGlzLm1hc2sgPT0gJ2NucGotY3BmLXJ1dCcgfHwgdGhpcy5tYXNrID09ICdjcGYnKSB7XHJcbiAgICAgICAgICAgIHN5bmNWYWxpZGF0b3JzLnB1c2godGhpcy5jbnBqQ3BmVmFsaWRhdG9yKCkpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMubWFzayA9PSAndGltZScpIHtcclxuICAgICAgICAgICAgc3luY1ZhbGlkYXRvcnMucHVzaCh0aGlzLnRpbWVWYWxpZGF0b3IoKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5tYXRjaCkge1xyXG4gICAgICAgICAgICBzeW5jVmFsaWRhdG9ycy5wdXNoKHRoaXMubWF0Y2hWYWxpZGF0b3IoKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5taW5WYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHN5bmNWYWxpZGF0b3JzLnB1c2godGhpcy5taW5WYWx1ZVZhbGlkYXRvcigpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLm11bHRpcGxlT2YpIHtcclxuICAgICAgICAgICAgc3luY1ZhbGlkYXRvcnMucHVzaCh0aGlzLm11bHRpcGxlT2ZWYWxpZGF0b3IoKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5leHRlcm5hbFNlcnZlckRlcGVuZGVuY3kpIHtcclxuICAgICAgICAgICAgc3luY1ZhbGlkYXRvcnMucHVzaCh0aGlzLmV4dGVybmFsU2VydmVyRGVwZW5kZW5jeVZhbGlkYXRvcigpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmZvcm1Db250cm9sLnNldFZhbGlkYXRvcnMoc3luY1ZhbGlkYXRvcnMpO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgYXN5bmNWYWxpZGF0b3JzID0gW107XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy51bmlxdWVSZXNvdXJjZSkge1xyXG4gICAgICAgICAgICAgICAgYXN5bmNWYWxpZGF0b3JzLnB1c2godGhpcy51bmlxdWVWYWxpZGF0b3IoKSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLnR5cGUgPT0gJ2VtYWlsJyAmJiB0aGlzLmhhc0VtYWlsU2VydmljZVZhbGlkYXRpb24oKSkge1xyXG4gICAgICAgICAgICAgICAgYXN5bmNWYWxpZGF0b3JzLnB1c2godGhpcy5lbWFpbFZhbGlkYXRvcigpKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMudHlwZSA9PSAnbG9naW4nICYmIHRoaXMuaGFzRW1haWxTZXJ2aWNlVmFsaWRhdGlvbigpKSB7XHJcbiAgICAgICAgICAgICAgICBhc3luY1ZhbGlkYXRvcnMucHVzaCh0aGlzLmVtYWlsVmFsaWRhdG9yKHRydWUpKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMudHlwZSA9PSAncGFzc3dvcmQnICYmIHRoaXMudmFsaWRhdGVQYXNzd29yZCAmJiB0aGlzLmhhc1Bhc3N3b3JkVmFsaWRhdGlvbigpKSB7XHJcbiAgICAgICAgICAgICAgICBhc3luY1ZhbGlkYXRvcnMucHVzaCh0aGlzLnBhc3N3b3JkVmFsaWRhdG9yKCkpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5jdXN0b21WYWxpZGF0b3IpIHtcclxuICAgICAgICAgICAgICAgIGFzeW5jVmFsaWRhdG9ycy5wdXNoKHRoaXMuY3VzdG9tVmFsaWRhdG9yKCkpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLmZvcm1Db250cm9sLnNldEFzeW5jVmFsaWRhdG9ycyhhc3luY1ZhbGlkYXRvcnMpO1xyXG4gICAgICAgICAgICB0aGlzLmZvcm1Db250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHNldHVwTWFza3MocHJldmlvdXNNYXNrPzogc3RyaW5nKSB7XHJcbiAgICAgICAgaWYgKHRoaXMubWFzayAhPSBwcmV2aW91c01hc2sgJiYgIXRoaXMubWFzaykge1xyXG4gICAgICAgICAgICByZW1vdmVJbnB1dE1hc2sodGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQpO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2xlYXJJbnB1dCgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IG1hc2tzID0ge1xyXG4gICAgICAgICAgICBbSW5wdXRNYXNrRW51bS5DUEZdOiB7XHJcbiAgICAgICAgICAgICAgICBtYXNrOiBbJzk5OS45OTkuOTk5LTk5J10sXHJcbiAgICAgICAgICAgICAgICBzaG93TWFza09uSG92ZXI6IGZhbHNlXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIFtJbnB1dE1hc2tFbnVtLkNOUEpdOiB7XHJcbiAgICAgICAgICAgICAgICBtYXNrOiBbJzk5Ljk5OS45OTkvOTk5OS05OSddLFxyXG4gICAgICAgICAgICAgICAgc2hvd01hc2tPbkhvdmVyOiBmYWxzZVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBbSW5wdXRNYXNrRW51bS5DVUlUXToge1xyXG4gICAgICAgICAgICAgICAgbWFzazogWyc5OS05OTk5OTk5OS05J10sXHJcbiAgICAgICAgICAgICAgICBjbGVhck1hc2tPbkxvc3RGb2N1czogZmFsc2VcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgW0lucHV0TWFza0VudW0uUlVUXToge1xyXG4gICAgICAgICAgICAgICAgbWFzazogWyc5OTk5OTk5OTk5OTknXSxcclxuICAgICAgICAgICAgICAgIGNsZWFyTWFza09uTG9zdEZvY3VzOiBmYWxzZVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBbSW5wdXRNYXNrRW51bS5DUEZfQ05QSl9SVVRdOiB7XHJcbiAgICAgICAgICAgICAgICBtYXNrOiBbJzk5OS45OTkuOTk5LTk5JywgJzk5OTk5OTk5OTk5OScsICc5OS45OTkuOTk5Lzk5OTktOTknXSxcclxuICAgICAgICAgICAgICAgIGtlZXBTdGF0aWM6IHRydWUsXHJcbiAgICAgICAgICAgICAgICBzaG93TWFza09uSG92ZXI6IGZhbHNlXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIFtJbnB1dE1hc2tFbnVtLkNQRl9DTlBKXToge1xyXG4gICAgICAgICAgICAgICAgbWFzazogWyc5OTkuOTk5Ljk5OS05OScsICc5OS45OTkuOTk5Lzk5OTktOTknXSxcclxuICAgICAgICAgICAgICAgIGtlZXBTdGF0aWM6IHRydWUsXHJcbiAgICAgICAgICAgICAgICBzaG93TWFza09uSG92ZXI6IGZhbHNlXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIFtJbnB1dE1hc2tFbnVtLkRFQ0lNQUxdOiB7XHJcbiAgICAgICAgICAgICAgICBkaWdpdHM6IHRoaXMuZGVjaW1hbE1hc2tQcmVjaXNpb24sXHJcbiAgICAgICAgICAgICAgICBncm91cFNlcGFyYXRvcjogJy4nLFxyXG4gICAgICAgICAgICAgICAgcmFkaXhQb2ludDogJywnLFxyXG4gICAgICAgICAgICAgICAgYXV0b0dyb3VwOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgcmVwZWF0OiAxNixcclxuICAgICAgICAgICAgICAgIHJpZ2h0QWxpZ246IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgbWF4OiB0aGlzLm1heFZhbHVlLFxyXG4gICAgICAgICAgICAgICAgc2hvd01hc2tPbkhvdmVyOiBmYWxzZVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBbSW5wdXRNYXNrRW51bS5DRUxMUEhPTkVdOiB7XHJcbiAgICAgICAgICAgICAgICBtYXNrOiBbJyg5OSkgOTk5LTk5OScsICcoOTkpIDk5OTktOTk5OScsICcoOTkpIDk5OTk5LTk5OTknXSxcclxuICAgICAgICAgICAgICAgIGtlZXBTdGF0aWM6IHRydWUsXHJcbiAgICAgICAgICAgICAgICBzaG93TWFza09uSG92ZXI6IGZhbHNlXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIFtJbnB1dE1hc2tFbnVtLklOVEVSTkFUSU9OQUxfUEhPTkVdOiB7XHJcbiAgICAgICAgICAgICAgICBtYXNrOiBbJys5OTkgOTkgOTk5LTk5OScsICcrOTkgKDk5KSA5OTk5LTk5OTknLCAnKzk5ICg5OSkgOTk5OTktOTk5OScsICcrOTk5ICg5OSkgOTk5OS05OTk5JywgJys5OTkgKDk5KSA5OTk5OS05OTk5J10sXHJcbiAgICAgICAgICAgICAgICBrZWVwU3RhdGljOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgc2hvd01hc2tPbkhvdmVyOiBmYWxzZVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBbSW5wdXRNYXNrRW51bS5QTEFURV06IHtcclxuICAgICAgICAgICAgICAgIG1hc2s6IFsnQUFBLTkmOTknXSxcclxuICAgICAgICAgICAgICAgIGtlZXBTdGF0aWM6IHRydWUsXHJcbiAgICAgICAgICAgICAgICBzaG93TWFza09uSG92ZXI6IGZhbHNlXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIFtJbnB1dE1hc2tFbnVtLkNFUF06IHtcclxuICAgICAgICAgICAgICAgIG1hc2s6IFsnOTk5OTktOTk5J10sXHJcbiAgICAgICAgICAgICAgICBzaG93TWFza09uSG92ZXI6IGZhbHNlXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIFtJbnB1dE1hc2tFbnVtLklOVEVHRVJdOiB7XHJcbiAgICAgICAgICAgICAgICBtYXg6IHRoaXMubWF4VmFsdWUsXHJcbiAgICAgICAgICAgICAgICBtaW46IHRoaXMudmFsaWRhdGVNaW5WYWx1ZU9uTWFzayA/IHRoaXMubWluVmFsdWUgOiB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgICAgICByaWdodEFsaWduOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgIHNob3dNYXNrT25Ib3ZlcjogZmFsc2VcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgW0lucHV0TWFza0VudW0uTlVNRVJJQ19TVFJJTkddOiB7XHJcbiAgICAgICAgICAgICAgICByZWdleDogXCJbMC05XSpcIixcclxuICAgICAgICAgICAgICAgIHNob3dNYXNrT25Ib3ZlcjogZmFsc2VcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgW0lucHV0TWFza0VudW0uVElNRV06ICc5OTo5OScsXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMubWFzayA9PSBJbnB1dE1hc2tFbnVtLkRFQ0lNQUwpIHtcclxuICAgICAgICAgICAgYXBwbHlJbnB1dE1hc2sodGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQsIElucHV0TWFza0VudW0uREVDSU1BTCwgbWFza3NbdGhpcy5tYXNrXSk7XHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLm1hc2sgPT0gSW5wdXRNYXNrRW51bS5JTlRFR0VSKSB7XHJcbiAgICAgICAgICAgIGFwcGx5SW5wdXRNYXNrKHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50LCBJbnB1dE1hc2tFbnVtLklOVEVHRVIsIG1hc2tzW3RoaXMubWFza10pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGFwcGx5SW5wdXRNYXNrKHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50LCBtYXNrc1t0aGlzLm1hc2tdKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzZXR1cFByb3BlcnRpZXMoKSB7XHJcbiAgICAgICAgbGV0IHByb3BzID0ge1xyXG4gICAgICAgICAgICBzaG9ydFRleHQ6IHtcclxuICAgICAgICAgICAgICAgIGh0bWxUeXBlOiBcInRleHRcIixcclxuICAgICAgICAgICAgICAgIGxlbmd0aDogMzBcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgdGV4dDoge1xyXG4gICAgICAgICAgICAgICAgaHRtbFR5cGU6IFwidGV4dFwiLFxyXG4gICAgICAgICAgICAgICAgbGVuZ3RoOiAxMDBcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgbG9uZ1RleHQ6IHtcclxuICAgICAgICAgICAgICAgIGh0bWxUeXBlOiBcInRleHRcIixcclxuICAgICAgICAgICAgICAgIGxlbmd0aDogMTUwXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGV4dHJhTG9uZ1RleHQ6IHtcclxuICAgICAgICAgICAgICAgIGh0bWxUeXBlOiBcInRleHRcIixcclxuICAgICAgICAgICAgICAgIGxlbmd0aDogMzAwXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGN1c3RvbVRleHQ6IHtcclxuICAgICAgICAgICAgICAgIGh0bWxUeXBlOiBcInRleHRcIixcclxuICAgICAgICAgICAgICAgIGxlbmd0aDogdGhpcy5tYXhMZW5ndGhcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgcGFzc3dvcmQ6IHtcclxuICAgICAgICAgICAgICAgIGh0bWxUeXBlOiBcInBhc3N3b3JkXCIsXHJcbiAgICAgICAgICAgICAgICBsZW5ndGg6IDE1MFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBlbWFpbDoge1xyXG4gICAgICAgICAgICAgICAgaHRtbFR5cGU6IFwidGV4dFwiLFxyXG4gICAgICAgICAgICAgICAgbGVuZ3RoOiAxMDAsXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGRlY2ltYWw6IHtcclxuICAgICAgICAgICAgICAgIGh0bWxUeXBlOiBcInRleHRcIixcclxuICAgICAgICAgICAgICAgIGxlbmd0aDogOSxcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnR5cGUgaW4gcHJvcHMpIHtcclxuICAgICAgICAgICAgdGhpcy5pbnB1dFByb3BlcnRpZXMgPSBwcm9wc1t0aGlzLnR5cGVdO1xyXG4gICAgICAgICAgICB0aGlzLm1heExlbmd0aCA9IHRoaXMuaW5wdXRQcm9wZXJ0aWVzLmxlbmd0aDtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zb2xlLndhcm4oXCJUeXBlIFtcIiArIHRoaXMudHlwZSArIFwiXSBpcyBub3QgYSB2YWxpZCB0YWlsLWZvcm0taW5wdXQgdHlwZSFcIiwgdGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIG1pblZhbHVlVmFsaWRhdG9yKCkge1xyXG4gICAgICAgIHJldHVybiAoY29udHJvbDogQWJzdHJhY3RDb250cm9sKSA9PiBwYXJzZUZsb2F0KGNvbnRyb2wudmFsdWUpIDwgdGhpcy5taW5WYWx1ZSA/IHsgJ21pblZhbHVlJzogdHJ1ZSB9IDogbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIG11bHRpcGxlT2ZWYWxpZGF0b3IoKSB7XHJcbiAgICAgICAgcmV0dXJuIChjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpID0+IHtcclxuICAgICAgICAgICAgaWYgKGNvbnRyb2wudmFsdWUpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiAoY29udHJvbC52YWx1ZSAlIHRoaXMubXVsdGlwbGVPZiAhPT0gMCkgPyB7ICdtdWx0aXBsZU9mJzogdHJ1ZSB9IDogbnVsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBleHRlcm5hbFNlcnZlckRlcGVuZGVuY3lWYWxpZGF0b3IoKSB7XHJcbiAgICAgICAgLy8gVE9ETzogVmFsaWRhciB0ZW1wbyBkZSByZXF1aXNpw6fDo29cclxuICAgICAgICByZXR1cm4gKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCkgPT4gIWNvbnRyb2wudmFsdWUgPyB7ICdleHRlcm5hbFNlcnZlckRlcGVuZGVuY3knOiB0cnVlIH0gOiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgdGltZVZhbGlkYXRvcigpIHtcclxuICAgICAgICBjb25zdCByZWdleEV4cCA9IG5ldyBSZWdFeHAoJ14oMFswLTldfDFbMC05XXwyWzAtM10pOlswLTVdWzAtOV0kJyk7XHJcblxyXG4gICAgICAgIHJldHVybiAoY29udHJvbDogQWJzdHJhY3RDb250cm9sKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChjb250cm9sLnZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAocmVnZXhFeHAudGVzdChjb250cm9sLnZhbHVlKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyAndGltZSc6IHRydWUgfTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBjbnBqQ3BmVmFsaWRhdG9yKCkge1xyXG4gICAgICAgIHJldHVybiAoY29udHJvbDogQWJzdHJhY3RDb250cm9sKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICghY29udHJvbC52YWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChjb250cm9sLnZhbHVlICYmIGNvbnRyb2wudmFsdWUubGVuZ3RoIDw9IDExKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy52YWxpZGF0b3JDUEYoY29udHJvbC52YWx1ZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgJ2NwZic6IHRydWUgfTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIGlmIChjb250cm9sLnZhbHVlICYmIGNvbnRyb2wudmFsdWUubGVuZ3RoID09IDEyKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGlmIChjb250cm9sLnZhbHVlICYmIHRoaXMudmFsaWRhdG9yQ05QSihjb250cm9sLnZhbHVlKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyAnY25waic6IHRydWUgfTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBtYXRjaFZhbGlkYXRvcigpIHtcclxuICAgICAgICByZXR1cm4gKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAodGhpcy52YWx1ZSAhPSB0aGlzLm1hdGNoKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4geyAnbWF0Y2gnOiB0cnVlIH07XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBlbWFpbFZhbGlkYXRvcihpc0xvZ2luVmFsaWRhdGlvbjogYm9vbGVhbiA9IGZhbHNlKTogQXN5bmNWYWxpZGF0b3JGbiB7XHJcbiAgICAgICAgcmV0dXJuIChjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpID0+IHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuZW1haWxWYWxpZGF0b3JUaW1lb3V0KSB7XHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5lbWFpbFZhbGlkYXRvclRpbWVvdXQpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy52YWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWFpbFZhbGlkYXRvclRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubmd0VmFsaWRhdGlvblNlcnZpY2UuZW1haWxWYWxpZGF0aW9uKHRoaXMudmFsdWUpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAudGhlbigocmVzcG9uc2U6IE5ndEh0dHBWYWxpZGF0aW9uUmVzcG9uc2UpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzTG9naW5WYWxpZGF0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUocmVzcG9uc2UudmFsaWQgPyB7ICdsb2dpbic6IHRydWUgfSA6IG51bGwpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXNwb25zZS52YWxpZCA/IG51bGwgOiB7ICdlbWFpbCc6IHRydWUgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNhdGNoKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKG51bGwpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSwgNTAwKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG51bGwpO1xyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBwYXNzd29yZFZhbGlkYXRvcigpOiBBc3luY1ZhbGlkYXRvckZuIHtcclxuICAgICAgICByZXR1cm4gKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5wYXNzd29yZFZhbGlkYXRvclRpbWVvdXQpIHtcclxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLnBhc3N3b3JkVmFsaWRhdG9yVGltZW91dCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLnZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnBhc3N3b3JkVmFsaWRhdG9yVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5uZ3RWYWxpZGF0aW9uU2VydmljZS5wYXNzd29yZFZhbGlkYXRpb24odGhpcy52YWx1ZSwgdGhpcy5wYXNzd29yZGFibGVJZCwgdGhpcy5wYXNzd29yZFBvbGljeUlkKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4oKHJlc3BvbnNlOiBOZ3RIdHRwVmFsaWRhdGlvblJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUocmVzcG9uc2UudmFsaWQgPyBudWxsIDogeyAnaW52YWxpZF9wYXNzd29yZCc6IHRydWUgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNhdGNoKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShudWxsKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH0sIDUwMCk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShudWxsKTtcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgYXN5bmMgc2VhcmNoRXhpc3RpbmdSZXNvdXJjZSgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAgICBpZiAodGhpcy5zZWFyY2hFeGlzdGluZ1Jlc291cmNlVGltZW91dCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5zZWFyY2hFeGlzdGluZ1Jlc291cmNlVGltZW91dCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnNlYXJjaEV4aXN0aW5nUmVzb3VyY2VUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IHRydWU7XHJcbiAgICAgICAgICAgIHRoaXMuZmluZEV4aXN0aW5nUmVzb3VyY2UudmFsdWUgPSB0aGlzLnZhbHVlO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5uZ3RSZXNvdXJjZVNlcnZpY2UuZmluZEV4aXN0aW5nKHRoaXMuZmluZEV4aXN0aW5nUmVzb3VyY2UpXHJcbiAgICAgICAgICAgICAgICAudGhlbigocmVzcG9uc2U6IE5ndEh0dHBGaW5kRXhpc3RpbmdSZXNvdXJjZVJlc3BvbnNlKSA9PiB0aGlzLmV4aXN0aW5nUmVzb3VyY2VJZCA9IHJlc3BvbnNlLmlkKVxyXG4gICAgICAgICAgICAgICAgLmNhdGNoKCgpID0+IHRoaXMuZXhpc3RpbmdSZXNvdXJjZUlkID0gbnVsbClcclxuICAgICAgICAgICAgICAgIC5maW5hbGx5KCgpID0+IHRoaXMubG9hZGluZyA9IGZhbHNlKTtcclxuICAgICAgICB9LCA1MDApO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgYXN5bmMgdmFsaWRhdGVQaG9uZSgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAgICBpZiAodGhpcy5waG9uZVZhbGlkYXRvclRpbWVvdXQpIHtcclxuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMucGhvbmVWYWxpZGF0b3JUaW1lb3V0KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMucGhvbmVWYWxpZGF0b3JUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IHRydWU7XHJcblxyXG4gICAgICAgICAgICB0aGlzLm5ndFZhbGlkYXRpb25TZXJ2aWNlLnBob25lVmFsaWRhdGlvbih0aGlzLnZhbHVlKVxyXG4gICAgICAgICAgICAgICAgLnRoZW4oKHJlc3BvbnNlOiBhbnkpID0+IHRoaXMudmFsaWRhdGVQaG9uZVJlc3VsdC5lbWl0KHJlc3BvbnNlKSlcclxuICAgICAgICAgICAgICAgIC5maW5hbGx5KCgpID0+IHRoaXMubG9hZGluZyA9IGZhbHNlKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHVuaXF1ZVZhbGlkYXRvcigpOiBBc3luY1ZhbGlkYXRvckZuIHtcclxuICAgICAgICBpZiAoIXRoaXMubmd0VmFsaWRhdGlvblNlcnZpY2UpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW4gb3JkZXIgdG8gdXNlIHVuaXF1ZSB2YWxpZGF0aW9uIHlvdSBtdXN0IHByb3ZpZGUgYSBpbXBsZW1lbnRhdGlvbiBmb3IgTmd0SHR0cFZhbGlkYXRpb25TZXJ2aWNlIGNsYXNzIVwiKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiAoY29udHJvbDogQWJzdHJhY3RDb250cm9sKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnVuaXF1ZVZhbGlkYXRvclRpbWVvdXQpIHtcclxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLnVuaXF1ZVZhbGlkYXRvclRpbWVvdXQpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy52YWx1ZSAmJiB0aGlzLnVuaXF1ZVJlc291cmNlKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnVuaXF1ZVZhbGlkYXRvclRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubmd0VmFsaWRhdGlvblNlcnZpY2UudW5pcXVlKHRoaXMudW5pcXVlUmVzb3VyY2UsIHRoaXMudmFsdWUpLnRoZW4oKHJlc3BvbnNlOiBOZ3RIdHRwVmFsaWRhdGlvblJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHJlc3BvbnNlLnZhbGlkID8gbnVsbCA6IHsgJ3VuaXF1ZSc6IHRydWUgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLmNhdGNoKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShudWxsKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSwgNTAwKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG51bGwpO1xyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSB2YWxpZGF0b3JDTlBKKHZhbHVlKSB7XHJcbiAgICAgICAgbGV0IGIgPSBbNiwgNSwgNCwgMywgMiwgOSwgOCwgNywgNiwgNSwgNCwgMywgMl07XHJcblxyXG4gICAgICAgIGlmICgodmFsdWUgPSB2YWx1ZS5yZXBsYWNlKC9bXlxcZF0vZywgXCJcIikpLmxlbmd0aCAhPSAxNCkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoLzB7MTR9Ly50ZXN0KHZhbHVlKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgbiA9IDA7XHJcblxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMTI7IG4gKz0gdmFsdWVbaV0gKiBiWysraV0pIHtcclxuICAgICAgICAgICAgO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHZhbHVlWzEyXSAhPSAoKChuICU9IDExKSA8IDIpID8gMCA6IDExIC0gbikpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbiA9IDA7XHJcblxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDw9IDEyOyBuICs9IHZhbHVlW2ldICogYltpKytdKSB7XHJcbiAgICAgICAgICAgIDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh2YWx1ZVsxM10gIT0gKCgobiAlPSAxMSkgPCAyKSA/IDAgOiAxMSAtIG4pKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfTtcclxuXHJcbiAgICBwcml2YXRlIHZhbGlkYXRvckNQRih2YWx1ZSkge1xyXG4gICAgICAgIGxldCBudW1lcm9zLCBkaWdpdG9zLCBzb21hLCBpLCByZXN1bHRhZG8sIGRpZ2l0b3NfaWd1YWlzO1xyXG5cclxuICAgICAgICBkaWdpdG9zX2lndWFpcyA9IDE7XHJcblxyXG4gICAgICAgIGlmICh2YWx1ZS5sZW5ndGggPCAxMSkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoIC0gMTsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmICh2YWx1ZS5jaGFyQXQoaSkgIT0gdmFsdWUuY2hhckF0KGkgKyAxKSkge1xyXG4gICAgICAgICAgICAgICAgZGlnaXRvc19pZ3VhaXMgPSAwO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghZGlnaXRvc19pZ3VhaXMpIHtcclxuICAgICAgICAgICAgbnVtZXJvcyA9IHZhbHVlLnN1YnN0cmluZygwLCA5KTtcclxuICAgICAgICAgICAgZGlnaXRvcyA9IHZhbHVlLnN1YnN0cmluZyg5KTtcclxuICAgICAgICAgICAgc29tYSA9IDA7XHJcblxyXG4gICAgICAgICAgICBmb3IgKGkgPSAxMDsgaSA+IDE7IGktLSkge1xyXG4gICAgICAgICAgICAgICAgc29tYSArPSBudW1lcm9zLmNoYXJBdCgxMCAtIGkpICogaTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgcmVzdWx0YWRvID0gc29tYSAlIDExIDwgMiA/IDAgOiAxMSAtIHNvbWEgJSAxMTtcclxuXHJcbiAgICAgICAgICAgIGlmIChyZXN1bHRhZG8gIT0gZGlnaXRvcy5jaGFyQXQoMCkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgbnVtZXJvcyA9IHZhbHVlLnN1YnN0cmluZygwLCAxMCk7XHJcbiAgICAgICAgICAgIHNvbWEgPSAwO1xyXG5cclxuICAgICAgICAgICAgZm9yIChpID0gMTE7IGkgPiAxOyBpLS0pIHtcclxuICAgICAgICAgICAgICAgIHNvbWEgKz0gbnVtZXJvcy5jaGFyQXQoMTEgLSBpKSAqIGk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHJlc3VsdGFkbyA9IHNvbWEgJSAxMSA8IDIgPyAwIDogMTEgLSBzb21hICUgMTE7XHJcblxyXG4gICAgICAgICAgICBpZiAocmVzdWx0YWRvICE9IGRpZ2l0b3MuY2hhckF0KDEpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBnZXROYXRpdmVWYWx1ZSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQudmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBnZXRFbGVtZW50VGl0bGUoKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LnRpdGxlO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgcmVtb3ZlTWFza3ModmFsdWU6IHN0cmluZykge1xyXG4gICAgICAgIGlmICh0aGlzLm1hc2sgPT0gXCJkZWNpbWFsXCIpIHtcclxuICAgICAgICAgICAgdmFsdWUgPSAodmFsdWUgKyBcIlwiKVxyXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoL1xcLi9nLCAnJylcclxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKCcsJywgJy4nKTtcclxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMubWFzayA9PSBcImNucGotY3BmXCIgfHwgdGhpcy5tYXNrID09IFwiY3BmXCIgfHwgdGhpcy5tYXNrID09IFwiY25walwiIHx8IHRoaXMubWFzayA9PSBcImNucGotY3BmLXJ1dFwiIHx8IHRoaXMubWFzayA9PSBcImN1aXRcIikge1xyXG4gICAgICAgICAgICB2YWx1ZSA9ICh2YWx1ZSArIFwiXCIpXHJcbiAgICAgICAgICAgICAgICAucmVwbGFjZSgvW15cXGRdL2csICcnKTtcclxuICAgICAgICB9IGVsc2UgaWYgKFxyXG4gICAgICAgICAgICB0aGlzLm1hc2sgPT0gSW5wdXRNYXNrRW51bS5DRUxMUEhPTkVcclxuICAgICAgICAgICAgfHwgdGhpcy5tYXNrID09IElucHV0TWFza0VudW0uSU5URVJOQVRJT05BTF9QSE9ORVxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgICB2YWx1ZSA9ICh2YWx1ZSArIFwiXCIpXHJcbiAgICAgICAgICAgICAgICAucmVwbGFjZSgnKCcsICcnKVxyXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoJyknLCAnJylcclxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKCcgJywgJycpXHJcbiAgICAgICAgICAgICAgICAucmVwbGFjZSgnICcsICcnKVxyXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoJy0nLCAnJylcclxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKCcrJywgJycpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaGFzRW1haWxTZXJ2aWNlVmFsaWRhdGlvbigpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gdHlwZW9mIHRoaXMubmd0VmFsaWRhdGlvblNlcnZpY2U/LmVtYWlsVmFsaWRhdGlvbiA9PT0gJ2Z1bmN0aW9uJztcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGhhc1Bhc3N3b3JkVmFsaWRhdGlvbigpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gdHlwZW9mIHRoaXMubmd0VmFsaWRhdGlvblNlcnZpY2U/LnBhc3N3b3JkVmFsaWRhdGlvbiA9PT0gJ2Z1bmN0aW9uJztcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGlzRGlzYWJsZWRCeVBhcmVudCgpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5uZ3RGb3JtPy5pc0Rpc2FibGVkXHJcbiAgICAgICAgICAgIHx8IHRoaXMubmd0U2VjdGlvbj8uaXNEaXNhYmxlZFxyXG4gICAgICAgICAgICB8fCB0aGlzLm5ndE1vZGFsPy5pc0Rpc2FibGVkO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaGFzQ2hhbmdlc0JldHdlZW5Nb2RlbHMoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucmVtb3ZlTWFza3ModGhpcy5nZXROYXRpdmVWYWx1ZSgpKSAhPT0gdGhpcy52YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGRlc3Ryb3lTdWJzY3JpcHRpb25zKCkge1xyXG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5mb3JFYWNoKHN1YnNjcmlwdGlvbiA9PiBzdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKSk7XHJcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zID0gW107XHJcbiAgICB9XHJcbn1cclxuIiwiPGxhYmVsICpuZ0lmPVwibGFiZWxcIiBjbGFzcz1cIm1iLTIgZmxleCB7eyBuZ3RTdHlsZS5jb21waWxlKFsnY29sb3IudGV4dCcsICd0ZXh0JywgJ2ZvbnQnXSkgfX1cIiBbaGlkZGVuXT0nc2hpbmluZyc+XHJcbiAgICB7eyBsYWJlbCB9fTpcclxuXHJcbiAgICA8c3BhbiAqbmdJZj1cImlzUmVxdWlyZWRcIiBjbGFzcz1cInRleHQtcmVkLTUwMCBmb250LWJvbGQgdGV4dC1tZCBtbC0xXCI+Kjwvc3Bhbj5cclxuXHJcbiAgICA8bmd0LWhlbHBlciAqbmdJZj1cImhlbHBUZXh0XCIgW2hlbHBUaXRsZV09XCJoZWxwVGl0bGVcIiBbaWNvbkNvbG9yXT1cImhlbHBUZXh0Q29sb3JcIlxyXG4gICAgICAgIFtoZWxwZXJSZXZlcnNlWVBvc2l0aW9uXT1cImhlbHBlclJldmVyc2VZUG9zaXRpb25cIiBbYXV0b1hSZXZlcnNlXT1cImhlbHBlckF1dG9YUmV2ZXJzZVwiIGNsYXNzPVwibWwtMVwiPlxyXG4gICAgICAgIDxzcGFuIFtpbm5lckh0bWxdPVwiaGVscFRleHRcIj48L3NwYW4+XHJcbiAgICA8L25ndC1oZWxwZXI+XHJcbjwvbGFiZWw+XHJcblxyXG48ZGl2IGNsYXNzPVwie3sgc2hpbmluZyA/ICdoaWRkZW4nIDogJ2ZsZXggcmVsYXRpdmUnfX1cIj5cclxuICAgIDxpbnB1dCBhdXRvY29tcGxldGU9XCJuZXctcGFzc3dvcmRcIlxyXG4gICAgICAgIGNsYXNzPVwiZmxleCBib3JkZXIgYXBwZWFyYW5jZS1ub25lIGZvY3VzOm91dGxpbmUtbm9uZSBsZWFkaW5nLXRpZ2h0IHctZnVsbCB7eyBnZXRJbnB1dFBhZGRpbmdzKCkgfX0ge3sgbmd0U3R5bGUuY29tcGlsZShbJ2gnLCAndGV4dCcsICdjb2xvci5ib3JkZXInLCAnY29sb3IuYmcnLCAnY29sb3IudGV4dCcsICdyb3VuZGVkJywgJ2N1cnNvciddKSB9fVwiXHJcbiAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkKClcIiBbcmVhZG9ubHldPVwiaXNSZWFkb25seSB8fCBsb2FkaW5nXCIgW3BsYWNlaG9sZGVyXT1cInBsYWNlaG9sZGVyXCJcclxuICAgICAgICBbc3R5bGVdPVwidXBwZXJjYXNlID8gJ3RleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2UhaW1wb3J0YW50JzonJ1wiXHJcbiAgICAgICAgW25nQ2xhc3NdPVwieydpbnB1dC1oYXMtZXJyb3IgYm9yZGVyLXJlZC03MDAnOiBmb3JtQ29udHJvbD8uZXJyb3JzICYmIChmb3JtQ29udHJvbD8uZGlydHkgfHwgKGZvcm1Db250YWluZXIgJiYgZm9ybUNvbnRhaW5lclsnc3VibWl0dGVkJ10pKX1cIlxyXG4gICAgICAgIFthdHRyLnR5cGVdPVwiaW5wdXRQcm9wZXJ0aWVzLmh0bWxUeXBlXCIgKG1vdXNlbGVhdmUpPVwicmVzdG9yZVBsYWNlaG9sZGVyKClcIiAoZm9jdXNvdXQpPVwicmVzdG9yZVBsYWNlaG9sZGVyKClcIlxyXG4gICAgICAgIChpbnB1dCk9XCJ1c2VJbnB1dEV2ZW50ID8gb25OYXRpdmVDaGFuZ2UoKSA6IG51bGxcIiAoY2hhbmdlKT1cIiF1c2VJbnB1dEV2ZW50ID8gb25OYXRpdmVDaGFuZ2UoKSA6IG51bGxcIiAjZWxlbWVudD5cclxuICAgIDxzcGFuICpuZ0lmPVwiaW5uZXJMZWZ0SWNvblwiXHJcbiAgICAgICAgY2xhc3M9XCJhYnNvbHV0ZSBzZWxmLWNlbnRlciBweC0yIHt7IGlubmVyTGVmdEljb25Db2xvciB9fSB7eyBvbkNsaWNrTGVmdEljb24gPyAnY3Vyc29yLXBvaW50ZXInIDogJycgfX1cIlxyXG4gICAgICAgIChjbGljayk9XCJvbkNsaWNrTGVmdEljb24uZW1pdCgpXCI+XHJcblxyXG4gICAgICAgIDxuZ3Qtc3ZnICpuZ0lmPVwiIXNob3dSb3VuZGVkSWNvblwiIGNsYXNzPVwidGV4dC14cyBmaWxsLWN1cnJlbnRcIiBbc3JjXT0naW5uZXJMZWZ0SWNvbic+PC9uZ3Qtc3ZnPlxyXG4gICAgICAgIDxpbWcgKm5nSWY9XCJzaG93Um91bmRlZEljb25cIiBjbGFzcz1cInJvdW5kZWQtZnVsbCBoLTRcIiBbc3JjXT0naW5uZXJMZWZ0SWNvbic+XHJcbiAgICA8L3NwYW4+XHJcblxyXG4gICAgPGRpdiAqbmdJZj1cImN1c3RvbUlubmVyQ29udGVudFRlbXBsYXRlXCIgY2xhc3M9XCJhYnNvbHV0ZSBzZWxmLWNlbnRlciBweC0yXCI+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJjdXN0b21Jbm5lckNvbnRlbnRUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPGRpdiBjbGFzcz1cImZsZXggYWJzb2x1dGUgaC1mdWxsIGp1c3RpZnktZW5kIHJpZ2h0LTAgdy1hdXRvXCI+XHJcbiAgICAgICAgPHNwYW4gKm5nSWY9XCIhZGlzYWJsZWQoKSAmJiBhbGxvd0NsZWFyICYmIHZhbHVlICYmICFsb2FkaW5nXCJcclxuICAgICAgICAgICAgY2xhc3M9XCJzZWxmLWNlbnRlciByaWdodC0wIHB4LTIgdGV4dC1yZWQtNDAwIGN1cnNvci1wb2ludGVyXCIgKGNsaWNrKT0nY2xlYXJJbnB1dCgkZXZlbnQpJz5cclxuICAgICAgICAgICAgPHN2ZyBjbGFzcz1cImZpbGwtY3VycmVudCBzZWxmLWNlbnRlclwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCI+XHJcbiAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgIGQ9XCJNMTkuMSAxNy4ybC01LjMtNS4zIDUuMy01LjMtMS44LTEuOC01LjMgNS40LTUuMy01LjMtMS44IDEuNyA1LjMgNS4zLTUuMyA1LjNMNi43IDE5bDUuMy01LjMgNS4zIDUuMyAxLjgtMS44elwiIC8+XHJcbiAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgIDwvc3Bhbj5cclxuXHJcbiAgICAgICAgPHNwYW4gKm5nSWY9XCJsb2FkaW5nXCIgY2xhc3M9XCJzZWxmLWNlbnRlciByaWdodC0wIHB4LTIgdGV4dC1ncmF5LTUwMFwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGl2LWxvYWRlclwiPjwvZGl2PlxyXG4gICAgICAgIDwvc3Bhbj5cclxuXHJcbiAgICAgICAgPHNwYW4gKm5nSWY9XCJ0eXBlID09ICdwYXNzd29yZCcgJiYgdmFsdWVcIiBjbGFzcz1cInNlbGYtY2VudGVyIHB4LTIgY3Vyc29yLXBvaW50ZXJcIj5cclxuICAgICAgICAgICAgPHN2ZyAqbmdJZj1cImVsZW1lbnQudHlwZSA9PSAncGFzc3dvcmQnXCIgY2xhc3M9XCJmaWxsLWN1cnJlbnRcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcclxuICAgICAgICAgICAgICAgIHZpZXdCb3g9XCIwIDAgMjAgMjBcIiAoY2xpY2spPSdzaG93UGFzc3dvcmQoKSc+XHJcbiAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgIGQ9XCJNLjIgMTBhMTEgMTEgMCAwIDEgMTkuNiAwQTExIDExIDAgMCAxIC4yIDEwem05LjggNGE0IDQgMCAxIDAgMC04IDQgNCAwIDAgMCAwIDh6bTAtMmEyIDIgMCAxIDEgMC00IDIgMiAwIDAgMSAwIDR6XCIgLz5cclxuICAgICAgICAgICAgPC9zdmc+XHJcblxyXG4gICAgICAgICAgICA8c3ZnICpuZ0lmPVwiZWxlbWVudC50eXBlID09ICd0ZXh0J1wiIGNsYXNzPVwiZmlsbC1jdXJyZW50XCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiXHJcbiAgICAgICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgKGNsaWNrKT0naGlkZVBhc3N3b3JkKCknPlxyXG4gICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICBkPVwiTTEyLjgxIDQuMzZsLTEuNzcgMS43OGE0IDQgMCAwIDAtNC45IDQuOWwtMi43NiAyLjc1QzIuMDYgMTIuNzkuOTYgMTEuNDkuMiAxMGExMSAxMSAwIDAgMSAxMi42LTUuNjR6bTMuOCAxLjg1YzEuMzMgMSAyLjQzIDIuMyAzLjIgMy43OWExMSAxMSAwIDAgMS0xMi42MiA1LjY0bDEuNzctMS43OGE0IDQgMCAwIDAgNC45LTQuOWwyLjc2LTIuNzV6bS0uMjUtMy45OWwxLjQyIDEuNDJMMy42NCAxNy43OGwtMS40Mi0xLjQyTDE2LjM2IDIuMjJ6XCIgLz5cclxuICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgPC9zcGFuPlxyXG5cclxuICAgICAgICA8c3BhbiAqbmdJZj1cImlubmVyUmlnaHRJY29uICYmIHR5cGUgIT0gJ3Bhc3N3b3JkJ1wiXHJcbiAgICAgICAgICAgIGNsYXNzPVwic2VsZi1jZW50ZXIgcHgtMiB7eyBpbm5lclJpZ2h0SWNvbkNvbG9yIH19ICB7eyBvbkNsaWNrUmlnaHRJY29uID8gJ2N1cnNvci1wb2ludGVyJyA6ICcnIH19XCJcclxuICAgICAgICAgICAgKGNsaWNrKT1cIm9uQ2xpY2tSaWdodEljb24uZW1pdCgpXCI+XHJcbiAgICAgICAgICAgIDxuZ3Qtc3ZnIGNsYXNzPVwidGV4dC14eHMgZmlsbC1jdXJyZW50XCIgW3NyY109J2lubmVyUmlnaHRJY29uJz48L25ndC1zdmc+XHJcbiAgICAgICAgPC9zcGFuPlxyXG4gICAgPC9kaXY+XHJcbjwvZGl2PlxyXG5cclxuPG5nLWNvbnRhaW5lciAqbmdJZj1cInNob3dDaGFyYWN0ZXJzTGVuZ3RoICYmIG1heFRvdGFsQ2hhcnNDb3VudCAmJiAhc2hpbmluZ1wiPlxyXG4gICAgPHAgY2xhc3M9XCJ0ZXh0LXh4cyBtdC0xXCI+XHJcbiAgICAgICAge3sgbmd0VHJhbnNsYXRlU2VydmljZS5uZ3RUZXh0QXJlYVJlbWFpbmluZ0NoYXJhY3RlcnMgfX06XHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJmb250LXNlbWlib2xkXCI+e3sgZ2V0UmVtYWluaW5nQ2hhcmFjdGVycygpIH19PC9zcGFuPlxyXG4gICAgPC9wPlxyXG48L25nLWNvbnRhaW5lcj5cclxuXHJcbjxuZy1jb250YWluZXIgKm5nSWY9J3NoaW5pbmcnPlxyXG4gICAgPGRpdiBjbGFzcz1cImZsZXhcIj5cclxuICAgICAgICA8bmd0LXNoaW5pbmcgY2xhc3M9XCJ7eyBuZ3RTdHlsZS5jb21waWxlKFsnaCddKSB9fSB3LWZ1bGxcIj48L25ndC1zaGluaW5nPlxyXG4gICAgPC9kaXY+XHJcbjwvbmctY29udGFpbmVyPlxyXG5cclxuPGlucHV0ICpuZ0lmPSdjb21wb25lbnRSZWFkeScgdHlwZT1cImhpZGRlblwiIFtuZ01vZGVsXT1cInZhbHVlXCIgW25hbWVdPVwibmFtZVwiIFt2YWx1ZV09XCJ2YWx1ZVwiPlxyXG5cclxuPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxyXG5cclxuPG5ndC12YWxpZGF0aW9uIFtjb250cm9sXT1cImZvcm1Db250cm9sXCIgW2NvbnRhaW5lcl09XCJmb3JtQ29udGFpbmVyXCIgW21pblZhbHVlXT0nbWluVmFsdWUnIFttaW5MZW5ndGhdPSdtaW5MZW5ndGgnPlxyXG48L25ndC12YWxpZGF0aW9uPlxyXG4iXX0=