@simpleangularcontrols/sac-common 10.0.0-rc.29 → 10.0.0-rc.30

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 (267) hide show
  1. package/bundles/simpleangularcontrols-sac-common.umd.js +1848 -1249
  2. package/bundles/simpleangularcontrols-sac-common.umd.js.map +1 -1
  3. package/bundles/simpleangularcontrols-sac-common.umd.min.js +1 -1
  4. package/bundles/simpleangularcontrols-sac-common.umd.min.js.map +1 -1
  5. package/common/basedatetimecontrol.d.ts +47 -21
  6. package/common/baseinputcontrol.d.ts +10 -8
  7. package/common/baselistcontrol.d.ts +15 -15
  8. package/common/basemodelcontrol.d.ts +59 -43
  9. package/common/baseselectcontrol.d.ts +5 -5
  10. package/common/baseuploadcontrol.d.ts +77 -57
  11. package/components/browser/browser.d.ts +86 -89
  12. package/components/browser/models/browserfile.d.ts +6 -6
  13. package/components/browser/models/browserfiledeleterequest.d.ts +7 -7
  14. package/components/browser/models/browserfilerenamerequest.d.ts +10 -10
  15. package/components/browser/models/browserfileresponse.d.ts +2 -2
  16. package/components/browser/models/browserfilesaverequest.d.ts +7 -7
  17. package/components/browser/models/browsernode.d.ts +13 -13
  18. package/components/browser/models/browsernodedeleterequest.d.ts +6 -6
  19. package/components/browser/models/browsernodenewrequest.d.ts +7 -7
  20. package/components/browser/models/browsernoderenamerequest.d.ts +7 -7
  21. package/components/browser/models/browsernoderequest.d.ts +7 -7
  22. package/components/browser/models/browsernoderesponse.d.ts +1 -1
  23. package/controls/buttons/button.d.ts +25 -19
  24. package/controls/checkbox/checkbox.d.ts +3 -3
  25. package/controls/checkbox/radiobutton.d.ts +19 -13
  26. package/controls/checkbox/radiobuttons.d.ts +13 -10
  27. package/controls/confirm/confirm.button.d.ts +3 -3
  28. package/controls/confirm/confirm.d.ts +13 -12
  29. package/controls/confirm/confirm.service.d.ts +14 -14
  30. package/controls/contextmenu/contextmenu.d.ts +33 -27
  31. package/controls/contextmenu/contextmenu.interface.d.ts +6 -0
  32. package/controls/contextmenu/contextmenuanchor.d.ts +4 -4
  33. package/controls/contextmenu/contextmenucontainer.d.ts +4 -4
  34. package/controls/contextmenu/contextmenuitembutton.d.ts +12 -12
  35. package/controls/datetime/date.d.ts +11 -11
  36. package/controls/datetime/dateselector.d.ts +47 -40
  37. package/controls/datetime/datetime.d.ts +15 -14
  38. package/controls/datetime/time.d.ts +22 -12
  39. package/controls/dialog/dialog.d.ts +28 -22
  40. package/controls/form/form.d.ts +17 -12
  41. package/controls/grid/grid.d.ts +1 -0
  42. package/controls/grid/gridbutton.d.ts +1 -0
  43. package/controls/grid/gridcolumn.d.ts +5 -1
  44. package/controls/grid/gridcolumnaction.d.ts +1 -1
  45. package/controls/grid/gridcolumnbase.d.ts +8 -3
  46. package/controls/grid/model.d.ts +5 -2
  47. package/controls/grid/paging.d.ts +2 -3
  48. package/controls/input/input.d.ts +7 -7
  49. package/controls/input/inputarea.d.ts +8 -6
  50. package/controls/input/inputcurrency.d.ts +4 -1
  51. package/controls/input/inputdecimal.d.ts +14 -14
  52. package/controls/input/inputemail.d.ts +4 -4
  53. package/controls/input/inputinteger.d.ts +14 -14
  54. package/controls/input/inputpassword.d.ts +3 -3
  55. package/controls/input/inputsearch.d.ts +8 -5
  56. package/controls/layout/formlayout.d.ts +8 -5
  57. package/controls/list/buildvaluestring.d.ts +2 -2
  58. package/controls/list/dropdown.d.ts +23 -22
  59. package/controls/list/dropdownoptions.d.ts +10 -10
  60. package/controls/list/listbox.d.ts +25 -23
  61. package/controls/multilanguage/multilanguageinput.d.ts +25 -25
  62. package/controls/multilanguage/multilanguageinputarea.d.ts +27 -27
  63. package/controls/static/formcontainer.d.ts +8 -8
  64. package/controls/static/staticlabel.d.ts +5 -5
  65. package/controls/tabs/tab.d.ts +2 -2
  66. package/controls/tabs/tabitem.d.ts +7 -7
  67. package/controls/tinymce/tinymce.d.ts +37 -37
  68. package/controls/tinymce/tinymcedialogsettings.d.ts +6 -6
  69. package/controls/tinymce/tinymcedialogsettingsmeta.d.ts +2 -2
  70. package/controls/tinymce/tinymceinstance.d.ts +2 -2
  71. package/controls/tooltip/tooltip.d.ts +10 -5
  72. package/controls/treeview/treeview.d.ts +50 -5
  73. package/controls/upload/dropzonemultiple.d.ts +16 -16
  74. package/controls/upload/dropzonesingle.d.ts +11 -11
  75. package/controls/upload/uploadmultiple.d.ts +12 -12
  76. package/controls/upload/uploadsingle.d.ts +7 -7
  77. package/controls/validation/validationsummary.d.ts +12 -11
  78. package/controls/wizard/wizard.d.ts +25 -18
  79. package/controls/wizard/wizarditem.d.ts +5 -5
  80. package/enums/ButtonRoleType.d.ts +26 -1
  81. package/enums/ControlHeight.d.ts +1 -1
  82. package/enums/IconType.d.ts +1 -1
  83. package/esm2015/common/basedatetimecontrol.js +47 -22
  84. package/esm2015/common/baseinputcontrol.js +13 -11
  85. package/esm2015/common/baselistcontrol.js +21 -17
  86. package/esm2015/common/basemodelcontrol.js +72 -49
  87. package/esm2015/common/baseselectcontrol.js +11 -9
  88. package/esm2015/common/baseuploadcontrol.js +69 -49
  89. package/esm2015/components/browser/browser.js +93 -105
  90. package/esm2015/components/browser/models/browserfile.js +1 -1
  91. package/esm2015/components/browser/models/browserfiledeleterequest.js +6 -4
  92. package/esm2015/components/browser/models/browserfilerenamerequest.js +6 -4
  93. package/esm2015/components/browser/models/browserfileresponse.js +1 -1
  94. package/esm2015/components/browser/models/browserfilesaverequest.js +5 -3
  95. package/esm2015/components/browser/models/browsernode.js +1 -1
  96. package/esm2015/components/browser/models/browsernodedeleterequest.js +6 -4
  97. package/esm2015/components/browser/models/browsernodenewrequest.js +6 -4
  98. package/esm2015/components/browser/models/browsernoderenamerequest.js +6 -4
  99. package/esm2015/components/browser/models/browsernoderequest.js +6 -4
  100. package/esm2015/components/browser/models/browsernoderesponse.js +1 -1
  101. package/esm2015/controls/buttons/button.js +26 -20
  102. package/esm2015/controls/checkbox/checkbox.js +3 -3
  103. package/esm2015/controls/checkbox/radiobutton.js +21 -15
  104. package/esm2015/controls/checkbox/radiobuttons.js +14 -11
  105. package/esm2015/controls/confirm/confirm.button.js +4 -4
  106. package/esm2015/controls/confirm/confirm.js +14 -13
  107. package/esm2015/controls/confirm/confirm.service.js +21 -21
  108. package/esm2015/controls/contextmenu/contextmenu.interface.js +1 -1
  109. package/esm2015/controls/contextmenu/contextmenu.js +29 -23
  110. package/esm2015/controls/contextmenu/contextmenuanchor.js +4 -4
  111. package/esm2015/controls/contextmenu/contextmenucontainer.js +4 -4
  112. package/esm2015/controls/contextmenu/contextmenuitembutton.js +10 -10
  113. package/esm2015/controls/datetime/date.js +13 -13
  114. package/esm2015/controls/datetime/dateselector.js +55 -54
  115. package/esm2015/controls/datetime/datetime.js +17 -16
  116. package/esm2015/controls/datetime/time.js +24 -14
  117. package/esm2015/controls/dialog/dialog.js +31 -24
  118. package/esm2015/controls/form/form.js +18 -13
  119. package/esm2015/controls/grid/grid.js +2 -1
  120. package/esm2015/controls/grid/gridbutton.js +2 -1
  121. package/esm2015/controls/grid/gridcolumn.js +6 -2
  122. package/esm2015/controls/grid/gridcolumnaction.js +2 -2
  123. package/esm2015/controls/grid/gridcolumnbase.js +9 -4
  124. package/esm2015/controls/grid/model.js +5 -2
  125. package/esm2015/controls/grid/paging.js +6 -7
  126. package/esm2015/controls/input/input.js +8 -8
  127. package/esm2015/controls/input/inputarea.js +9 -7
  128. package/esm2015/controls/input/inputcurrency.js +6 -3
  129. package/esm2015/controls/input/inputdecimal.js +21 -27
  130. package/esm2015/controls/input/inputemail.js +5 -5
  131. package/esm2015/controls/input/inputinteger.js +19 -23
  132. package/esm2015/controls/input/inputpassword.js +4 -4
  133. package/esm2015/controls/input/inputsearch.js +9 -6
  134. package/esm2015/controls/layout/formlayout.js +10 -7
  135. package/esm2015/controls/list/buildvaluestring.js +6 -6
  136. package/esm2015/controls/list/dropdown.js +28 -27
  137. package/esm2015/controls/list/dropdownoptions.js +12 -12
  138. package/esm2015/controls/list/listbox.js +26 -24
  139. package/esm2015/controls/multilanguage/multilanguageinput.js +29 -29
  140. package/esm2015/controls/multilanguage/multilanguageinputarea.js +31 -31
  141. package/esm2015/controls/static/formcontainer.js +10 -10
  142. package/esm2015/controls/static/staticlabel.js +7 -7
  143. package/esm2015/controls/tabs/tab.js +2 -2
  144. package/esm2015/controls/tabs/tabitem.js +5 -5
  145. package/esm2015/controls/tinymce/tinymce.js +35 -35
  146. package/esm2015/controls/tinymce/tinymcedialogsettings.js +4 -4
  147. package/esm2015/controls/tinymce/tinymcedialogsettingsmeta.js +1 -1
  148. package/esm2015/controls/tinymce/tinymceinstance.js +1 -1
  149. package/esm2015/controls/tooltip/tooltip.js +13 -8
  150. package/esm2015/controls/treeview/treeview.js +52 -7
  151. package/esm2015/controls/upload/dropzonemultiple.js +18 -18
  152. package/esm2015/controls/upload/dropzonesingle.js +12 -12
  153. package/esm2015/controls/upload/uploadmultiple.js +14 -14
  154. package/esm2015/controls/upload/uploadsingle.js +8 -8
  155. package/esm2015/controls/validation/validationsummary.js +14 -13
  156. package/esm2015/controls/wizard/wizard.js +24 -17
  157. package/esm2015/controls/wizard/wizarditem.js +4 -4
  158. package/esm2015/enums/ButtonRoleType.js +1 -1
  159. package/esm2015/enums/ControlHeight.js +2 -2
  160. package/esm2015/enums/IconType.js +2 -2
  161. package/esm2015/interfaces/ISacConfigurationService.js +1 -1
  162. package/esm2015/interfaces/ISacFileBrowserService.js +1 -1
  163. package/esm2015/interfaces/ISacLabelSizes.js +1 -1
  164. package/esm2015/interfaces/ISacLanguageService.js +1 -1
  165. package/esm2015/interfaces/ISacLocalisationService.js +1 -1
  166. package/esm2015/interfaces/ISacUploadEventCompleteState.js +1 -1
  167. package/esm2015/interfaces/iabstractcontrollabel.js +1 -1
  168. package/esm2015/interfaces/iconfirmcomponent.js +1 -1
  169. package/esm2015/interfaces/idatetimecontrol.js +1 -1
  170. package/esm2015/interfaces/iuploadcontrol.js +1 -1
  171. package/esm2015/interfaces/treeviewaction.interface.js +1 -1
  172. package/esm2015/models/languagemodel.js +5 -3
  173. package/esm2015/public_api.js +3 -2
  174. package/esm2015/services/index.js +4 -4
  175. package/esm2015/services/sac-configuration.service.js +7 -1
  176. package/esm2015/services/sac-filebrowser.service.js +46 -38
  177. package/esm2015/services/sac-localisation.service.js +11 -7
  178. package/esm2015/services/sac-validationkey.service.js +148 -1
  179. package/esm2015/utilities/convertion.js +7 -5
  180. package/esm2015/utilities/datatypes.js +6 -4
  181. package/esm2015/utilities/enums.js +9 -8
  182. package/esm2015/utilities/guid.js +2 -2
  183. package/esm2015/utilities/interpolation.js +16 -9
  184. package/esm2015/utilities/popuphelper.js +62 -25
  185. package/esm2015/utilities/positioncalculator.js +209 -0
  186. package/esm2015/utilities/positioncalculator.ngfactory.js +7 -0
  187. package/esm2015/utilities/positionelements.js +108 -0
  188. package/esm2015/utilities/positionelements.ngfactory.js +7 -0
  189. package/esm2015/utilities/testingattribute.pipe.js +17 -2
  190. package/esm2015/validation/email.validator.js +11 -2
  191. package/esm2015/validation/equals.validator.js +11 -1
  192. package/esm2015/validation/index.js +1 -1
  193. package/esm2015/validation/invaliddate.validator.js +11 -2
  194. package/esm2015/validation/isDateValid.js +11 -10
  195. package/esm2015/validation/maxdate.validator.js +14 -4
  196. package/esm2015/validation/maxtime.validator.js +14 -4
  197. package/esm2015/validation/maxvalue.validator.js +12 -2
  198. package/esm2015/validation/mindate.validator.js +14 -4
  199. package/esm2015/validation/minfiles.validator.js +12 -2
  200. package/esm2015/validation/mintextlength.validator.js +9 -1
  201. package/esm2015/validation/mintime.validator.js +14 -4
  202. package/esm2015/validation/minvalue.validator.js +12 -2
  203. package/esm2015/validation/multilanguagerequired.validator.js +11 -1
  204. package/esm2015/validation/multilanguagerequiredany.validator.js +11 -1
  205. package/esm2015/validation/notequals.validator.js +11 -1
  206. package/esm2015/validation/pattern.validator.js +12 -2
  207. package/esm2015/validation/required.validator.js +11 -2
  208. package/esm2015/validation/validation.class.js +84 -101
  209. package/esm2015/validation/validationerrorcreator.js +12 -1
  210. package/esm2015/validation/validationerroritem.js +11 -9
  211. package/fesm2015/simpleangularcontrols-sac-common.js +1823 -1226
  212. package/fesm2015/simpleangularcontrols-sac-common.js.map +1 -1
  213. package/interfaces/ISacConfigurationService.d.ts +9 -1
  214. package/interfaces/ISacFileBrowserService.d.ts +43 -43
  215. package/interfaces/ISacLabelSizes.d.ts +15 -12
  216. package/interfaces/ISacLanguageService.d.ts +3 -3
  217. package/interfaces/ISacLocalisationService.d.ts +2 -2
  218. package/interfaces/ISacUploadEventCompleteState.d.ts +6 -0
  219. package/interfaces/iabstractcontrollabel.d.ts +4 -1
  220. package/interfaces/iconfirmcomponent.d.ts +6 -6
  221. package/interfaces/idatetimecontrol.d.ts +10 -1
  222. package/interfaces/treeviewaction.interface.d.ts +9 -0
  223. package/models/languagemodel.d.ts +9 -9
  224. package/package.json +1 -1
  225. package/public_api.d.ts +2 -1
  226. package/services/index.d.ts +3 -3
  227. package/services/sac-configuration.service.d.ts +8 -0
  228. package/services/sac-filebrowser.service.d.ts +78 -70
  229. package/services/sac-localisation.service.d.ts +11 -7
  230. package/services/sac-validationkey.service.d.ts +147 -0
  231. package/simpleangularcontrols-sac-common-10.0.0-rc.30.tgz +0 -0
  232. package/simpleangularcontrols-sac-common.metadata.json +1 -1
  233. package/utilities/convertion.d.ts +4 -4
  234. package/utilities/datatypes.d.ts +3 -3
  235. package/utilities/enums.d.ts +8 -1
  236. package/utilities/guid.d.ts +1 -1
  237. package/utilities/interpolation.d.ts +9 -8
  238. package/utilities/popuphelper.d.ts +47 -10
  239. package/utilities/positioncalculator.d.ts +82 -0
  240. package/utilities/positionelements.d.ts +30 -0
  241. package/utilities/positionelements.ngfactory.d.ts +1 -0
  242. package/utilities/testingattribute.pipe.d.ts +16 -1
  243. package/validation/email.validator.d.ts +7 -0
  244. package/validation/equals.validator.d.ts +8 -0
  245. package/validation/invaliddate.validator.d.ts +7 -0
  246. package/validation/isDateValid.d.ts +5 -2
  247. package/validation/maxdate.validator.d.ts +8 -0
  248. package/validation/maxtime.validator.d.ts +8 -0
  249. package/validation/maxvalue.validator.d.ts +8 -0
  250. package/validation/mindate.validator.d.ts +8 -0
  251. package/validation/minfiles.validator.d.ts +8 -0
  252. package/validation/mintextlength.validator.d.ts +8 -0
  253. package/validation/mintime.validator.d.ts +8 -0
  254. package/validation/minvalue.validator.d.ts +8 -0
  255. package/validation/multilanguagerequired.validator.d.ts +9 -1
  256. package/validation/multilanguagerequiredany.validator.d.ts +9 -1
  257. package/validation/notequals.validator.d.ts +8 -0
  258. package/validation/pattern.validator.d.ts +8 -0
  259. package/validation/required.validator.d.ts +7 -0
  260. package/validation/validation.class.d.ts +83 -100
  261. package/validation/validationerrorcreator.d.ts +9 -0
  262. package/validation/validationerroritem.d.ts +16 -16
  263. package/esm2015/utilities/positioning.js +0 -301
  264. package/esm2015/utilities/positioning.ngfactory.js +0 -7
  265. package/simpleangularcontrols-sac-common-10.0.0-rc.29.tgz +0 -0
  266. package/utilities/positioning.d.ts +0 -82
  267. /package/utilities/{positioning.ngfactory.d.ts → positioncalculator.ngfactory.d.ts} +0 -0
@@ -1,59 +1,58 @@
1
- import { HttpClient } from '@angular/common/http';
2
- import { Directive, EventEmitter, HostListener, Injector, Input, Output, } from '@angular/core';
3
1
  import { SACICON_SERVICE, SACLOCALISATION_SERVICE, SACVALIDATIONKEY_SERVICE, SacDefaultIconService, SacDefaultValidationKeyService, } from '../../services';
4
- import { SACFILEBROWSER_SERVICE, SacDefaultFileBrowserService, } from '../../services/sac-filebrowser.service';
2
+ import { SACFILEBROWSER_SERVICE, SacDefaultFileBrowserService } from '../../services/sac-filebrowser.service';
5
3
  import { SacDefaultLocalisationService } from '../../services/sac-localisation.service';
4
+ import { HttpClient } from '@angular/common/http';
5
+ import { Directive, EventEmitter, HostListener, Injector, Input, Output } from '@angular/core';
6
6
  /**
7
- * Base Component für File Browser
7
+ * Base component for file browser
8
8
  */
9
9
  export class SacFileBrowserCommon {
10
10
  // #endregion Properties
11
11
  // #region Constructors
12
12
  /**
13
- * Konstruktor
13
+ * Constructor
14
14
  * @param httpclient Angular HTTP Client
15
15
  * @param injector Service Injector
16
16
  */
17
17
  constructor(httpclient, injector) {
18
18
  /**
19
- * File welches beim starten des Browsers bereits selektiert ist
19
+ * File that is already selected when the browser starts
20
20
  */
21
21
  this.preselecedfile = null;
22
22
  /**
23
- * Erlaubte Dateierweiterungen für Fileauswahl und Upload. Dateierweiterung mit Punkt und
24
- * getrennt durch Komma für mehr als eine Erweiterung (Example: ".jpg,.gif")
23
+ * Allowed file extensions for file selection and upload. Use dot notation, separated by commas for multiple extensions (Example: ".jpg,.gif")
25
24
  */
26
25
  this.allowedtypes = '';
27
26
  /**
28
- * Erlaubt das löschen einer Datei
27
+ * Allows deleting a file
29
28
  */
30
29
  this.allowfiledelete = true;
31
30
  /**
32
- * Erlaubt das umbenennen einer Datei
31
+ * Allows renaming a file
33
32
  */
34
33
  this.allowfilerename = true;
35
34
  /**
36
- * Erlaubt den Upload von Dateien
35
+ * Allows uploading files
37
36
  */
38
37
  this.allowfileupload = true;
39
38
  /**
40
- * Erlaubt das erstellen eines neuen Ordners
39
+ * Allows creating a new folder
41
40
  */
42
41
  this.allowfoldercreate = true;
43
42
  /**
44
- * Erlaubt das löschen eines Ordners
43
+ * Allows deleting a folder
45
44
  */
46
45
  this.allowfolderdelete = true;
47
46
  /**
48
- * Erlaubt das Umbenennen eines Ordners
47
+ * Allows renaming a folder
49
48
  */
50
49
  this.allowfolderrename = true;
51
50
  /**
52
- * Output Emitter wenn File selektiert wird.
51
+ * Output emitter when a file is selected.
53
52
  */
54
53
  this.file = new EventEmitter();
55
54
  /**
56
- * Root Node Item für Tree
55
+ * Root node item for the tree
57
56
  */
58
57
  this.rootNode = {
59
58
  Name: '',
@@ -83,16 +82,6 @@ export class SacFileBrowserCommon {
83
82
  }
84
83
  // #endregion Constructors
85
84
  // #region Public Getters And Setters
86
- /**
87
- * Setzt den Seleced Node über den Pfad
88
- */
89
- set selectedfile(v) {
90
- const selectednode = this.findSelectedNodeByPath(this.rootNode, v);
91
- if (selectednode !== null) {
92
- this.selectNode(selectednode);
93
- }
94
- this.preselecedfile = v;
95
- }
96
85
  /**
97
86
  * CSS icon class for delete icon
98
87
  * @returns css class with icon
@@ -108,7 +97,7 @@ export class SacFileBrowserCommon {
108
97
  return this.iconService.BrowserComponentEditIcon;
109
98
  }
110
99
  /**
111
- * CSS icon for folders in tree there are collabsed
100
+ * CSS icon for folders in tree that are collapsed
112
101
  * @returns css class with icon
113
102
  */
114
103
  get iconFolderCollabsed() {
@@ -143,7 +132,7 @@ export class SacFileBrowserCommon {
143
132
  return this.iconService.BrowserComponentRefreshIcon;
144
133
  }
145
134
  /**
146
- * Getter für Selected File. Ist an Input Property gebunden
135
+ * Getter for selected file. Bound to an input property
147
136
  */
148
137
  get selectedfile() {
149
138
  if (this.selectFile && this.selectFile.length > 0) {
@@ -153,25 +142,19 @@ export class SacFileBrowserCommon {
153
142
  return null;
154
143
  }
155
144
  }
156
- // #endregion Public Getters And Setters
157
- // #region Public Methods
158
145
  /**
159
- * HostListener welcher den Edit Mode bei allen Files und Nodes beendet.
146
+ * Sets the selected node by the path
160
147
  */
161
- exitEditMode(targetElement) {
162
- if (this.selectedNode) {
163
- this.selectedNode.Files.forEach((itm) => (itm.IsEditMode = false));
164
- if (!this.selectedNode ||
165
- this.selectedNode.Name === null ||
166
- this.selectedNode.Name.length === 0) {
167
- this.clearNewChildNodes(this.rootNode);
168
- }
148
+ set selectedfile(v) {
149
+ const selectednode = this.findSelectedNodeByPath(this.rootNode, v);
150
+ if (selectednode !== null) {
151
+ this.selectNode(selectednode);
169
152
  }
170
- this.resetNodeEditMode(null);
153
+ this.preselecedfile = v;
171
154
  }
172
155
  /**
173
- * Löscht ein File
174
- * @param file File welches gelöscht werden soll
156
+ * Deletes a file
157
+ * @param file File to be deleted
175
158
  */
176
159
  deleteFile(file) {
177
160
  this.confirmDeleteFile(file).subscribe((confirm) => {
@@ -185,15 +168,13 @@ export class SacFileBrowserCommon {
185
168
  });
186
169
  }
187
170
  /**
188
- * Löscht einen Node
189
- * @param node Node welcher gelöscht werden soll
171
+ * Deletes a node
172
+ * @param node Node to be deleted
190
173
  */
191
174
  deleteNode(node) {
192
175
  this.confirmDeleteNode(node).subscribe((confirm) => {
193
176
  if (confirm) {
194
- this.browserService
195
- .DeleteNode(this.apiurl, node.Path)
196
- .subscribe((result) => {
177
+ this.browserService.DeleteNode(this.apiurl, node.Path).subscribe((result) => {
197
178
  const parentNode = this.findParentNode(this.rootNode, node);
198
179
  parentNode.ChildNodes = result.Node.ChildNodes;
199
180
  this.rootNode.ChildNodes.forEach((itm) => {
@@ -205,22 +186,34 @@ export class SacFileBrowserCommon {
205
186
  });
206
187
  }
207
188
  /**
208
- * Setzt ein File in den Edit Mode
209
- * @param file File welches in den Edit Mode gesetzt werden soll
189
+ * Sets a file into edit mode
190
+ * @param file File that should be placed into edit mode
210
191
  */
211
192
  editFile(file) {
212
193
  file.IsEditMode = true;
213
194
  }
214
195
  /**
215
- * Setzt einen Node in den Edit Mode
216
- * @param node Node welcher bearbeitet werden soll
196
+ * Sets a node into edit mode
197
+ * @param node Node to be edited
217
198
  */
218
199
  editNode(node) {
219
200
  node.IsEditMode = true;
220
201
  }
221
202
  /**
222
- * Erzeugt einen neuen Node im Tree
223
- * @param node Node unter welchem ein neuer Node erstellt werden soll
203
+ * HostListener that ends edit mode for all files and nodes.
204
+ */
205
+ exitEditMode(targetElement) {
206
+ if (this.selectedNode) {
207
+ this.selectedNode.Files.forEach((itm) => (itm.IsEditMode = false));
208
+ if (!this.selectedNode || this.selectedNode.Name === null || this.selectedNode.Name.length === 0) {
209
+ this.clearNewChildNodes(this.rootNode);
210
+ }
211
+ }
212
+ this.resetNodeEditMode(null);
213
+ }
214
+ /**
215
+ * Creates a new node in the tree
216
+ * @param node Node under which a new node should be created
224
217
  */
225
218
  newNode(node) {
226
219
  const item = {
@@ -237,12 +230,10 @@ export class SacFileBrowserCommon {
237
230
  this.editNode(item);
238
231
  }
239
232
  /**
240
- * Init Event der Komponente
233
+ * Init event of the component
241
234
  */
242
235
  ngOnInit() {
243
- this.browserService
244
- .GetNode(this.apiurl, '', this.allowedtypes)
245
- .subscribe((result) => {
236
+ this.browserService.GetNode(this.apiurl, '', this.allowedtypes).subscribe((result) => {
246
237
  this.rootNode = {
247
238
  Name: result.Node.Name,
248
239
  Files: result.Node.Files,
@@ -254,14 +245,14 @@ export class SacFileBrowserCommon {
254
245
  };
255
246
  this.setPathToAllNodes();
256
247
  this.selectedNode = this.rootNode;
257
- // Selected File erneut setzen, wenn Property gesetzt wurde bevor Daten vom Service geladen wurden.
248
+ // Re-set the selected file if the property was set before data was loaded from the service.
258
249
  if (this.preselecedfile !== null && this.preselecedfile.length > 0) {
259
250
  this.selectedfile = this.preselecedfile;
260
251
  }
261
252
  });
262
253
  }
263
254
  /**
264
- * Aktualisiert den Node
255
+ * Updates the node
265
256
  */
266
257
  refreshNode(node) {
267
258
  if (!node.IsExpanded) {
@@ -276,9 +267,9 @@ export class SacFileBrowserCommon {
276
267
  });
277
268
  }
278
269
  /**
279
- * Methode wenn eine Datei umbenannt werden soll
280
- * @param file File welches umbenannt werden soll
281
- * @param newFilename Neuer Dateiname
270
+ * Method called when a file should be renamed
271
+ * @param file File to be renamed
272
+ * @param newFilename New filename
282
273
  */
283
274
  renameFile(file, newFilename) {
284
275
  file.IsEditMode = false;
@@ -295,16 +286,14 @@ export class SacFileBrowserCommon {
295
286
  }
296
287
  }
297
288
  /**
298
- * Methode wenn ein Node umbenannt werden soll
299
- * @param node Node welcher umbenannt werden soll
300
- * @param newFoldername Neuer Ordnername
289
+ * Method called when a node should be renamed
290
+ * @param node Node to be renamed
291
+ * @param newFoldername New folder name
301
292
  */
302
293
  renameNode(node, newFoldername) {
303
294
  node.IsEditMode = false;
304
295
  if (!node.IsNewNode) {
305
- if (!newFoldername ||
306
- newFoldername === null ||
307
- newFoldername.length === 0) {
296
+ if (!newFoldername || newFoldername === null || newFoldername.length === 0) {
308
297
  // Cancel Rename. Invalid Foldername
309
298
  return;
310
299
  }
@@ -318,9 +307,7 @@ export class SacFileBrowserCommon {
318
307
  }
319
308
  }
320
309
  else {
321
- if (!newFoldername ||
322
- newFoldername === null ||
323
- newFoldername.length === 0) {
310
+ if (!newFoldername || newFoldername === null || newFoldername.length === 0) {
324
311
  this.clearNewChildNodes(this.rootNode);
325
312
  return;
326
313
  }
@@ -336,8 +323,8 @@ export class SacFileBrowserCommon {
336
323
  }
337
324
  }
338
325
  /**
339
- * Methode wenn ein File selektiert wird
340
- * @param file File welches selektiert wird
326
+ * Method called when a file is selected
327
+ * @param file File that is selected
341
328
  */
342
329
  selectFile(file) {
343
330
  if (!file.IsEditMode) {
@@ -353,8 +340,8 @@ export class SacFileBrowserCommon {
353
340
  this.file.emit(this.selectedFile);
354
341
  }
355
342
  /**
356
- * Methode wenn ein Node selektiert wird
357
- * @param node Node welcher selektiert werden soll
343
+ * Method called when a node is selected
344
+ * @param node Node that should be selected
358
345
  */
359
346
  selectNode(node) {
360
347
  if (!node.IsExpanded) {
@@ -382,8 +369,8 @@ export class SacFileBrowserCommon {
382
369
  }
383
370
  }
384
371
  /**
385
- * Expand/Collabse Methode für Nodes
386
- * @param node Node welcher geöffnet oder geschlossen werden soll
372
+ * Expand/collapse method for nodes
373
+ * @param node Node that should be opened or closed
387
374
  */
388
375
  switchExpandNode(node) {
389
376
  if (node.IsExpanded) {
@@ -394,8 +381,9 @@ export class SacFileBrowserCommon {
394
381
  }
395
382
  }
396
383
  /**
397
- * Methode die Aufgerufen werden muss, wenn ein Upload beendet ist.
398
- * @param param Parameter des hochgeladenen Files
384
+ * Method that must be called when an upload is completed.
385
+ * @param node Node where uploaded files should be attached.
386
+ * @param uploadIdList List of upload IDs that finished uploading.
399
387
  */
400
388
  uploadComplete(node, uploadIdList) {
401
389
  if (uploadIdList !== null) {
@@ -415,11 +403,11 @@ export class SacFileBrowserCommon {
415
403
  });
416
404
  }
417
405
  }
418
- // #endregion Public Abstract Methods
406
+ // #endregion Public Methods
419
407
  // #region Private Methods
420
408
  /**
421
- * Rekursive Methode welche beim Node und all seinen Childs neue Nodes entfernt
422
- * @param node Node bei welchem alle neuen Nodes entfernt werden soll.
409
+ * Recursive method that removes new nodes from the given node and all its children
410
+ * @param node Node from which all new nodes should be removed.
423
411
  */
424
412
  clearNewChildNodes(node) {
425
413
  node.ChildNodes.forEach((itm) => {
@@ -430,9 +418,9 @@ export class SacFileBrowserCommon {
430
418
  node.ChildNodes.forEach((itm) => this.clearNewChildNodes(itm));
431
419
  }
432
420
  /**
433
- * Methode welche den Pfad für einen Node erzeugt
434
- * @param node Node für welchen der Pfad erzeugt werden soll
435
- * @param parentPath Übergeordneter Pfad
421
+ * Method that generates the path for a node
422
+ * @param node Node for which the path should be generated
423
+ * @param parentPath Parent path
436
424
  */
437
425
  fillPath(node, parentPath) {
438
426
  node.Path = parentPath + '/' + node.Name;
@@ -441,10 +429,10 @@ export class SacFileBrowserCommon {
441
429
  });
442
430
  }
443
431
  /**
444
- * Sucht den übergeordneten Node im Tree
445
- * @param node Aktueller Node
446
- * @param nodeToFind Node welcher gefunden werden soll
447
- * @returns Node wenn er gefunden wurde, ansonsten wird NULL zurückgegeben
432
+ * Finds the parent node in the tree
433
+ * @param node Current node
434
+ * @param nodeToFind Node to find
435
+ * @returns The node if found, otherwise NULL
448
436
  */
449
437
  findParentNode(node, nodeToFind) {
450
438
  if (node.ChildNodes.indexOf(nodeToFind) >= 0) {
@@ -459,30 +447,30 @@ export class SacFileBrowserCommon {
459
447
  return null;
460
448
  }
461
449
  /**
462
- * Sucht einen Node gem. einem URL Pfad
463
- * @param node Node in welchem gesucht werden soll
464
- * @param path Pfad nach welchem gesucht wird
465
- * @returns Node welcher zum gesuchten Pfad passt. Wenn kein Node gefunden wird, wird NULL zurückgegeben
450
+ * Finds a node according to a URL path
451
+ * @param node Node in which to search
452
+ * @param path Path to search for
453
+ * @returns Node matching the path. Returns NULL if not found
466
454
  */
467
455
  findSelectedNodeByPath(node, path) {
468
- // Cancel wenn Pfad nicht definiert
456
+ // Cancel if path is not defined
469
457
  if (path === undefined || path === null) {
470
458
  return null;
471
459
  }
472
- // Pfad in Array splitten und Root Foldername setzen
460
+ // Split path into array and set the root folder name
473
461
  const pathArray = path.split('/');
474
462
  pathArray[0] = this.rootNode.Name;
475
463
  return this.findSelectedNodeByPathArray(node, pathArray, 0);
476
464
  }
477
465
  /**
478
- * Sucht einen Node gem. einem Array von Node Namen
479
- * @param node Node in welchem gesucht werden soll
480
- * @param path Array von Node Namen, welche die Hirarchy des Pfades abbilden
481
- * @param index Aktueller Index im PATH Array
482
- * @returns Node wenn einer gefunden wurde, ansonsten NULL
466
+ * Finds a node based on an array of node names
467
+ * @param node Node in which to search
468
+ * @param path Array of node names representing the hierarchy of the path
469
+ * @param index Current index in the path array
470
+ * @returns Node if found, otherwise NULL
483
471
  */
484
472
  findSelectedNodeByPathArray(node, path, index) {
485
- // Check ob Ordner korrekt. Letzer Ordner zurückgeben. Path Last Index ist der Filename
473
+ // Check if folder is correct. Return the last folder. The last index in path is the filename
486
474
  if (node.Name === path[index] && path.length - 2 === index) {
487
475
  return node;
488
476
  }
@@ -499,8 +487,8 @@ export class SacFileBrowserCommon {
499
487
  return null;
500
488
  }
501
489
  /**
502
- * Rekursive Methode welche beim Node und all seinen Childs den Edit Mode beendet.
503
- * @param node Node bei welchem der Edit Mode beendet werden soll
490
+ * Recursive method that ends edit mode for the node and all its children.
491
+ * @param node Node for which edit mode should be ended
504
492
  */
505
493
  resetNodeEditMode(node) {
506
494
  if (node === null) {
@@ -514,7 +502,7 @@ export class SacFileBrowserCommon {
514
502
  }
515
503
  }
516
504
  /**
517
- * Setzt den Pfad in allen Nodes
505
+ * Sets the path in all nodes
518
506
  */
519
507
  setPathToAllNodes() {
520
508
  this.rootNode.ChildNodes.forEach((itm) => {
@@ -542,4 +530,4 @@ SacFileBrowserCommon.propDecorators = {
542
530
  selectedfile: [{ type: Input }],
543
531
  exitEditMode: [{ type: HostListener, args: ['document:click', ['$event.target'],] }]
544
532
  };
545
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJvd3Nlci5qcyIsInNvdXJjZVJvb3QiOiIvaG9tZS9ydW5uZXIvd29yay9zaW1wbGVhbmd1bGFyY29udHJvbHMvc2ltcGxlYW5ndWxhcmNvbnRyb2xzL2NoLmpuZXR3b3JrLnNhYy1jb250cm9scy9wcm9qZWN0cy9zYWMtY29tbW9uL3NyYy8iLCJzb3VyY2VzIjpbImNvbXBvbmVudHMvYnJvd3Nlci9icm93c2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNsRCxPQUFPLEVBQ0wsU0FBUyxFQUNULFlBQVksRUFDWixZQUFZLEVBQ1osUUFBUSxFQUNSLEtBQUssRUFFTCxNQUFNLEdBQ1AsTUFBTSxlQUFlLENBQUM7QUFNdkIsT0FBTyxFQUNMLGVBQWUsRUFDZix1QkFBdUIsRUFDdkIsd0JBQXdCLEVBQ3hCLHFCQUFxQixFQUNyQiw4QkFBOEIsR0FDL0IsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQ0wsc0JBQXNCLEVBQ3RCLDRCQUE0QixHQUM3QixNQUFNLHdDQUF3QyxDQUFDO0FBQ2hELE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBTXhGOztHQUVHO0FBRUgsTUFBTSxPQUFnQixvQkFBb0I7SUFvR3hDLHdCQUF3QjtJQUV4Qix1QkFBdUI7SUFFdkI7Ozs7T0FJRztJQUNILFlBQVksVUFBc0IsRUFBRSxRQUFrQjtRQWxHdEQ7O1dBRUc7UUFDSyxtQkFBYyxHQUFrQixJQUFJLENBQUM7UUFFN0M7OztXQUdHO1FBRUksaUJBQVksR0FBVyxFQUFFLENBQUM7UUFDakM7O1dBRUc7UUFFSSxvQkFBZSxHQUFZLElBQUksQ0FBQztRQUN2Qzs7V0FFRztRQUVJLG9CQUFlLEdBQVksSUFBSSxDQUFDO1FBQ3ZDOztXQUVHO1FBRUksb0JBQWUsR0FBWSxJQUFJLENBQUM7UUFDdkM7O1dBRUc7UUFFSSxzQkFBaUIsR0FBWSxJQUFJLENBQUM7UUFDekM7O1dBRUc7UUFFSSxzQkFBaUIsR0FBWSxJQUFJLENBQUM7UUFDekM7O1dBRUc7UUFFSSxzQkFBaUIsR0FBWSxJQUFJLENBQUM7UUFNekM7O1dBRUc7UUFFSSxTQUFJLEdBQXlCLElBQUksWUFBWSxFQUFVLENBQUM7UUFNL0Q7O1dBRUc7UUFDSSxhQUFRLEdBQWlCO1lBQzlCLElBQUksRUFBRSxFQUFFO1lBQ1IsVUFBVSxFQUFFLEVBQUU7WUFDZCxLQUFLLEVBQUUsRUFBRTtZQUNULFVBQVUsRUFBRSxJQUFJO1lBQ2hCLFVBQVUsRUFBRSxLQUFLO1lBQ2pCLFNBQVMsRUFBRSxLQUFLO1lBQ2hCLElBQUksRUFBRSxFQUFFO1NBQ1QsQ0FBQztRQUtGOztXQUVHO1FBQ0kscUJBQWdCLEdBQWlCLElBQUksQ0FBQztRQUM3Qzs7V0FFRztRQUNJLGlCQUFZLEdBQWlCLElBQUksQ0FBQztRQUN6Qzs7V0FFRztRQUNJLFlBQU8sR0FBYSxFQUFFLENBQUM7UUFnQjVCLElBQUksQ0FBQyxjQUFjLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FDaEMsc0JBQXNCLEVBQ3RCLElBQUksNEJBQTRCLENBQUMsVUFBVSxDQUFDLENBQzdDLENBQUM7UUFDRixJQUFJLENBQUMsb0JBQW9CLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FDdEMsd0JBQXdCLEVBQ3hCLElBQUksOEJBQThCLEVBQUUsQ0FDckMsQ0FBQztRQUNGLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxRQUFRLENBQUMsR0FBRyxDQUNwQyx1QkFBdUIsRUFDdkIsSUFBSSw2QkFBNkIsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsQ0FDN0QsQ0FBQztRQUVGLElBQUksQ0FBQyxXQUFXLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FDN0IsZUFBZSxFQUNmLElBQUkscUJBQXFCLEVBQUUsQ0FDNUIsQ0FBQztJQUNKLENBQUM7SUFFRCwwQkFBMEI7SUFFMUIscUNBQXFDO0lBRXJDOztPQUVHO0lBQ0gsSUFDVyxZQUFZLENBQUMsQ0FBZ0I7UUFDdEMsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFFbkUsSUFBSSxZQUFZLEtBQUssSUFBSSxFQUFFO1lBQ3pCLElBQUksQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUM7U0FDL0I7UUFFRCxJQUFJLENBQUMsY0FBYyxHQUFHLENBQUMsQ0FBQztJQUMxQixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsSUFBVyxVQUFVO1FBQ25CLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQywwQkFBMEIsQ0FBQztJQUNyRCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsSUFBVyxRQUFRO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyx3QkFBd0IsQ0FBQztJQUNuRCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsSUFBVyxtQkFBbUI7UUFDNUIsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLGdDQUFnQyxDQUFDO0lBQzNELENBQUM7SUFFRDs7O09BR0c7SUFDSCxJQUFXLGVBQWU7UUFDeEIsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLCtCQUErQixDQUFDO0lBQzFELENBQUM7SUFFRDs7O09BR0c7SUFDSCxJQUFXLGFBQWE7UUFDdEIsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLDZCQUE2QixDQUFDO0lBQ3hELENBQUM7SUFFRDs7O09BR0c7SUFDSCxJQUFXLGNBQWM7UUFDdkIsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLDhCQUE4QixDQUFDO0lBQ3pELENBQUM7SUFFRDs7O09BR0c7SUFDSCxJQUFXLFdBQVc7UUFDcEIsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLDJCQUEyQixDQUFDO0lBQ3RELENBQUM7SUFFRDs7T0FFRztJQUNILElBQVcsWUFBWTtRQUNyQixJQUFJLElBQUksQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQ2pELE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQztTQUMxQjthQUFNO1lBQ0wsT0FBTyxJQUFJLENBQUM7U0FDYjtJQUNILENBQUM7SUFFRCx3Q0FBd0M7SUFFeEMseUJBQXlCO0lBRXpCOztPQUVHO0lBS0ksWUFBWSxDQUFDLGFBQWE7UUFDL0IsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ3JCLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFFbkUsSUFDRSxDQUFDLElBQUksQ0FBQyxZQUFZO2dCQUNsQixJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksS0FBSyxJQUFJO2dCQUMvQixJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUNuQztnQkFDQSxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2FBQ3hDO1NBQ0Y7UUFFRCxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDL0IsQ0FBQztJQUVEOzs7T0FHRztJQUNJLFVBQVUsQ0FBQyxJQUFrQjtRQUNsQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUU7WUFDakQsSUFBSSxPQUFPLEVBQUU7Z0JBQ1gsSUFBSSxDQUFDLGNBQWM7cUJBQ2hCLFVBQVUsQ0FDVCxJQUFJLENBQUMsTUFBTSxFQUNYLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsUUFBUSxFQUM1QyxJQUFJLENBQUMsWUFBWSxDQUNsQjtxQkFDQSxTQUFTLENBQUMsQ0FBQyxNQUE0QixFQUFFLEVBQUU7b0JBQzFDLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUM7Z0JBQ3pDLENBQUMsQ0FBQyxDQUFDO2FBQ047UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7O09BR0c7SUFDSSxVQUFVLENBQUMsSUFBa0I7UUFDbEMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFO1lBQ2pELElBQUksT0FBTyxFQUFFO2dCQUNYLElBQUksQ0FBQyxjQUFjO3FCQUNoQixVQUFVLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDO3FCQUNsQyxTQUFTLENBQUMsQ0FBQyxNQUE0QixFQUFFLEVBQUU7b0JBQzFDLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQztvQkFDNUQsVUFBVSxDQUFDLFVBQVUsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQztvQkFFL0MsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7d0JBQ3ZDLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDO29CQUN6QixDQUFDLENBQUMsQ0FBQztvQkFFSCxJQUFJLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2dCQUM5QixDQUFDLENBQUMsQ0FBQzthQUNOO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksUUFBUSxDQUFDLElBQWtCO1FBQ2hDLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO0lBQ3pCLENBQUM7SUFFRDs7O09BR0c7SUFDSSxRQUFRLENBQUMsSUFBa0I7UUFDaEMsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7SUFDekIsQ0FBQztJQUVEOzs7T0FHRztJQUNJLE9BQU8sQ0FBQyxJQUFrQjtRQUMvQixNQUFNLElBQUksR0FBaUI7WUFDekIsVUFBVSxFQUFFLEVBQUU7WUFDZCxLQUFLLEVBQUUsRUFBRTtZQUNULFVBQVUsRUFBRSxLQUFLO1lBQ2pCLFVBQVUsRUFBRSxLQUFLO1lBQ2pCLElBQUksRUFBRSxFQUFFO1lBQ1IsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO1lBQ2YsU0FBUyxFQUFFLElBQUk7U0FDaEIsQ0FBQztRQUVGLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzNCLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN0QixDQUFDO0lBRUQ7O09BRUc7SUFDSSxRQUFRO1FBQ2IsSUFBSSxDQUFDLGNBQWM7YUFDaEIsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsRUFBRSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUM7YUFDM0MsU0FBUyxDQUFDLENBQUMsTUFBNEIsRUFBRSxFQUFFO1lBQzFDLElBQUksQ0FBQyxRQUFRLEdBQUc7Z0JBQ2QsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSTtnQkFDdEIsS0FBSyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSztnQkFDeEIsVUFBVSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVTtnQkFDbEMsVUFBVSxFQUFFLElBQUk7Z0JBQ2hCLFVBQVUsRUFBRSxLQUFLO2dCQUNqQixTQUFTLEVBQUUsS0FBSztnQkFDaEIsSUFBSSxFQUFFLEdBQUc7YUFDVixDQUFDO1lBRUYsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDekIsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO1lBRWxDLG1HQUFtRztZQUNuRyxJQUFJLElBQUksQ0FBQyxjQUFjLEtBQUssSUFBSSxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtnQkFDbEUsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDO2FBQ3pDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQ7O09BRUc7SUFDSSxXQUFXLENBQUMsSUFBa0I7UUFDbkMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUU7WUFDcEIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDO1NBQzdCO1FBRUQsSUFBSSxDQUFDLGNBQWM7YUFDaEIsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDO2FBQ2xELFNBQVMsQ0FBQyxDQUFDLE1BQTRCLEVBQUUsRUFBRTtZQUMxQyxJQUFJLENBQUMsVUFBVSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDO1lBQ3pDLElBQUksQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7WUFFL0IsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDM0IsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLFVBQVUsQ0FBQyxJQUFrQixFQUFFLFdBQW1CO1FBQ3ZELElBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDO1FBRXhCLElBQUksQ0FBQyxXQUFXLElBQUksV0FBVyxLQUFLLElBQUksSUFBSSxXQUFXLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUNwRSwyQkFBMkI7WUFDM0IsT0FBTztTQUNSO1FBRUQsSUFBSSxJQUFJLENBQUMsUUFBUSxLQUFLLFdBQVcsRUFBRTtZQUNqQyxJQUFJLENBQUMsY0FBYztpQkFDaEIsVUFBVSxDQUNULElBQUksQ0FBQyxNQUFNLEVBQ1gsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQzVDLFdBQVcsRUFDWCxJQUFJLENBQUMsWUFBWSxDQUNsQjtpQkFDQSxTQUFTLENBQUMsQ0FBQyxNQUE0QixFQUFFLEVBQUU7Z0JBQzFDLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUM7WUFDekMsQ0FBQyxDQUFDLENBQUM7U0FDTjtJQUNILENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksVUFBVSxDQUFDLElBQWtCLEVBQUUsYUFBcUI7UUFDekQsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7UUFFeEIsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFDbkIsSUFDRSxDQUFDLGFBQWE7Z0JBQ2QsYUFBYSxLQUFLLElBQUk7Z0JBQ3RCLGFBQWEsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUMxQjtnQkFDQSxvQ0FBb0M7Z0JBQ3BDLE9BQU87YUFDUjtZQUVELElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxhQUFhLEVBQUU7Z0JBQy9CLElBQUksQ0FBQyxjQUFjO3FCQUNoQixVQUFVLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLGFBQWEsQ0FBQztxQkFDakQsU0FBUyxDQUFDLENBQUMsTUFBNEIsRUFBRSxFQUFFO29CQUMxQyxJQUFJLENBQUMsSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO29CQUU3QixJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztnQkFDM0IsQ0FBQyxDQUFDLENBQUM7YUFDTjtTQUNGO2FBQU07WUFDTCxJQUNFLENBQUMsYUFBYTtnQkFDZCxhQUFhLEtBQUssSUFBSTtnQkFDdEIsYUFBYSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQzFCO2dCQUNBLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQ3ZDLE9BQU87YUFDUjtZQUVELElBQUksQ0FBQyxJQUFJLEdBQUcsYUFBYSxDQUFDO1lBQzFCLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxjQUFjO2lCQUNoQixRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLGFBQWEsQ0FBQztpQkFDL0MsU0FBUyxDQUFDLENBQUMsTUFBNEIsRUFBRSxFQUFFO2dCQUMxQyxJQUFJLENBQUMsSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO2dCQUM3QixJQUFJLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDO2dCQUUvQixJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZQUMzQixDQUFDLENBQUMsQ0FBQztTQUNOO0lBQ0gsQ0FBQztJQUVEOzs7T0FHRztJQUNJLFVBQVUsQ0FBQyxJQUFrQjtRQUNsQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUNwQixJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO1NBQ3BFO1FBRUQsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUN6QyxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO1NBQ2xFO2FBQU07WUFDTCxJQUFJLENBQUMsWUFBWSxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO1NBQ3pDO1FBRUQsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQztRQUM3QixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDcEMsQ0FBQztJQUVEOzs7T0FHRztJQUNJLFVBQVUsQ0FBQyxJQUFrQjtRQUNsQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUNwQixJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDN0I7UUFFRCxtQ0FBbUM7UUFDbkMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBRTdCLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFO1lBQ2YsSUFBSSxDQUFDLGNBQWM7aUJBQ2hCLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQztpQkFDbkQsU0FBUyxDQUFDLENBQUMsTUFBNEIsRUFBRSxFQUFFO2dCQUMxQyxJQUFJLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUM7Z0JBQzFCLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO2dCQUV6QixJQUFJLElBQUksQ0FBQyxjQUFjLEtBQUssSUFBSSxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtvQkFDbEUsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQzVDLElBQUksQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FDekMsQ0FBQztvQkFDRixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLFFBQVEsS0FBSyxRQUFRLENBQUMsQ0FBQztvQkFDakUsSUFBSSxJQUFJLEVBQUU7d0JBQ1IsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztxQkFDdkI7aUJBQ0Y7WUFDSCxDQUFDLENBQUMsQ0FBQztTQUNOO2FBQU07WUFDTCxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztTQUMxQjtJQUNILENBQUM7SUFFRDs7O09BR0c7SUFDSSxnQkFBZ0IsQ0FBQyxJQUFrQjtRQUN4QyxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUU7WUFDbkIsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7U0FDekI7YUFBTTtZQUNMLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO1NBQ3hCO0lBQ0gsQ0FBQztJQUVEOzs7T0FHRztJQUNJLGNBQWMsQ0FBQyxJQUFrQixFQUFFLFlBQXNCO1FBQzlELElBQUksWUFBWSxLQUFLLElBQUksRUFBRTtZQUN6QixZQUFZLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUU7Z0JBQy9CLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFO29CQUNyQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztpQkFDNUI7WUFDSCxDQUFDLENBQUMsQ0FBQztTQUNKO1FBRUQsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUM5QixJQUFJLEVBQUUsRUFBRTtZQUNOLElBQUksQ0FBQyxjQUFjO2lCQUNoQixRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDO2lCQUN2RCxTQUFTLENBQUMsQ0FBQyxNQUE0QixFQUFFLEVBQUU7Z0JBQzFDLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUM7Z0JBQ3ZDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUM3QixDQUFDLENBQUMsQ0FBQztTQUNOO0lBQ0gsQ0FBQztJQXlCRCxxQ0FBcUM7SUFFckMsMEJBQTBCO0lBRTFCOzs7T0FHRztJQUNLLGtCQUFrQixDQUFDLElBQWtCO1FBQzNDLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7WUFDOUIsSUFBSSxHQUFHLENBQUMsU0FBUyxFQUFFO2dCQUNqQixJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO2FBQ3REO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDakUsQ0FBQztJQUVEOzs7O09BSUc7SUFDSyxRQUFRLENBQUMsSUFBa0IsRUFBRSxVQUFrQjtRQUNyRCxJQUFJLENBQUMsSUFBSSxHQUFHLFVBQVUsR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztRQUN6QyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO1lBQzlCLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNoQyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNLLGNBQWMsQ0FDcEIsSUFBa0IsRUFDbEIsVUFBd0I7UUFFeEIsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDNUMsT0FBTyxJQUFJLENBQUM7U0FDYjtRQUVELEtBQUssTUFBTSxLQUFLLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUNuQyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssRUFBRSxVQUFVLENBQUMsQ0FBQztZQUN0RCxJQUFJLE1BQU0sS0FBSyxJQUFJLEVBQUU7Z0JBQ25CLE9BQU8sTUFBTSxDQUFDO2FBQ2Y7U0FDRjtRQUVELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ssc0JBQXNCLENBQzVCLElBQWtCLEVBQ2xCLElBQVk7UUFFWixtQ0FBbUM7UUFDbkMsSUFBSSxJQUFJLEtBQUssU0FBUyxJQUFJLElBQUksS0FBSyxJQUFJLEVBQUU7WUFDdkMsT0FBTyxJQUFJLENBQUM7U0FDYjtRQUVELG9EQUFvRDtRQUNwRCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2xDLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQztRQUVsQyxPQUFPLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzlELENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSywyQkFBMkIsQ0FDakMsSUFBa0IsRUFDbEIsSUFBYyxFQUNkLEtBQWE7UUFFYix1RkFBdUY7UUFDdkYsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsS0FBSyxLQUFLLEVBQUU7WUFDMUQsT0FBTyxJQUFJLENBQUM7U0FDYjthQUFNLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDcEMsY0FBYztZQUNkLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO1lBQ3ZCLEtBQUssTUFBTSxJQUFJLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRTtnQkFDbEMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLDJCQUEyQixDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUV2RSxJQUFJLE1BQU0sS0FBSyxJQUFJLEVBQUU7b0JBQ25CLE9BQU8sTUFBTSxDQUFDO2lCQUNmO2FBQ0Y7U0FDRjtRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVEOzs7T0FHRztJQUNLLGlCQUFpQixDQUFDLElBQWtCO1FBQzFDLElBQUksSUFBSSxLQUFLLElBQUksRUFBRTtZQUNqQixJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1NBQ3ZDO2FBQU07WUFDTCxJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQztZQUV4QixJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUU7Z0JBQ25CLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQzthQUMvRDtTQUNGO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0ssaUJBQWlCO1FBQ3ZCLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO1lBQ3ZDLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3pCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs7O1lBM3FCRixTQUFTOzs7WUFuQ0QsVUFBVTtZQUtqQixRQUFROzs7MkJBbURQLEtBQUs7OEJBS0wsS0FBSzs4QkFLTCxLQUFLOzhCQUtMLEtBQUs7Z0NBS0wsS0FBSztnQ0FLTCxLQUFLO2dDQUtMLEtBQUs7cUJBS0wsS0FBSzttQkFLTCxNQUFNOzJCQTRFTixLQUFLOzJCQXFGTCxZQUFZLFNBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxlQUFlLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHtcbiAgRGlyZWN0aXZlLFxuICBFdmVudEVtaXR0ZXIsXG4gIEhvc3RMaXN0ZW5lcixcbiAgSW5qZWN0b3IsXG4gIElucHV0LFxuICBPbkluaXQsXG4gIE91dHB1dCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBJU2FjRmlsZUJyb3dzZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9JU2FjRmlsZUJyb3dzZXJTZXJ2aWNlJztcbmltcG9ydCB7IElTYWNJY29uU2VydmljZSB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvSVNhY0ljb25TZXJ2aWNlJztcbmltcG9ydCB7IElTYWNMb2NhbGlzYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9JU2FjTG9jYWxpc2F0aW9uU2VydmljZSc7XG5pbXBvcnQgeyBJU2FjVmFsaWRhdGlvbktleVNlcnZpY2UgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL0lTYWNWYWxpZGF0aW9uS2V5U2VydmljZSc7XG5pbXBvcnQge1xuICBTQUNJQ09OX1NFUlZJQ0UsXG4gIFNBQ0xPQ0FMSVNBVElPTl9TRVJWSUNFLFxuICBTQUNWQUxJREFUSU9OS0VZX1NFUlZJQ0UsXG4gIFNhY0RlZmF1bHRJY29uU2VydmljZSxcbiAgU2FjRGVmYXVsdFZhbGlkYXRpb25LZXlTZXJ2aWNlLFxufSBmcm9tICcuLi8uLi9zZXJ2aWNlcyc7XG5pbXBvcnQge1xuICBTQUNGSUxFQlJPV1NFUl9TRVJWSUNFLFxuICBTYWNEZWZhdWx0RmlsZUJyb3dzZXJTZXJ2aWNlLFxufSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9zYWMtZmlsZWJyb3dzZXIuc2VydmljZSc7XG5pbXBvcnQgeyBTYWNEZWZhdWx0TG9jYWxpc2F0aW9uU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3NhYy1sb2NhbGlzYXRpb24uc2VydmljZSc7XG5pbXBvcnQgeyBJQnJvd3NlckZpbGUgfSBmcm9tICcuL21vZGVscy9icm93c2VyZmlsZSc7XG5pbXBvcnQgeyBJQnJvd3NlckZpbGVSZXNwb25zZSB9IGZyb20gJy4vbW9kZWxzL2Jyb3dzZXJmaWxlcmVzcG9uc2UnO1xuaW1wb3J0IHsgSUJyb3dzZXJOb2RlIH0gZnJvbSAnLi9tb2RlbHMvYnJvd3Nlcm5vZGUnO1xuaW1wb3J0IHsgSUJyb3dzZXJOb2RlUmVzcG9uc2UgfSBmcm9tICcuL21vZGVscy9icm93c2Vybm9kZXJlc3BvbnNlJztcblxuLyoqXG4gKiBCYXNlIENvbXBvbmVudCBmw7xyIEZpbGUgQnJvd3NlclxuICovXG5ARGlyZWN0aXZlKClcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBTYWNGaWxlQnJvd3NlckNvbW1vbiBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIC8vICNyZWdpb24gUHJvcGVydGllc1xuXG4gIC8qKlxuICAgKiBTZXJ2aWNlIGbDvHIgRmlsZSBCcm93c2VyIFp1Z3JpZmYgKEJhY2tlbmQpXG4gICAqL1xuICBwcml2YXRlIGJyb3dzZXJTZXJ2aWNlOiBJU2FjRmlsZUJyb3dzZXJTZXJ2aWNlO1xuICAvKipcbiAgICogSWNvbiBzZXJ2aWNlIHRvIHJlY2VpdmUgaWNvbiBjbGFzc2VzIGZvciB1aVxuICAgKi9cbiAgcHJpdmF0ZSBpY29uU2VydmljZTogSVNhY0ljb25TZXJ2aWNlO1xuICAvKipcbiAgICogRmlsZSB3ZWxjaGVzIGJlaW0gc3RhcnRlbiBkZXMgQnJvd3NlcnMgYmVyZWl0cyBzZWxla3RpZXJ0IGlzdFxuICAgKi9cbiAgcHJpdmF0ZSBwcmVzZWxlY2VkZmlsZTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqXG4gICAqIEVybGF1YnRlIERhdGVpZXJ3ZWl0ZXJ1bmdlbiBmw7xyIEZpbGVhdXN3YWhsIHVuZCBVcGxvYWQuIERhdGVpZXJ3ZWl0ZXJ1bmcgbWl0IFB1bmt0IHVuZFxuICAgKiBnZXRyZW5udCBkdXJjaCBLb21tYSBmw7xyIG1laHIgYWxzIGVpbmUgRXJ3ZWl0ZXJ1bmcgKEV4YW1wbGU6IFwiLmpwZywuZ2lmXCIpXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgYWxsb3dlZHR5cGVzOiBzdHJpbmcgPSAnJztcbiAgLyoqXG4gICAqIEVybGF1YnQgZGFzIGzDtnNjaGVuIGVpbmVyIERhdGVpXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgYWxsb3dmaWxlZGVsZXRlOiBib29sZWFuID0gdHJ1ZTtcbiAgLyoqXG4gICAqIEVybGF1YnQgZGFzIHVtYmVuZW5uZW4gZWluZXIgRGF0ZWlcbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBhbGxvd2ZpbGVyZW5hbWU6IGJvb2xlYW4gPSB0cnVlO1xuICAvKipcbiAgICogRXJsYXVidCBkZW4gVXBsb2FkIHZvbiBEYXRlaWVuXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgYWxsb3dmaWxldXBsb2FkOiBib29sZWFuID0gdHJ1ZTtcbiAgLyoqXG4gICAqIEVybGF1YnQgZGFzIGVyc3RlbGxlbiBlaW5lcyBuZXVlbiBPcmRuZXJzXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgYWxsb3dmb2xkZXJjcmVhdGU6IGJvb2xlYW4gPSB0cnVlO1xuICAvKipcbiAgICogRXJsYXVidCBkYXMgbMO2c2NoZW4gZWluZXMgT3JkbmVyc1xuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIGFsbG93Zm9sZGVyZGVsZXRlOiBib29sZWFuID0gdHJ1ZTtcbiAgLyoqXG4gICAqIEVybGF1YnQgZGFzIFVtYmVuZW5uZW4gZWluZXMgT3JkbmVyc1xuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIGFsbG93Zm9sZGVycmVuYW1lOiBib29sZWFuID0gdHJ1ZTtcbiAgLyoqXG4gICAqIFVSTCBmw7xyIEJhY2tlbmQgQVBJXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgYXBpdXJsOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBPdXRwdXQgRW1pdHRlciB3ZW5uIEZpbGUgc2VsZWt0aWVydCB3aXJkLlxuICAgKi9cbiAgQE91dHB1dCgpXG4gIHB1YmxpYyBmaWxlOiBFdmVudEVtaXR0ZXI8c3RyaW5nPiA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuXG4gIC8qKlxuICAgKiBTZXJ2aWNlIGbDvHIgRXJyb3IgTG9jYWxpc2F0aW9uXG4gICAqL1xuICBwdWJsaWMgbG5nUmVzb3VyY2VTZXJ2aWNlOiBJU2FjTG9jYWxpc2F0aW9uU2VydmljZTtcbiAgLyoqXG4gICAqIFJvb3QgTm9kZSBJdGVtIGbDvHIgVHJlZVxuICAgKi9cbiAgcHVibGljIHJvb3ROb2RlOiBJQnJvd3Nlck5vZGUgPSB7XG4gICAgTmFtZTogJycsXG4gICAgQ2hpbGROb2RlczogW10sXG4gICAgRmlsZXM6IFtdLFxuICAgIElzRXhwYW5kZWQ6IHRydWUsXG4gICAgSXNFZGl0TW9kZTogZmFsc2UsXG4gICAgSXNOZXdOb2RlOiBmYWxzZSxcbiAgICBQYXRoOiAnJyxcbiAgfTtcbiAgLyoqXG4gICAqIFNlbGVjdGVkIEZpbGUgTmFtZVxuICAgKi9cbiAgcHVibGljIHNlbGVjdGVkRmlsZTogc3RyaW5nO1xuICAvKipcbiAgICogU2VsZWN0ZWQgRmlsZSBJdGVtXG4gICAqL1xuICBwdWJsaWMgc2VsZWN0ZWRGaWxlSXRlbTogSUJyb3dzZXJGaWxlID0gbnVsbDtcbiAgLyoqXG4gICAqIFNlbGVjdGVkIE5vZGUgSXRlbVxuICAgKi9cbiAgcHVibGljIHNlbGVjdGVkTm9kZTogSUJyb3dzZXJOb2RlID0gbnVsbDtcbiAgLyoqXG4gICAqIExpc3RlIHZvbiBVcGxvYWRzXG4gICAqL1xuICBwdWJsaWMgdXBsb2Fkczogc3RyaW5nW10gPSBbXTtcbiAgLyoqXG4gICAqIFNlcnZpY2UgdG8gcmVjZWl2ZSBzdGFuZGFyZCB2YWxpZGF0aW9uIG1lc3NhZ2Uga2V5cyBhbmQgdGV4dHNcbiAgICovXG4gIHB1YmxpYyB2YWxpZGF0aW9uS2V5U2VydmljZTogSVNhY1ZhbGlkYXRpb25LZXlTZXJ2aWNlO1xuXG4gIC8vICNlbmRyZWdpb24gUHJvcGVydGllc1xuXG4gIC8vICNyZWdpb24gQ29uc3RydWN0b3JzXG5cbiAgLyoqXG4gICAqIEtvbnN0cnVrdG9yXG4gICAqIEBwYXJhbSBodHRwY2xpZW50IEFuZ3VsYXIgSFRUUCBDbGllbnRcbiAgICogQHBhcmFtIGluamVjdG9yIFNlcnZpY2UgSW5qZWN0b3JcbiAgICovXG4gIGNvbnN0cnVjdG9yKGh0dHBjbGllbnQ6IEh0dHBDbGllbnQsIGluamVjdG9yOiBJbmplY3Rvcikge1xuICAgIHRoaXMuYnJvd3NlclNlcnZpY2UgPSBpbmplY3Rvci5nZXQoXG4gICAgICBTQUNGSUxFQlJPV1NFUl9TRVJWSUNFLFxuICAgICAgbmV3IFNhY0RlZmF1bHRGaWxlQnJvd3NlclNlcnZpY2UoaHR0cGNsaWVudClcbiAgICApO1xuICAgIHRoaXMudmFsaWRhdGlvbktleVNlcnZpY2UgPSBpbmplY3Rvci5nZXQoXG4gICAgICBTQUNWQUxJREFUSU9OS0VZX1NFUlZJQ0UsXG4gICAgICBuZXcgU2FjRGVmYXVsdFZhbGlkYXRpb25LZXlTZXJ2aWNlKClcbiAgICApO1xuICAgIHRoaXMubG5nUmVzb3VyY2VTZXJ2aWNlID0gaW5qZWN0b3IuZ2V0KFxuICAgICAgU0FDTE9DQUxJU0FUSU9OX1NFUlZJQ0UsXG4gICAgICBuZXcgU2FjRGVmYXVsdExvY2FsaXNhdGlvblNlcnZpY2UodGhpcy52YWxpZGF0aW9uS2V5U2VydmljZSlcbiAgICApO1xuXG4gICAgdGhpcy5pY29uU2VydmljZSA9IGluamVjdG9yLmdldChcbiAgICAgIFNBQ0lDT05fU0VSVklDRSxcbiAgICAgIG5ldyBTYWNEZWZhdWx0SWNvblNlcnZpY2UoKVxuICAgICk7XG4gIH1cblxuICAvLyAjZW5kcmVnaW9uIENvbnN0cnVjdG9yc1xuXG4gIC8vICNyZWdpb24gUHVibGljIEdldHRlcnMgQW5kIFNldHRlcnNcblxuICAvKipcbiAgICogU2V0enQgZGVuIFNlbGVjZWQgTm9kZSDDvGJlciBkZW4gUGZhZFxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIHNldCBzZWxlY3RlZGZpbGUodjogc3RyaW5nIHwgbnVsbCkge1xuICAgIGNvbnN0IHNlbGVjdGVkbm9kZSA9IHRoaXMuZmluZFNlbGVjdGVkTm9kZUJ5UGF0aCh0aGlzLnJvb3ROb2RlLCB2KTtcblxuICAgIGlmIChzZWxlY3RlZG5vZGUgIT09IG51bGwpIHtcbiAgICAgIHRoaXMuc2VsZWN0Tm9kZShzZWxlY3RlZG5vZGUpO1xuICAgIH1cblxuICAgIHRoaXMucHJlc2VsZWNlZGZpbGUgPSB2O1xuICB9XG5cbiAgLyoqXG4gICAqIENTUyBpY29uIGNsYXNzIGZvciBkZWxldGUgaWNvblxuICAgKiBAcmV0dXJucyBjc3MgY2xhc3Mgd2l0aCBpY29uXG4gICAqL1xuICBwdWJsaWMgZ2V0IGljb25EZWxldGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5pY29uU2VydmljZS5Ccm93c2VyQ29tcG9uZW50RGVsZXRlSWNvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBDU1MgaWNvbiBjbGFzcyBmb3IgZWRpdCBpY29uXG4gICAqIEByZXR1cm5zIGNzcyBjbGFzcyB3aXRoIGljb25cbiAgICovXG4gIHB1YmxpYyBnZXQgaWNvbkVkaXQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5pY29uU2VydmljZS5Ccm93c2VyQ29tcG9uZW50RWRpdEljb247XG4gIH1cblxuICAvKipcbiAgICogQ1NTIGljb24gZm9yIGZvbGRlcnMgaW4gdHJlZSB0aGVyZSBhcmUgY29sbGFic2VkXG4gICAqIEByZXR1cm5zIGNzcyBjbGFzcyB3aXRoIGljb25cbiAgICovXG4gIHB1YmxpYyBnZXQgaWNvbkZvbGRlckNvbGxhYnNlZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmljb25TZXJ2aWNlLkJyb3dzZXJDb21wb25lbnRGb2xkZXJDbG9zZWRJY29uO1xuICB9XG5cbiAgLyoqXG4gICAqIENTUyBpY29uIGNsYXNzIGZvciBmb2xkZXJzIHdpdGhvdXQgc3ViZm9sZGVyc1xuICAgKiBAcmV0dXJucyBjc3MgY2xhc3Mgd2l0aCBpY29uXG4gICAqL1xuICBwdWJsaWMgZ2V0IGljb25Gb2xkZXJFbXB0eSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmljb25TZXJ2aWNlLkJyb3dzZXJDb21wb25lbnRGb2xkZXJFbXB0eUljb247XG4gIH1cblxuICAvKipcbiAgICogQ1NTIGljb24gZm9yIG5ldyBmb2xkZXJzIGFjdGlvblxuICAgKiBAcmV0dXJucyBjc3MgY2xhc3Mgd2l0aCBpY29uXG4gICAqL1xuICBwdWJsaWMgZ2V0IGljb25Gb2xkZXJOZXcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5pY29uU2VydmljZS5Ccm93c2VyQ29tcG9uZW50Rm9sZGVyTmV3SWNvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBDU1MgaWNvbiBmb3IgZm9sZGVycyBpbiB0cmVlIHRoZXJlIGFyZSBleHBhbmRlZFxuICAgKiBAcmV0dXJucyBjc3MgY2xhc3Mgd2l0aCBpY29uXG4gICAqL1xuICBwdWJsaWMgZ2V0IGljb25Gb2xkZXJPcGVuKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuaWNvblNlcnZpY2UuQnJvd3NlckNvbXBvbmVudEZvbGRlck9wZW5JY29uO1xuICB9XG5cbiAgLyoqXG4gICAqIENTUyBpY29uIGNsYXNzIGZvciByZWZyZXNoIGljb25cbiAgICogQHJldHVybnMgY3NzIGNsYXNzIHdpdGggaWNvblxuICAgKi9cbiAgcHVibGljIGdldCBpY29uUmVmcmVzaCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmljb25TZXJ2aWNlLkJyb3dzZXJDb21wb25lbnRSZWZyZXNoSWNvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXR0ZXIgZsO8ciBTZWxlY3RlZCBGaWxlLiBJc3QgYW4gSW5wdXQgUHJvcGVydHkgZ2VidW5kZW5cbiAgICovXG4gIHB1YmxpYyBnZXQgc2VsZWN0ZWRmaWxlKCk6IHN0cmluZyB8IG51bGwge1xuICAgIGlmICh0aGlzLnNlbGVjdEZpbGUgJiYgdGhpcy5zZWxlY3RGaWxlLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiB0aGlzLnNlbGVjdGVkRmlsZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgLy8gI2VuZHJlZ2lvbiBQdWJsaWMgR2V0dGVycyBBbmQgU2V0dGVyc1xuXG4gIC8vICNyZWdpb24gUHVibGljIE1ldGhvZHNcblxuICAvKipcbiAgICogSG9zdExpc3RlbmVyIHdlbGNoZXIgZGVuIEVkaXQgTW9kZSBiZWkgYWxsZW4gRmlsZXMgdW5kIE5vZGVzIGJlZW5kZXQuXG4gICAqL1xuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDpjbGljaycsIFsnJGV2ZW50LnRhcmdldCddKVxuICAvKipcbiAgICogQ2xpY2sgRXZlbnRcbiAgICovXG4gIHB1YmxpYyBleGl0RWRpdE1vZGUodGFyZ2V0RWxlbWVudCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnNlbGVjdGVkTm9kZSkge1xuICAgICAgdGhpcy5zZWxlY3RlZE5vZGUuRmlsZXMuZm9yRWFjaCgoaXRtKSA9PiAoaXRtLklzRWRpdE1vZGUgPSBmYWxzZSkpO1xuXG4gICAgICBpZiAoXG4gICAgICAgICF0aGlzLnNlbGVjdGVkTm9kZSB8fFxuICAgICAgICB0aGlzLnNlbGVjdGVkTm9kZS5OYW1lID09PSBudWxsIHx8XG4gICAgICAgIHRoaXMuc2VsZWN0ZWROb2RlLk5hbWUubGVuZ3RoID09PSAwXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5jbGVhck5ld0NoaWxkTm9kZXModGhpcy5yb290Tm9kZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5yZXNldE5vZGVFZGl0TW9kZShudWxsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMw7ZzY2h0IGVpbiBGaWxlXG4gICAqIEBwYXJhbSBmaWxlIEZpbGUgd2VsY2hlcyBnZWzDtnNjaHQgd2VyZGVuIHNvbGxcbiAgICovXG4gIHB1YmxpYyBkZWxldGVGaWxlKGZpbGU6IElCcm93c2VyRmlsZSk6IHZvaWQge1xuICAgIHRoaXMuY29uZmlybURlbGV0ZUZpbGUoZmlsZSkuc3Vic2NyaWJlKChjb25maXJtKSA9PiB7XG4gICAgICBpZiAoY29uZmlybSkge1xuICAgICAgICB0aGlzLmJyb3dzZXJTZXJ2aWNlXG4gICAgICAgICAgLkRlbGV0ZUZpbGUoXG4gICAgICAgICAgICB0aGlzLmFwaXVybCxcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWROb2RlLlBhdGggKyAnLycgKyBmaWxlLkZpbGVuYW1lLFxuICAgICAgICAgICAgdGhpcy5hbGxvd2VkdHlwZXNcbiAgICAgICAgICApXG4gICAgICAgICAgLnN1YnNjcmliZSgocmVzdWx0OiBJQnJvd3NlckZpbGVSZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZE5vZGUuRmlsZXMgPSByZXN1bHQuRmlsZXM7XG4gICAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogTMO2c2NodCBlaW5lbiBOb2RlXG4gICAqIEBwYXJhbSBub2RlIE5vZGUgd2VsY2hlciBnZWzDtnNjaHQgd2VyZGVuIHNvbGxcbiAgICovXG4gIHB1YmxpYyBkZWxldGVOb2RlKG5vZGU6IElCcm93c2VyTm9kZSk6IHZvaWQge1xuICAgIHRoaXMuY29uZmlybURlbGV0ZU5vZGUobm9kZSkuc3Vic2NyaWJlKChjb25maXJtKSA9PiB7XG4gICAgICBpZiAoY29uZmlybSkge1xuICAgICAgICB0aGlzLmJyb3dzZXJTZXJ2aWNlXG4gICAgICAgICAgLkRlbGV0ZU5vZGUodGhpcy5hcGl1cmwsIG5vZGUuUGF0aClcbiAgICAgICAgICAuc3Vic2NyaWJlKChyZXN1bHQ6IElCcm93c2VyTm9kZVJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBwYXJlbnROb2RlID0gdGhpcy5maW5kUGFyZW50Tm9kZSh0aGlzLnJvb3ROb2RlLCBub2RlKTtcbiAgICAgICAgICAgIHBhcmVudE5vZGUuQ2hpbGROb2RlcyA9IHJlc3VsdC5Ob2RlLkNoaWxkTm9kZXM7XG5cbiAgICAgICAgICAgIHRoaXMucm9vdE5vZGUuQ2hpbGROb2Rlcy5mb3JFYWNoKChpdG0pID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5maWxsUGF0aChpdG0sICcnKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB0aGlzLnNlbGVjdE5vZGUocGFyZW50Tm9kZSk7XG4gICAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogU2V0enQgZWluIEZpbGUgaW4gZGVuIEVkaXQgTW9kZVxuICAgKiBAcGFyYW0gZmlsZSBGaWxlIHdlbGNoZXMgaW4gZGVuIEVkaXQgTW9kZSBnZXNldHp0IHdlcmRlbiBzb2xsXG4gICAqL1xuICBwdWJsaWMgZWRpdEZpbGUoZmlsZTogSUJyb3dzZXJGaWxlKTogdm9pZCB7XG4gICAgZmlsZS5Jc0VkaXRNb2RlID0gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR6dCBlaW5lbiBOb2RlIGluIGRlbiBFZGl0IE1vZGVcbiAgICogQHBhcmFtIG5vZGUgTm9kZSB3ZWxjaGVyIGJlYXJiZWl0ZXQgd2VyZGVuIHNvbGxcbiAgICovXG4gIHB1YmxpYyBlZGl0Tm9kZShub2RlOiBJQnJvd3Nlck5vZGUpOiB2b2lkIHtcbiAgICBub2RlLklzRWRpdE1vZGUgPSB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEVyemV1Z3QgZWluZW4gbmV1ZW4gTm9kZSBpbSBUcmVlXG4gICAqIEBwYXJhbSBub2RlIE5vZGUgdW50ZXIgd2VsY2hlbSBlaW4gbmV1ZXIgTm9kZSBlcnN0ZWxsdCB3ZXJkZW4gc29sbFxuICAgKi9cbiAgcHVibGljIG5ld05vZGUobm9kZTogSUJyb3dzZXJOb2RlKSB7XG4gICAgY29uc3QgaXRlbTogSUJyb3dzZXJOb2RlID0ge1xuICAgICAgQ2hpbGROb2RlczogW10sXG4gICAgICBGaWxlczogW10sXG4gICAgICBJc0VkaXRNb2RlOiBmYWxzZSxcbiAgICAgIElzRXhwYW5kZWQ6IGZhbHNlLFxuICAgICAgTmFtZTogJycsXG4gICAgICBQYXRoOiBub2RlLlBhdGgsXG4gICAgICBJc05ld05vZGU6IHRydWUsXG4gICAgfTtcblxuICAgIG5vZGUuQ2hpbGROb2Rlcy5wdXNoKGl0ZW0pO1xuICAgIHRoaXMuc2VsZWN0Tm9kZShpdGVtKTtcbiAgICB0aGlzLmVkaXROb2RlKGl0ZW0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXQgRXZlbnQgZGVyIEtvbXBvbmVudGVcbiAgICovXG4gIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmJyb3dzZXJTZXJ2aWNlXG4gICAgICAuR2V0Tm9kZSh0aGlzLmFwaXVybCwgJycsIHRoaXMuYWxsb3dlZHR5cGVzKVxuICAgICAgLnN1YnNjcmliZSgocmVzdWx0OiBJQnJvd3Nlck5vZGVSZXNwb25zZSkgPT4ge1xuICAgICAgICB0aGlzLnJvb3ROb2RlID0ge1xuICAgICAgICAgIE5hbWU6IHJlc3VsdC5Ob2RlLk5hbWUsXG4gICAgICAgICAgRmlsZXM6IHJlc3VsdC5Ob2RlLkZpbGVzLFxuICAgICAgICAgIENoaWxkTm9kZXM6IHJlc3VsdC5Ob2RlLkNoaWxkTm9kZXMsXG4gICAgICAgICAgSXNFeHBhbmRlZDogdHJ1ZSxcbiAgICAgICAgICBJc0VkaXRNb2RlOiBmYWxzZSxcbiAgICAgICAgICBJc05ld05vZGU6IGZhbHNlLFxuICAgICAgICAgIFBhdGg6ICcvJyxcbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLnNldFBhdGhUb0FsbE5vZGVzKCk7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWROb2RlID0gdGhpcy5yb290Tm9kZTtcblxuICAgICAgICAvLyBTZWxlY3RlZCBGaWxlIGVybmV1dCBzZXR6ZW4sIHdlbm4gUHJvcGVydHkgZ2VzZXR6dCB3dXJkZSBiZXZvciBEYXRlbiB2b20gU2VydmljZSBnZWxhZGVuIHd1cmRlbi5cbiAgICAgICAgaWYgKHRoaXMucHJlc2VsZWNlZGZpbGUgIT09IG51bGwgJiYgdGhpcy5wcmVzZWxlY2VkZmlsZS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgdGhpcy5zZWxlY3RlZGZpbGUgPSB0aGlzLnByZXNlbGVjZWRmaWxlO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBa3R1YWxpc2llcnQgZGVuIE5vZGVcbiAgICovXG4gIHB1YmxpYyByZWZyZXNoTm9kZShub2RlOiBJQnJvd3Nlck5vZGUpOiB2b2lkIHtcbiAgICBpZiAoIW5vZGUuSXNFeHBhbmRlZCkge1xuICAgICAgdGhpcy5zd2l0Y2hFeHBhbmROb2RlKG5vZGUpO1xuICAgIH1cblxuICAgIHRoaXMuYnJvd3NlclNlcnZpY2VcbiAgICAgIC5HZXROb2RlKHRoaXMuYXBpdXJsLCBub2RlLlBhdGgsIHRoaXMuYWxsb3dlZHR5cGVzKVxuICAgICAgLnN1YnNjcmliZSgocmVzdWx0OiBJQnJvd3Nlck5vZGVSZXNwb25zZSkgPT4ge1xuICAgICAgICBub2RlLkNoaWxkTm9kZXMgPSByZXN1bHQuTm9kZS5DaGlsZE5vZGVzO1xuICAgICAgICBub2RlLkZpbGVzID0gcmVzdWx0Lk5vZGUuRmlsZXM7XG5cbiAgICAgICAgdGhpcy5zZXRQYXRoVG9BbGxOb2RlcygpO1xuICAgICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kZSB3ZW5uIGVpbmUgRGF0ZWkgdW1iZW5hbm50IHdlcmRlbiBzb2xsXG4gICAqIEBwYXJhbSBmaWxlIEZpbGUgd2VsY2hlcyB1bWJlbmFubnQgd2VyZGVuIHNvbGxcbiAgICogQHBhcmFtIG5ld0ZpbGVuYW1lIE5ldWVyIERhdGVpbmFtZVxuICAgKi9cbiAgcHVibGljIHJlbmFtZUZpbGUoZmlsZTogSUJyb3dzZXJGaWxlLCBuZXdGaWxlbmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgZmlsZS5Jc0VkaXRNb2RlID0gZmFsc2U7XG5cbiAgICBpZiAoIW5ld0ZpbGVuYW1lIHx8IG5ld0ZpbGVuYW1lID09PSBudWxsIHx8IG5ld0ZpbGVuYW1lLmxlbmd0aCA9PT0gMCkge1xuICAgICAgLy8gQ2FuY2VsLCBJbnZhbGlkIEZpbGVuYW1lXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGZpbGUuRmlsZW5hbWUgIT09IG5ld0ZpbGVuYW1lKSB7XG4gICAgICB0aGlzLmJyb3dzZXJTZXJ2aWNlXG4gICAgICAgIC5SZW5hbWVGaWxlKFxuICAgICAgICAgIHRoaXMuYXBpdXJsLFxuICAgICAgICAgIHRoaXMuc2VsZWN0ZWROb2RlLlBhdGggKyAnLycgKyBmaWxlLkZpbGVuYW1lLFxuICAgICAgICAgIG5ld0ZpbGVuYW1lLFxuICAgICAgICAgIHRoaXMuYWxsb3dlZHR5cGVzXG4gICAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZSgocmVzdWx0OiBJQnJvd3NlckZpbGVSZXNwb25zZSkgPT4ge1xuICAgICAgICAgIHRoaXMuc2VsZWN0ZWROb2RlLkZpbGVzID0gcmVzdWx0LkZpbGVzO1xuICAgICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kZSB3ZW5uIGVpbiBOb2RlIHVtYmVuYW5udCB3ZXJkZW4gc29sbFxuICAgKiBAcGFyYW0gbm9kZSBOb2RlIHdlbGNoZXIgdW1iZW5hbm50IHdlcmRlbiBzb2xsXG4gICAqIEBwYXJhbSBuZXdGb2xkZXJuYW1lIE5ldWVyIE9yZG5lcm5hbWVcbiAgICovXG4gIHB1YmxpYyByZW5hbWVOb2RlKG5vZGU6IElCcm93c2VyTm9kZSwgbmV3Rm9sZGVybmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgbm9kZS5Jc0VkaXRNb2RlID0gZmFsc2U7XG5cbiAgICBpZiAoIW5vZGUuSXNOZXdOb2RlKSB7XG4gICAgICBpZiAoXG4gICAgICAgICFuZXdGb2xkZXJuYW1lIHx8XG4gICAgICAgIG5ld0ZvbGRlcm5hbWUgPT09IG51bGwgfHxcbiAgICAgICAgbmV3Rm9sZGVybmFtZS5sZW5ndGggPT09IDBcbiAgICAgICkge1xuICAgICAgICAvLyBDYW5jZWwgUmVuYW1lLiBJbnZhbGlkIEZvbGRlcm5hbWVcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAobm9kZS5OYW1lICE9PSBuZXdGb2xkZXJuYW1lKSB7XG4gICAgICAgIHRoaXMuYnJvd3NlclNlcnZpY2VcbiAgICAgICAgICAuUmVuYW1lTm9kZSh0aGlzLmFwaXVybCwgbm9kZS5QYXRoLCBuZXdGb2xkZXJuYW1lKVxuICAgICAgICAgIC5zdWJzY3JpYmUoKHJlc3VsdDogSUJyb3dzZXJOb2RlUmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgIG5vZGUuTmFtZSA9IHJlc3VsdC5Ob2RlLk5hbWU7XG5cbiAgICAgICAgICAgIHRoaXMuc2V0UGF0aFRvQWxsTm9kZXMoKTtcbiAgICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKFxuICAgICAgICAhbmV3Rm9sZGVybmFtZSB8fFxuICAgICAgICBuZXdGb2xkZXJuYW1lID09PSBudWxsIHx8XG4gICAgICAgIG5ld0ZvbGRlcm5hbWUubGVuZ3RoID09PSAwXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5jbGVhck5ld0NoaWxkTm9kZXModGhpcy5yb290Tm9kZSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgbm9kZS5OYW1lID0gbmV3Rm9sZGVybmFtZTtcbiAgICAgIG5vZGUuSXNOZXdOb2RlID0gZmFsc2U7XG4gICAgICB0aGlzLmJyb3dzZXJTZXJ2aWNlXG4gICAgICAgIC5TYXZlTm9kZSh0aGlzLmFwaXVybCwgbm9kZS5QYXRoLCBuZXdGb2xkZXJuYW1lKVxuICAgICAgICAuc3Vic2NyaWJlKChyZXN1bHQ6IElCcm93c2VyTm9kZVJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgbm9kZS5OYW1lID0gcmVzdWx0Lk5vZGUuTmFtZTtcbiAgICAgICAgICBub2RlLkZpbGVzID0gcmVzdWx0Lk5vZGUuRmlsZXM7XG5cbiAgICAgICAgICB0aGlzLnNldFBhdGhUb0FsbE5vZGVzKCk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2RlIHdlbm4gZWluIEZpbGUgc2VsZWt0aWVydCB3aXJkXG4gICAqIEBwYXJhbSBmaWxlIEZpbGUgd2VsY2hlcyBzZWxla3RpZXJ0IHdpcmRcbiAgICovXG4gIHB1YmxpYyBzZWxlY3RGaWxlKGZpbGU6IElCcm93c2VyRmlsZSkge1xuICAgIGlmICghZmlsZS5Jc0VkaXRNb2RlKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkTm9kZS5GaWxlcy5mb3JFYWNoKChpdG0pID0+IChpdG0uSXNFZGl0TW9kZSA9IGZhbHNlKSk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLnNlbGVjdGVkTm9kZS5QYXRoLmVuZHNXaXRoKCcvJykpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRGaWxlID0gdGhpcy5zZWxlY3RlZE5vZGUuUGF0aCArICcvJyArIGZpbGUuRmlsZW5hbWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRGaWxlID0gJy8nICsgZmlsZS5GaWxlbmFtZTtcbiAgICB9XG5cbiAgICB0aGlzLnNlbGVjdGVkRmlsZUl0ZW0gPSBmaWxlO1xuICAgIHRoaXMuZmlsZS5lbWl0KHRoaXMuc2VsZWN0ZWRGaWxlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2RlIHdlbm4gZWluIE5vZGUgc2VsZWt0aWVydCB3aXJkXG4gICAqIEBwYXJhbSBub2RlIE5vZGUgd2VsY2hlciBzZWxla3RpZXJ0IHdlcmRlbiBzb2xsXG4gICAqL1xuICBwdWJsaWMgc2VsZWN0Tm9kZShub2RlOiBJQnJvd3Nlck5vZGUpOiB2b2lkIHtcbiAgICBpZiAoIW5vZGUuSXNFeHBhbmRlZCkge1xuICAgICAgdGhpcy5zd2l0Y2hFeHBhbmROb2RlKG5vZGUpO1xuICAgIH1cblxuICAgIC8vIFJlc2V0IHRoZSBFZGl0IE1vZGUgaW4gYWxsIE5vZGVzXG4gICAgdGhpcy5yZXNldE5vZGVFZGl0TW9kZShudWxsKTtcblxuICAgIGlmICghbm9kZS5GaWxlcykge1xuICAgICAgdGhpcy5icm93c2VyU2VydmljZVxuICAgICAgICAuR2V0RmlsZXModGhpcy5hcGl1cmwsIG5vZGUuUGF0aCwgdGhpcy5hbGxvd2VkdHlwZXMpXG4gICAgICAgIC5zdWJzY3JpYmUoKHJlc3VsdDogSUJyb3dzZXJGaWxlUmVzcG9uc2UpID0+IHtcbiAgICAgICAgICBub2RlLkZpbGVzID0gcmVzdWx0LkZpbGVzO1xuICAgICAgICAgIHRoaXMuc2VsZWN0ZWROb2RlID0gbm9kZTtcblxuICAgICAgICAgIGlmICh0aGlzLnByZXNlbGVjZWRmaWxlICE9PSBudWxsICYmIHRoaXMucHJlc2VsZWNlZGZpbGUubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3QgZmlsZW5hbWUgPSB0aGlzLnByZXNlbGVjZWRmaWxlLnN1YnN0cmluZyhcbiAgICAgICAgICAgICAgdGhpcy5wcmVzZWxlY2VkZmlsZS5sYXN0SW5kZXhPZignLycpICsgMVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNvbnN0IGZpbGUgPSBub2RlLkZpbGVzLmZpbmQoKGl0bSkgPT4gaXRtLkZpbGVuYW1lID09PSBmaWxlbmFtZSk7XG4gICAgICAgICAgICBpZiAoZmlsZSkge1xuICAgICAgICAgICAgICB0aGlzLnNlbGVjdEZpbGUoZmlsZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZWxlY3RlZE5vZGUgPSBub2RlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBFeHBhbmQvQ29sbGFic2UgTWV0aG9kZSBmw7xyIE5vZGVzXG4gICAqIEBwYXJhbSBub2RlIE5vZGUgd2VsY2hlciBnZcO2ZmZuZXQgb2RlciBnZXNjaGxvc3NlbiB3ZXJkZW4gc29sbFxuICAgKi9cbiAgcHVibGljIHN3aXRjaEV4cGFuZE5vZGUobm9kZTogSUJyb3dzZXJOb2RlKTogdm9pZCB7XG4gICAgaWYgKG5vZGUuSXNFeHBhbmRlZCkge1xuICAgICAgbm9kZS5Jc0V4cGFuZGVkID0gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5vZGUuSXNFeHBhbmRlZCA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZGUgZGllIEF1ZmdlcnVmZW4gd2VyZGVuIG11c3MsIHdlbm4gZWluIFVwbG9hZCBiZWVuZGV0IGlzdC5cbiAgICogQHBhcmFtIHBhcmFtIFBhcmFtZXRlciBkZXMgaG9jaGdlbGFkZW5lbiBGaWxlc1xuICAgKi9cbiAgcHVibGljIHVwbG9hZENvbXBsZXRlKG5vZGU6IElCcm93c2VyTm9kZSwgdXBsb2FkSWRMaXN0OiBzdHJpbmdbXSk6IHZvaWQge1xuICAgIGlmICh1cGxvYWRJZExpc3QgIT09IG51bGwpIHtcbiAgICAgIHVwbG9hZElkTGlzdC5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICAgIGlmICh0aGlzLnVwbG9hZHMuaW5kZXhPZihlbGVtZW50KSA8IDApIHtcbiAgICAgICAgICB0aGlzLnVwbG9hZHMucHVzaChlbGVtZW50KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgaWQgPSB0aGlzLnVwbG9hZHMucG9wKCk7XG4gICAgaWYgKGlkKSB7XG4gICAgICB0aGlzLmJyb3dzZXJTZXJ2aWNlXG4gICAgICAgIC5TYXZlRmlsZSh0aGlzLmFwaXVybCwgbm9kZS5QYXRoLCBpZCwgdGhpcy5hbGxvd2VkdHlwZXMpXG4gICAgICAgIC5zdWJzY3JpYmUoKHJlc3VsdDogSUJyb3dzZXJGaWxlUmVzcG9uc2UpID0+IHtcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkTm9kZS5GaWxlcyA9IHJlc3VsdC5GaWxlcztcbiAgICAgICAgICB0aGlzLnVwbG9hZGVkRmlsZU1vdmVkKGlkKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLy8gI2VuZHJlZ2lvbiBQdWJsaWMgTWV0aG9kc1xuXG4gIC8vICNyZWdpb24gUHVibGljIEFic3RyYWN0IE1ldGhvZHNcblxuICAvKipcbiAgICogQWJzdHJha3RlIENvbmZpcm0gTWV0aG9kZSB3ZWxjaGUgaW1wbGVtZW50aWVydCB3ZXJkZW4gbXVzcy4gTWV0aG9kZSB3aXJkIGF1ZmdlcnVmZW4sIHdlbm4gZWluZVxuICAgKiBEYXRlaSBnZWzDtnNjaHQgd2VyZGVuIHNvbGwuXG4gICAqIEBwYXJhbSBmaWxlIEZpbGUgZsO8ciB3ZWxjaGVzIGVpbiBEZWxldGUgQ29uZmlybSBlaW5nZWZvcmRlcnQgd2VyZGVuIHNvbGxcbiAgICovXG4gIHB1YmxpYyBhYnN0cmFjdCBjb25maXJtRGVsZXRlRmlsZShmaWxlOiBJQnJvd3NlckZpbGUpOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xuICAvKipcbiAgICogQWJzdHJha3RlIENvbmZpcm0gTWV0aG9kZSB3ZWxjaGUgaW1wbGVtZW50aWVydCB3ZXJkZW4gbXVzcy4gTWV0aG9kZSB3aXJkIGF1ZmdlcnVmZW4sIHdlbm4gZWluXG4gICAqIE9yZG5lciBnZWzDtnNjaHQgd2VyZGVuIHNvbGwuXG4gICAqIEBwYXJhbSBmb2xkZXIgT3JkZXJuIGbDvHIgd2VsY2hlbiBlaW4gRGVsZXRlIENvbmZpcm0gZWluZ2Vmb3JkZXJ0IHdlcmRlbiBzb2xsLlxuICAgKi9cbiAgcHVibGljIGFic3RyYWN0IGNvbmZpcm1EZWxldGVOb2RlKGZvbGRlcjogSUJyb3dzZXJOb2RlKTogT2JzZXJ2YWJsZTxib29sZWFuPjtcbiAgLyoqXG4gICAqIEFic3RyYWt0ZSBNZXRob2RlIGRpZSBBdWZnZXJ1ZmVuIHdpcmQsIHdlbm4gZGFzIEhvY2hnZWxhZGVuZSBGaWxlIGF1cyBkZW0gVGVtcCBGb2xkZXIgaW4gZGllXG4gICAqIFN0cnVrdHVyIHZlcnNjaG9iZW4gd3VyZGUuXG4gICAqIEBwYXJhbSB1cGxvYWRpZCBJRCBkZXMgVXBsb2Fkc1xuICAgKi9cbiAgcHVibGljIGFic3RyYWN0IHVwbG9hZGVkRmlsZU1vdmVkKHVwbG9hZGlkOiBzdHJpbmcpOiB2b2lkO1xuXG4gIC8vICNlbmRyZWdpb24gUHVibGljIEFic3RyYWN0IE1ldGhvZHNcblxuICAvLyAjcmVnaW9uIFByaXZhdGUgTWV0aG9kc1xuXG4gIC8qKlxuICAgKiBSZWt1cnNpdmUgTWV0aG9kZSB3ZWxjaGUgYmVpbSBOb2RlIHVuZCBhbGwgc2VpbmVuIENoaWxkcyBuZXVlIE5vZGVzIGVudGZlcm50XG4gICAqIEBwYXJhbSBub2RlIE5vZGUgYmVpIHdlbGNoZW0gYWxsZSBuZXVlbiBOb2RlcyBlbnRmZXJudCB3ZXJkZW4gc29sbC5cbiAgICovXG4gIHByaXZhdGUgY2xlYXJOZXdDaGlsZE5vZGVzKG5vZGU6IElCcm93c2VyTm9kZSkge1xuICAgIG5vZGUuQ2hpbGROb2Rlcy5mb3JFYWNoKChpdG0pID0+IHtcbiAgICAgIGlmIChpdG0uSXNOZXdOb2RlKSB7XG4gICAgICAgIG5vZGUuQ2hpbGROb2Rlcy5zcGxpY2Uobm9kZS5DaGlsZE5vZGVzLmluZGV4T2YoaXRtKSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBub2RlLkNoaWxkTm9kZXMuZm9yRWFjaCgoaXRtKSA9PiB0aGlzLmNsZWFyTmV3Q2hpbGROb2RlcyhpdG0pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2RlIHdlbGNoZSBkZW4gUGZhZCBmw7xyIGVpbmVuIE5vZGUgZXJ6ZXVndFxuICAgKiBAcGFyYW0gbm9kZSBOb2RlIGbDvHIgd2VsY2hlbiBkZXIgUGZhZCBlcnpldWd0IHdlcmRlbiBzb2xsXG4gICAqIEBwYXJhbSBwYXJlbnRQYXRoIMOcYmVyZ2VvcmRuZXRlciBQZmFkXG4gICAqL1xuICBwcml2YXRlIGZpbGxQYXRoKG5vZGU6IElCcm93c2VyTm9kZSwgcGFyZW50UGF0aDogc3RyaW5nKSB7XG4gICAgbm9kZS5QYXRoID0gcGFyZW50UGF0aCArICcvJyArIG5vZGUuTmFtZTtcbiAgICBub2RlLkNoaWxkTm9kZXMuZm9yRWFjaCgoaXRtKSA9PiB7XG4gICAgICB0aGlzLmZpbGxQYXRoKGl0bSwgbm9kZS5QYXRoKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdWNodCBkZW4gw7xiZXJnZW9yZG5ldGVuIE5vZGUgaW0gVHJlZVxuICAgKiBAcGFyYW0gbm9kZSBBa3R1ZWxsZXIgTm9kZVxuICAgKiBAcGFyYW0gbm9kZVRvRmluZCBOb2RlIHdlbGNoZXIgZ2VmdW5kZW4gd2VyZGVuIHNvbGxcbiAgICogQHJldHVybnMgTm9kZSB3ZW5uIGVyIGdlZnVuZGVuIHd1cmRlLCBhbnNvbnN0ZW4gd2lyZCBOVUxMIHp1csO8Y2tnZWdlYmVuXG4gICAqL1xuICBwcml2YXRlIGZpbmRQYXJlbnROb2RlKFxuICAgIG5vZGU6IElCcm93c2VyTm9kZSxcbiAgICBub2RlVG9GaW5kOiBJQnJvd3Nlck5vZGVcbiAgKTogSUJyb3dzZXJOb2RlIHtcbiAgICBpZiAobm9kZS5DaGlsZE5vZGVzLmluZGV4T2Yobm9kZVRvRmluZCkgPj0gMCkge1xuICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBjaGlsZCBvZiBub2RlLkNoaWxkTm9kZXMpIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuZmluZFBhcmVudE5vZGUoY2hpbGQsIG5vZGVUb0ZpbmQpO1xuICAgICAgaWYgKHJlc3VsdCAhPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFN1Y2h0IGVpbmVuIE5vZGUgZ2VtLiBlaW5lbSBVUkwgUGZhZFxuICAgKiBAcGFyYW0gbm9kZSBOb2RlIGluIHdlbGNoZW0gZ2VzdWNodCB3ZXJkZW4gc29sbFxuICAgKiBAcGFyYW0gcGF0aCBQZmFkIG5hY2ggd2VsY2hlbSBnZXN1Y2h0IHdpcmRcbiAgICogQHJldHVybnMgTm9kZSB3ZWxjaGVyIHp1bSBnZXN1Y2h0ZW4gUGZhZCBwYXNzdC4gV2VubiBrZWluIE5vZGUgZ2VmdW5kZW4gd2lyZCwgd2lyZCBOVUxMIHp1csO8Y2tnZWdlYmVuXG4gICAqL1xuICBwcml2YXRlIGZpbmRTZWxlY3RlZE5vZGVCeVBhdGgoXG4gICAgbm9kZTogSUJyb3dzZXJOb2RlLFxuICAgIHBhdGg6IHN0cmluZ1xuICApOiBJQnJvd3Nlck5vZGUge1xuICAgIC8vIENhbmNlbCB3ZW5uIFBmYWQgbmljaHQgZGVmaW5pZXJ0XG4gICAgaWYgKHBhdGggPT09IHVuZGVmaW5lZCB8fCBwYXRoID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBQZmFkIGluIEFycmF5IHNwbGl0dGVuIHVuZCBSb290IEZvbGRlcm5hbWUgc2V0emVuXG4gICAgY29uc3QgcGF0aEFycmF5ID0gcGF0aC5zcGxpdCgnLycpO1xuICAgIHBhdGhBcnJheVswXSA9IHRoaXMucm9vdE5vZGUuTmFtZTtcblxuICAgIHJldHVybiB0aGlzLmZpbmRTZWxlY3RlZE5vZGVCeVBhdGhBcnJheShub2RlLCBwYXRoQXJyYXksIDApO1xuICB9XG5cbiAgLyoqXG4gICAqIFN1Y2h0IGVpbmVuIE5vZGUgZ2VtLiBlaW5lbSBBcnJheSB2b24gTm9kZSBOYW1lblxuICAgKiBAcGFyYW0gbm9kZSBOb2RlIGluIHdlbGNoZW0gZ2VzdWNodCB3ZXJkZW4gc29sbFxuICAgKiBAcGFyYW0gcGF0aCBBcnJheSB2b24gTm9kZSBOYW1lbiwgd2VsY2hlIGRpZSBIaXJhcmNoeSBkZXMgUGZhZGVzIGFiYmlsZGVuXG4gICAqIEBwYXJhbSBpbmRleCBBa3R1ZWxsZXIgSW5kZXggaW0gUEFUSCBBcnJheVxuICAgKiBAcmV0dXJucyBOb2RlIHdlbm4gZWluZXIgZ2VmdW5kZW4gd3VyZGUsIGFuc29uc3RlbiBOVUxMXG4gICAqL1xuICBwcml2YXRlIGZpbmRTZWxlY3RlZE5vZGVCeVBhdGhBcnJheShcbiAgICBub2RlOiBJQnJvd3Nlck5vZGUsXG4gICAgcGF0aDogc3RyaW5nW10sXG4gICAgaW5kZXg6IG51bWJlclxuICApOiBJQnJvd3Nlck5vZGUge1xuICAgIC8vIENoZWNrIG9iIE9yZG5lciBrb3JyZWt0LiBMZXR6ZXIgT3JkbmVyIHp1csO8Y2tnZWJlbi4gUGF0aCBMYXN0IEluZGV4IGlzdCBkZXIgRmlsZW5hbWVcbiAgICBpZiAobm9kZS5OYW1lID09PSBwYXRoW2luZGV4XSAmJiBwYXRoLmxlbmd0aCAtIDIgPT09IGluZGV4KSB7XG4gICAgICByZXR1cm4gbm9kZTtcbiAgICB9IGVsc2UgaWYgKG5vZGUuTmFtZSA9PT0gcGF0aFtpbmRleF0pIHtcbiAgICAgIC8vIEV4cGFuZCBOb2RlXG4gICAgICBub2RlLklzRXhwYW5kZWQgPSB0cnVlO1xuICAgICAgZm9yIChjb25zdCBpdGVtIG9mIG5vZGUuQ2hpbGROb2Rlcykge1xuICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLmZpbmRTZWxlY3RlZE5vZGVCeVBhdGhBcnJheShpdGVtLCBwYXRoLCBpbmRleCArIDEpO1xuXG4gICAgICAgIGlmIChyZXN1bHQgIT09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFJla3Vyc2l2ZSBNZXRob2RlIHdlbGNoZSBiZWltIE5vZGUgdW5kIGFsbCBzZWluZW4gQ2hpbGRzIGRlbiBFZGl0IE1vZGUgYmVlbmRldC5cbiAgICogQHBhcmFtIG5vZGUgTm9kZSBiZWkgd2VsY2hlbSBkZXIgRWRpdCBNb2RlIGJlZW5kZXQgd2VyZGVuIHNvbGxcbiAgICovXG4gIHByaXZhdGUgcmVzZXROb2RlRWRpdE1vZGUobm9kZTogSUJyb3dzZXJOb2RlKTogdm9pZCB7XG4gICAgaWYgKG5vZGUgPT09IG51bGwpIHtcbiAgICAgIHRoaXMucmVzZXROb2RlRWRpdE1vZGUodGhpcy5yb290Tm9kZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5vZGUuSXNFZGl0TW9kZSA9IGZhbHNlO1xuXG4gICAgICBpZiAobm9kZS5DaGlsZE5vZGVzKSB7XG4gICAgICAgIG5vZGUuQ2hpbGROb2Rlcy5mb3JFYWNoKChpdG0pID0+IHRoaXMucmVzZXROb2RlRWRpdE1vZGUoaXRtKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNldHp0IGRlbiBQZmFkIGluIGFsbGVuIE5vZGVzXG4gICAqL1xuICBwcml2YXRlIHNldFBhdGhUb0FsbE5vZGVzKCkge1xuICAgIHRoaXMucm9vdE5vZGUuQ2hpbGROb2Rlcy5mb3JFYWNoKChpdG0pID0+IHtcbiAgICAgIHRoaXMuZmlsbFBhdGgoaXRtLCAnJyk7XG4gICAgfSk7XG4gIH1cblxuICAvLyAjZW5kcmVnaW9uIFByaXZhdGUgTWV0aG9kc1xufVxuIl19
533
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJvd3Nlci5qcyIsInNvdXJjZVJvb3QiOiIvaG9tZS9ydW5uZXIvd29yay9zaW1wbGVhbmd1bGFyY29udHJvbHMvc2ltcGxlYW5ndWxhcmNvbnRyb2xzL2NoLmpuZXR3b3JrLnNhYy1jb250cm9scy9wcm9qZWN0cy9zYWMtY29tbW9uL3NyYy8iLCJzb3VyY2VzIjpbImNvbXBvbmVudHMvYnJvd3Nlci9icm93c2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUlBLE9BQU8sRUFDSCxlQUFlLEVBQ2YsdUJBQXVCLEVBQ3ZCLHdCQUF3QixFQUN4QixxQkFBcUIsRUFDckIsOEJBQThCLEdBQ2pDLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUFFLHNCQUFzQixFQUFFLDRCQUE0QixFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFDOUcsT0FBTyxFQUFFLDZCQUE2QixFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFLeEYsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUd2Rzs7R0FFRztBQUVILE1BQU0sT0FBZ0Isb0JBQW9CO0lBbUh0Qyx3QkFBd0I7SUFFeEIsdUJBQXVCO0lBRXZCOzs7O09BSUc7SUFDSCxZQUFZLFVBQXNCLEVBQUUsUUFBa0I7UUEvR3REOztXQUVHO1FBQ0ssbUJBQWMsR0FBa0IsSUFBSSxDQUFDO1FBRTdDOztXQUVHO1FBRUksaUJBQVksR0FBRyxFQUFFLENBQUM7UUFFekI7O1dBRUc7UUFFSSxvQkFBZSxHQUFHLElBQUksQ0FBQztRQUU5Qjs7V0FFRztRQUVJLG9CQUFlLEdBQUcsSUFBSSxDQUFDO1FBRTlCOztXQUVHO1FBRUksb0JBQWUsR0FBRyxJQUFJLENBQUM7UUFFOUI7O1dBRUc7UUFFSSxzQkFBaUIsR0FBRyxJQUFJLENBQUM7UUFFaEM7O1dB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LGlCQUFpQjtRQUNyQixJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtZQUNyQyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUMzQixDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7OztZQXpvQkosU0FBUzs7O1lBUEQsVUFBVTtZQUM2QixRQUFROzs7MkJBNEJuRCxLQUFLOzhCQU1MLEtBQUs7OEJBTUwsS0FBSzs4QkFNTCxLQUFLO2dDQU1MLEtBQUs7Z0NBTUwsS0FBSztnQ0FNTCxLQUFLO3FCQU1MLEtBQUs7bUJBTUwsTUFBTTsyQkE0SU4sS0FBSzsyQkFtRkwsWUFBWSxTQUFDLGdCQUFnQixFQUFFLENBQUMsZUFBZSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSVNhY0ZpbGVCcm93c2VyU2VydmljZSB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvSVNhY0ZpbGVCcm93c2VyU2VydmljZSc7XG5pbXBvcnQgeyBJU2FjSWNvblNlcnZpY2UgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL0lTYWNJY29uU2VydmljZSc7XG5pbXBvcnQgeyBJU2FjTG9jYWxpc2F0aW9uU2VydmljZSB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvSVNhY0xvY2FsaXNhdGlvblNlcnZpY2UnO1xuaW1wb3J0IHsgSVNhY1ZhbGlkYXRpb25LZXlTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9JU2FjVmFsaWRhdGlvbktleVNlcnZpY2UnO1xuaW1wb3J0IHtcbiAgICBTQUNJQ09OX1NFUlZJQ0UsXG4gICAgU0FDTE9DQUxJU0FUSU9OX1NFUlZJQ0UsXG4gICAgU0FDVkFMSURBVElPTktFWV9TRVJWSUNFLFxuICAgIFNhY0RlZmF1bHRJY29uU2VydmljZSxcbiAgICBTYWNEZWZhdWx0VmFsaWRhdGlvbktleVNlcnZpY2UsXG59IGZyb20gJy4uLy4uL3NlcnZpY2VzJztcbmltcG9ydCB7IFNBQ0ZJTEVCUk9XU0VSX1NFUlZJQ0UsIFNhY0RlZmF1bHRGaWxlQnJvd3NlclNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9zYWMtZmlsZWJyb3dzZXIuc2VydmljZSc7XG5pbXBvcnQgeyBTYWNEZWZhdWx0TG9jYWxpc2F0aW9uU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3NhYy1sb2NhbGlzYXRpb24uc2VydmljZSc7XG5pbXBvcnQgeyBJQnJvd3NlckZpbGUgfSBmcm9tICcuL21vZGVscy9icm93c2VyZmlsZSc7XG5pbXBvcnQgeyBJQnJvd3NlckZpbGVSZXNwb25zZSB9IGZyb20gJy4vbW9kZWxzL2Jyb3dzZXJmaWxlcmVzcG9uc2UnO1xuaW1wb3J0IHsgSUJyb3dzZXJOb2RlIH0gZnJvbSAnLi9tb2RlbHMvYnJvd3Nlcm5vZGUnO1xuaW1wb3J0IHsgSUJyb3dzZXJOb2RlUmVzcG9uc2UgfSBmcm9tICcuL21vZGVscy9icm93c2Vybm9kZXJlc3BvbnNlJztcbmltcG9ydCB7IEh0dHBDbGllbnQgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBEaXJlY3RpdmUsIEV2ZW50RW1pdHRlciwgSG9zdExpc3RlbmVyLCBJbmplY3RvciwgSW5wdXQsIE9uSW5pdCwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5cbi8qKlxuICogQmFzZSBjb21wb25lbnQgZm9yIGZpbGUgYnJvd3NlclxuICovXG5ARGlyZWN0aXZlKClcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBTYWNGaWxlQnJvd3NlckNvbW1vbiBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gICAgLy8gI3JlZ2lvbiBQcm9wZXJ0aWVzXG5cbiAgICAvKipcbiAgICAgKiBTZXJ2aWNlIGZvciBmaWxlIGJyb3dzZXIgYWNjZXNzIChiYWNrZW5kKVxuICAgICAqL1xuICAgIHByaXZhdGUgYnJvd3NlclNlcnZpY2U6IElTYWNGaWxlQnJvd3NlclNlcnZpY2U7XG5cbiAgICAvKipcbiAgICAgKiBJY29uIHNlcnZpY2UgdG8gcmVjZWl2ZSBpY29uIGNsYXNzZXMgZm9yIHVpXG4gICAgICovXG4gICAgcHJpdmF0ZSBpY29uU2VydmljZTogSVNhY0ljb25TZXJ2aWNlO1xuXG4gICAgLyoqXG4gICAgICogRmlsZSB0aGF0IGlzIGFscmVhZHkgc2VsZWN0ZWQgd2hlbiB0aGUgYnJvd3NlciBzdGFydHNcbiAgICAgKi9cbiAgICBwcml2YXRlIHByZXNlbGVjZWRmaWxlOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICAgIC8qKlxuICAgICAqIEFsbG93ZWQgZmlsZSBleHRlbnNpb25zIGZvciBmaWxlIHNlbGVjdGlvbiBhbmQgdXBsb2FkLiBVc2UgZG90IG5vdGF0aW9uLCBzZXBhcmF0ZWQgYnkgY29tbWFzIGZvciBtdWx0aXBsZSBleHRlbnNpb25zIChFeGFtcGxlOiBcIi5qcGcsLmdpZlwiKVxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGFsbG93ZWR0eXBlcyA9ICcnO1xuXG4gICAgLyoqXG4gICAgICogQWxsb3dzIGRlbGV0aW5nIGEgZmlsZVxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGFsbG93ZmlsZWRlbGV0ZSA9IHRydWU7XG5cbiAgICAvKipcbiAgICAgKiBBbGxvd3MgcmVuYW1pbmcgYSBmaWxlXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgYWxsb3dmaWxlcmVuYW1lID0gdHJ1ZTtcblxuICAgIC8qKlxuICAgICAqIEFsbG93cyB1cGxvYWRpbmcgZmlsZXNcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBhbGxvd2ZpbGV1cGxvYWQgPSB0cnVlO1xuXG4gICAgLyoqXG4gICAgICogQWxsb3dzIGNyZWF0aW5nIGEgbmV3IGZvbGRlclxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGFsbG93Zm9sZGVyY3JlYXRlID0gdHJ1ZTtcblxuICAgIC8qKlxuICAgICAqIEFsbG93cyBkZWxldGluZyBhIGZvbGRlclxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGFsbG93Zm9sZGVyZGVsZXRlID0gdHJ1ZTtcblxuICAgIC8qKlxuICAgICAqIEFsbG93cyByZW5hbWluZyBhIGZvbGRlclxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGFsbG93Zm9sZGVycmVuYW1lID0gdHJ1ZTtcblxuICAgIC8qKlxuICAgICAqIFVSTCBmb3IgdGhlIGJhY2tlbmQgQVBJXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgYXBpdXJsOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBPdXRwdXQgZW1pdHRlciB3aGVuIGEgZmlsZSBpcyBzZWxlY3RlZC5cbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgZmlsZTogRXZlbnRFbWl0dGVyPHN0cmluZz4gPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcblxuICAgIC8qKlxuICAgICAqIFNlcnZpY2UgZm9yIGVycm9yIGxvY2FsaXNhdGlvblxuICAgICAqL1xuICAgIHB1YmxpYyBsbmdSZXNvdXJjZVNlcnZpY2U6IElTYWNMb2NhbGlzYXRpb25TZXJ2aWNlO1xuXG4gICAgLyoqXG4gICAgICogUm9vdCBub2RlIGl0ZW0gZm9yIHRoZSB0cmVlXG4gICAgICovXG4gICAgcHVibGljIHJvb3ROb2RlOiBJQnJvd3Nlck5vZGUgPSB7XG4gICAgICAgIE5hbWU6ICcnLFxuICAgICAgICBDaGlsZE5vZGVzOiBbXSxcbiAgICAgICAgRmlsZXM6IFtdLFxuICAgICAgICBJc0V4cGFuZGVkOiB0cnVlLFxuICAgICAgICBJc0VkaXRNb2RlOiBmYWxzZSxcbiAgICAgICAgSXNOZXdOb2RlOiBmYWxzZSxcbiAgICAgICAgUGF0aDogJycsXG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFNlbGVjdGVkIEZpbGUgTmFtZVxuICAgICAqL1xuICAgIHB1YmxpYyBzZWxlY3RlZEZpbGU6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIFNlbGVjdGVkIEZpbGUgSXRlbVxuICAgICAqL1xuICAgIHB1YmxpYyBzZWxlY3RlZEZpbGVJdGVtOiBJQnJvd3NlckZpbGUgPSBudWxsO1xuXG4gICAgLyoqXG4gICAgICogU2VsZWN0ZWQgTm9kZSBJdGVtXG4gICAgICovXG4gICAgcHVibGljIHNlbGVjdGVkTm9kZTogSUJyb3dzZXJOb2RlID0gbnVsbDtcblxuICAgIC8qKlxuICAgICAqIExpc3RlIHZvbiBVcGxvYWRzXG4gICAgICovXG4gICAgcHVibGljIHVwbG9hZHM6IHN0cmluZ1tdID0gW107XG5cbiAgICAvKipcbiAgICAgKiBTZXJ2aWNlIHRvIHJlY2VpdmUgc3RhbmRhcmQgdmFsaWRhdGlvbiBtZXNzYWdlIGtleXMgYW5kIHRleHRzXG4gICAgICovXG4gICAgcHVibGljIHZhbGlkYXRpb25LZXlTZXJ2aWNlOiBJU2FjVmFsaWRhdGlvbktleVNlcnZpY2U7XG5cbiAgICAvLyAjZW5kcmVnaW9uIFByb3BlcnRpZXNcblxuICAgIC8vICNyZWdpb24gQ29uc3RydWN0b3JzXG5cbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3RvclxuICAgICAqIEBwYXJhbSBodHRwY2xpZW50IEFuZ3VsYXIgSFRUUCBDbGllbnRcbiAgICAgKiBAcGFyYW0gaW5qZWN0b3IgU2VydmljZSBJbmplY3RvclxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGh0dHBjbGllbnQ6IEh0dHBDbGllbnQsIGluamVjdG9yOiBJbmplY3Rvcikge1xuICAgICAgICB0aGlzLmJyb3dzZXJTZXJ2aWNlID0gaW5qZWN0b3IuZ2V0KFNBQ0ZJTEVCUk9XU0VSX1NFUlZJQ0UsIG5ldyBTYWNEZWZhdWx0RmlsZUJyb3dzZXJTZXJ2aWNlKGh0dHBjbGllbnQpKTtcbiAgICAgICAgdGhpcy52YWxpZGF0aW9uS2V5U2VydmljZSA9IGluamVjdG9yLmdldChTQUNWQUxJREFUSU9OS0VZX1NFUlZJQ0UsIG5ldyBTYWNEZWZhdWx0VmFsaWRhdGlvbktleVNlcnZpY2UoKSk7XG4gICAgICAgIHRoaXMubG5nUmVzb3VyY2VTZXJ2aWNlID0gaW5qZWN0b3IuZ2V0KFxuICAgICAgICAgICAgU0FDTE9DQUxJU0FUSU9OX1NFUlZJQ0UsXG4gICAgICAgICAgICBuZXcgU2FjRGVmYXVsdExvY2FsaXNhdGlvblNlcnZpY2UodGhpcy52YWxpZGF0aW9uS2V5U2VydmljZSlcbiAgICAgICAgKTtcblxuICAgICAgICB0aGlzLmljb25TZXJ2aWNlID0gaW5qZWN0b3IuZ2V0KFNBQ0lDT05fU0VSVklDRSwgbmV3IFNhY0RlZmF1bHRJY29uU2VydmljZSgpKTtcbiAgICB9XG5cbiAgICAvLyAjZW5kcmVnaW9uIENvbnN0cnVjdG9yc1xuXG4gICAgLy8gI3JlZ2lvbiBQdWJsaWMgR2V0dGVycyBBbmQgU2V0dGVyc1xuXG4gICAgLyoqXG4gICAgICogQ1NTIGljb24gY2xhc3MgZm9yIGRlbGV0ZSBpY29uXG4gICAgICogQHJldHVybnMgY3NzIGNsYXNzIHdpdGggaWNvblxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaWNvbkRlbGV0ZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5pY29uU2VydmljZS5Ccm93c2VyQ29tcG9uZW50RGVsZXRlSWNvbjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDU1MgaWNvbiBjbGFzcyBmb3IgZWRpdCBpY29uXG4gICAgICogQHJldHVybnMgY3NzIGNsYXNzIHdpdGggaWNvblxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaWNvbkVkaXQoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaWNvblNlcnZpY2UuQnJvd3NlckNvbXBvbmVudEVkaXRJY29uO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENTUyBpY29uIGZvciBmb2xkZXJzIGluIHRyZWUgdGhhdCBhcmUgY29sbGFwc2VkXG4gICAgICogQHJldHVybnMgY3NzIGNsYXNzIHdpdGggaWNvblxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaWNvbkZvbGRlckNvbGxhYnNlZCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5pY29uU2VydmljZS5Ccm93c2VyQ29tcG9uZW50Rm9sZGVyQ2xvc2VkSWNvbjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDU1MgaWNvbiBjbGFzcyBmb3IgZm9sZGVycyB3aXRob3V0IHN1YmZvbGRlcnNcbiAgICAgKiBAcmV0dXJucyBjc3MgY2xhc3Mgd2l0aCBpY29uXG4gICAgICovXG4gICAgcHVibGljIGdldCBpY29uRm9sZGVyRW1wdHkoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaWNvblNlcnZpY2UuQnJvd3NlckNvbXBvbmVudEZvbGRlckVtcHR5SWNvbjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDU1MgaWNvbiBmb3IgbmV3IGZvbGRlcnMgYWN0aW9uXG4gICAgICogQHJldHVybnMgY3NzIGNsYXNzIHdpdGggaWNvblxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaWNvbkZvbGRlck5ldygpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5pY29uU2VydmljZS5Ccm93c2VyQ29tcG9uZW50Rm9sZGVyTmV3SWNvbjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDU1MgaWNvbiBmb3IgZm9sZGVycyBpbiB0cmVlIHRoZXJlIGFyZSBleHBhbmRlZFxuICAgICAqIEByZXR1cm5zIGNzcyBjbGFzcyB3aXRoIGljb25cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGljb25Gb2xkZXJPcGVuKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLmljb25TZXJ2aWNlLkJyb3dzZXJDb21wb25lbnRGb2xkZXJPcGVuSWNvbjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDU1MgaWNvbiBjbGFzcyBmb3IgcmVmcmVzaCBpY29uXG4gICAgICogQHJldHVybnMgY3NzIGNsYXNzIHdpdGggaWNvblxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaWNvblJlZnJlc2goKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaWNvblNlcnZpY2UuQnJvd3NlckNvbXBvbmVudFJlZnJlc2hJY29uO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHRlciBmb3Igc2VsZWN0ZWQgZmlsZS4gQm91bmQgdG8gYW4gaW5wdXQgcHJvcGVydHlcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHNlbGVjdGVkZmlsZSgpOiBzdHJpbmcgfCBudWxsIHtcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0RmlsZSAmJiB0aGlzLnNlbGVjdEZpbGUubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRGaWxlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBzZWxlY3RlZCBub2RlIGJ5IHRoZSBwYXRoXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgc2V0IHNlbGVjdGVkZmlsZSh2OiBzdHJpbmcgfCBudWxsKSB7XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkbm9kZSA9IHRoaXMuZmluZFNlbGVjdGVkTm9kZUJ5UGF0aCh0aGlzLnJvb3ROb2RlLCB2KTtcblxuICAgICAgICBpZiAoc2VsZWN0ZWRub2RlICE9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdE5vZGUoc2VsZWN0ZWRub2RlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucHJlc2VsZWNlZGZpbGUgPSB2O1xuICAgIH1cblxuICAgIC8vICNlbmRyZWdpb24gUHVibGljIEdldHRlcnMgQW5kIFNldHRlcnNcblxuICAgIC8vICNyZWdpb24gUHVibGljIE1ldGhvZHNcblxuICAgIC8qKlxuICAgICAqIEFic3RyYWN0IGNvbmZpcm0gbWV0aG9kIHRoYXQgbXVzdCBiZSBpbXBsZW1lbnRlZC4gQ2FsbGVkIHdoZW4gYSBmaWxlIHNob3VsZCBiZSBkZWxldGVkLlxuICAgICAqIEBwYXJhbSBmaWxlIEZpbGUgZm9yIHdoaWNoIGEgZGVsZXRlIGNvbmZpcm1hdGlvbiBzaG91bGQgYmUgcmVxdWVzdGVkXG4gICAgICovXG4gICAgcHVibGljIGFic3RyYWN0IGNvbmZpcm1EZWxldGVGaWxlKGZpbGU6IElCcm93c2VyRmlsZSk6IE9ic2VydmFibGU8Ym9vbGVhbj47XG5cbiAgICAvKipcbiAgICAgKiBBYnN0cmFjdCBjb25maXJtIG1ldGhvZCB0aGF0IG11c3QgYmUgaW1wbGVtZW50ZWQuIENhbGxlZCB3aGVuIGEgZm9sZGVyIHNob3VsZCBiZSBkZWxldGVkLlxuICAgICAqIEBwYXJhbSBmb2xkZXIgRm9sZGVyIGZvciB3aGljaCBhIGRlbGV0ZSBjb25maXJtYXRpb24gc2hvdWxkIGJlIHJlcXVlc3RlZC5cbiAgICAgKi9cbiAgICBwdWJsaWMgYWJzdHJhY3QgY29uZmlybURlbGV0ZU5vZGUoZm9sZGVyOiBJQnJvd3Nlck5vZGUpOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xuXG4gICAgLyoqXG4gICAgICogRGVsZXRlcyBhIGZpbGVcbiAgICAgKiBAcGFyYW0gZmlsZSBGaWxlIHRvIGJlIGRlbGV0ZWRcbiAgICAgKi9cbiAgICBwdWJsaWMgZGVsZXRlRmlsZShmaWxlOiBJQnJvd3NlckZpbGUpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5jb25maXJtRGVsZXRlRmlsZShmaWxlKS5zdWJzY3JpYmUoKGNvbmZpcm0pID0+IHtcbiAgICAgICAgICAgIGlmIChjb25maXJtKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5icm93c2VyU2VydmljZVxuICAgICAgICAgICAgICAgICAgICAuRGVsZXRlRmlsZSh0aGlzLmFwaXVybCwgdGhpcy5zZWxlY3RlZE5vZGUuUGF0aCArICcvJyArIGZpbGUuRmlsZW5hbWUsIHRoaXMuYWxsb3dlZHR5cGVzKVxuICAgICAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKChyZXN1bHQ6IElCcm93c2VyRmlsZVJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkTm9kZS5GaWxlcyA9IHJlc3VsdC5GaWxlcztcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlbGV0ZXMgYSBub2RlXG4gICAgICogQHBhcmFtIG5vZGUgTm9kZSB0byBiZSBkZWxldGVkXG4gICAgICovXG4gICAgcHVibGljIGRlbGV0ZU5vZGUobm9kZTogSUJyb3dzZXJOb2RlKTogdm9pZCB7XG4gICAgICAgIHRoaXMuY29uZmlybURlbGV0ZU5vZGUobm9kZSkuc3Vic2NyaWJlKChjb25maXJtKSA9PiB7XG4gICAgICAgICAgICBpZiAoY29uZmlybSkge1xuICAgICAgICAgICAgICAgIHRoaXMuYnJvd3NlclNlcnZpY2UuRGVsZXRlTm9kZSh0aGlzLmFwaXVybCwgbm9kZS5QYXRoKS5zdWJzY3JpYmUoKHJlc3VsdDogSUJyb3dzZXJOb2RlUmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFyZW50Tm9kZSA9IHRoaXMuZmluZFBhcmVudE5vZGUodGhpcy5yb290Tm9kZSwgbm9kZSk7XG4gICAgICAgICAgICAgICAgICAgIHBhcmVudE5vZGUuQ2hpbGROb2RlcyA9IHJlc3VsdC5Ob2RlLkNoaWxkTm9kZXM7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yb290Tm9kZS5DaGlsZE5vZGVzLmZvckVhY2goKGl0bSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5maWxsUGF0aChpdG0sICcnKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3ROb2RlKHBhcmVudE5vZGUpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIGEgZmlsZSBpbnRvIGVkaXQgbW9kZVxuICAgICAqIEBwYXJhbSBmaWxlIEZpbGUgdGhhdCBzaG91bGQgYmUgcGxhY2VkIGludG8gZWRpdCBtb2RlXG4gICAgICovXG4gICAgcHVibGljIGVkaXRGaWxlKGZpbGU6IElCcm93c2VyRmlsZSk6IHZvaWQge1xuICAgICAgICBmaWxlLklzRWRpdE1vZGUgPSB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgYSBub2RlIGludG8gZWRpdCBtb2RlXG4gICAgICogQHBhcmFtIG5vZGUgTm9kZSB0byBiZSBlZGl0ZWRcbiAgICAgKi9cbiAgICBwdWJsaWMgZWRpdE5vZGUobm9kZTogSUJyb3dzZXJOb2RlKTogdm9pZCB7XG4gICAgICAgIG5vZGUuSXNFZGl0TW9kZSA9IHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSG9zdExpc3RlbmVyIHRoYXQgZW5kcyBlZGl0IG1vZGUgZm9yIGFsbCBmaWxlcyBhbmQgbm9kZXMuXG4gICAgICovXG4gICAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6Y2xpY2snLCBbJyRldmVudC50YXJnZXQnXSlcbiAgICAvKipcbiAgICAgKiBDbGljayBFdmVudCAtIEV4aXRzIGVkaXQgbW9kZSBmb3IgZmlsZXMgYW5kIG5vZGVzXG4gICAgICogQHBhcmFtIHRhcmdldEVsZW1lbnQgVGhlIHRhcmdldCBlbGVtZW50IGZyb20gdGhlIGNsaWNrIGV2ZW50XG4gICAgICovXG4gICAgcHVibGljIGV4aXRFZGl0TW9kZSh0YXJnZXRFbGVtZW50KTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGVkTm9kZSkge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZE5vZGUuRmlsZXMuZm9yRWFjaCgoaXRtKSA9PiAoaXRtLklzRWRpdE1vZGUgPSBmYWxzZSkpO1xuXG4gICAgICAgICAgICBpZiAoIXRoaXMuc2VsZWN0ZWROb2RlIHx8IHRoaXMuc2VsZWN0ZWROb2RlLk5hbWUgPT09IG51bGwgfHwgdGhpcy5zZWxlY3RlZE5vZGUuTmFtZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNsZWFyTmV3Q2hpbGROb2Rlcyh0aGlzLnJvb3ROb2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucmVzZXROb2RlRWRpdE1vZGUobnVsbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBub2RlIGluIHRoZSB0cmVlXG4gICAgICogQHBhcmFtIG5vZGUgTm9kZSB1bmRlciB3aGljaCBhIG5ldyBub2RlIHNob3VsZCBiZSBjcmVhdGVkXG4gICAgICovXG4gICAgcHVibGljIG5ld05vZGUobm9kZTogSUJyb3dzZXJOb2RlKSB7XG4gICAgICAgIGNvbnN0IGl0ZW06IElCcm93c2VyTm9kZSA9IHtcbiAgICAgICAgICAgIENoaWxkTm9kZXM6IFtdLFxuICAgICAgICAgICAgRmlsZXM6IFtdLFxuICAgICAgICAgICAgSXNFZGl0TW9kZTogZmFsc2UsXG4gICAgICAgICAgICBJc0V4cGFuZGVkOiBmYWxzZSxcbiAgICAgICAgICAgIE5hbWU6ICcnLFxuICAgICAgICAgICAgUGF0aDogbm9kZS5QYXRoLFxuICAgICAgICAgICAgSXNOZXdOb2RlOiB0cnVlLFxuICAgICAgICB9O1xuXG4gICAgICAgIG5vZGUuQ2hpbGROb2Rlcy5wdXNoKGl0ZW0pO1xuICAgICAgICB0aGlzLnNlbGVjdE5vZGUoaXRlbSk7XG4gICAgICAgIHRoaXMuZWRpdE5vZGUoaXRlbSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW5pdCBldmVudCBvZiB0aGUgY29tcG9uZW50XG4gICAgICovXG4gICAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLmJyb3dzZXJTZXJ2aWNlLkdldE5vZGUodGhpcy5hcGl1cmwsICcnLCB0aGlzLmFsbG93ZWR0eXBlcykuc3Vic2NyaWJlKChyZXN1bHQ6IElCcm93c2VyTm9kZVJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnJvb3ROb2RlID0ge1xuICAgICAgICAgICAgICAgIE5hbWU6IHJlc3VsdC5Ob2RlLk5hbWUsXG4gICAgICAgICAgICAgICAgRmlsZXM6IHJlc3VsdC5Ob2RlLkZpbGVzLFxuICAgICAgICAgICAgICAgIENoaWxkTm9kZXM6IHJlc3VsdC5Ob2RlLkNoaWxkTm9kZXMsXG4gICAgICAgICAgICAgICAgSXNFeHBhbmRlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBJc0VkaXRNb2RlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBJc05ld05vZGU6IGZhbHNlLFxuICAgICAgICAgICAgICAgIFBhdGg6ICcvJyxcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIHRoaXMuc2V0UGF0aFRvQWxsTm9kZXMoKTtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWROb2RlID0gdGhpcy5yb290Tm9kZTtcblxuICAgICAgICAgICAgLy8gUmUtc2V0IHRoZSBzZWxlY3RlZCBmaWxlIGlmIHRoZSBwcm9wZXJ0eSB3YXMgc2V0IGJlZm9yZSBkYXRhIHdhcyBsb2FkZWQgZnJvbSB0aGUgc2VydmljZS5cbiAgICAgICAgICAgIGlmICh0aGlzLnByZXNlbGVjZWRmaWxlICE9PSBudWxsICYmIHRoaXMucHJlc2VsZWNlZGZpbGUubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRmaWxlID0gdGhpcy5wcmVzZWxlY2VkZmlsZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXBkYXRlcyB0aGUgbm9kZVxuICAgICAqL1xuICAgIHB1YmxpYyByZWZyZXNoTm9kZShub2RlOiBJQnJvd3Nlck5vZGUpOiB2b2lkIHtcbiAgICAgICAgaWYgKCFub2RlLklzRXhwYW5kZWQpIHtcbiAgICAgICAgICAgIHRoaXMuc3dpdGNoRXhwYW5kTm9kZShub2RlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuYnJvd3NlclNlcnZpY2VcbiAgICAgICAgICAgIC5HZXROb2RlKHRoaXMuYXBpdXJsLCBub2RlLlBhdGgsIHRoaXMuYWxsb3dlZHR5cGVzKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgocmVzdWx0OiBJQnJvd3Nlck5vZGVSZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgICAgIG5vZGUuQ2hpbGROb2RlcyA9IHJlc3VsdC5Ob2RlLkNoaWxkTm9kZXM7XG4gICAgICAgICAgICAgICAgbm9kZS5GaWxlcyA9IHJlc3VsdC5Ob2RlLkZpbGVzO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5zZXRQYXRoVG9BbGxOb2RlcygpO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTWV0aG9kIGNhbGxlZCB3aGVuIGEgZmlsZSBzaG91bGQgYmUgcmVuYW1lZFxuICAgICAqIEBwYXJhbSBmaWxlIEZpbGUgdG8gYmUgcmVuYW1lZFxuICAgICAqIEBwYXJhbSBuZXdGaWxlbmFtZSBOZXcgZmlsZW5hbWVcbiAgICAgKi9cbiAgICBwdWJsaWMgcmVuYW1lRmlsZShmaWxlOiBJQnJvd3NlckZpbGUsIG5ld0ZpbGVuYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgZmlsZS5Jc0VkaXRNb2RlID0gZmFsc2U7XG5cbiAgICAgICAgaWYgKCFuZXdGaWxlbmFtZSB8fCBuZXdGaWxlbmFtZSA9PT0gbnVsbCB8fCBuZXdGaWxlbmFtZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIC8vIENhbmNlbCwgSW52YWxpZCBGaWxlbmFtZVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGZpbGUuRmlsZW5hbWUgIT09IG5ld0ZpbGVuYW1lKSB7XG4gICAgICAgICAgICB0aGlzLmJyb3dzZXJTZXJ2aWNlXG4gICAgICAgICAgICAgICAgLlJlbmFtZUZpbGUodGhpcy5hcGl1cmwsIHRoaXMuc2VsZWN0ZWROb2RlLlBhdGggKyAnLycgKyBmaWxlLkZpbGVuYW1lLCBuZXdGaWxlbmFtZSwgdGhpcy5hbGxvd2VkdHlwZXMpXG4gICAgICAgICAgICAgICAgLnN1YnNjcmliZSgocmVzdWx0OiBJQnJvd3NlckZpbGVSZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkTm9kZS5GaWxlcyA9IHJlc3VsdC5GaWxlcztcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1ldGhvZCBjYWxsZWQgd2hlbiBhIG5vZGUgc2hvdWxkIGJlIHJlbmFtZWRcbiAgICAgKiBAcGFyYW0gbm9kZSBOb2RlIHRvIGJlIHJlbmFtZWRcbiAgICAgKiBAcGFyYW0gbmV3Rm9sZGVybmFtZSBOZXcgZm9sZGVyIG5hbWVcbiAgICAgKi9cbiAgICBwdWJsaWMgcmVuYW1lTm9kZShub2RlOiBJQnJvd3Nlck5vZGUsIG5ld0ZvbGRlcm5hbWU6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICBub2RlLklzRWRpdE1vZGUgPSBmYWxzZTtcblxuICAgICAgICBpZiAoIW5vZGUuSXNOZXdOb2RlKSB7XG4gICAgICAgICAgICBpZiAoIW5ld0ZvbGRlcm5hbWUgfHwgbmV3Rm9sZGVybmFtZSA9PT0gbnVsbCB8fCBuZXdGb2xkZXJuYW1lLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIC8vIENhbmNlbCBSZW5hbWUuIEludmFsaWQgRm9sZGVybmFtZVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG5vZGUuTmFtZSAhPT0gbmV3Rm9sZGVybmFtZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuYnJvd3NlclNlcnZpY2VcbiAgICAgICAgICAgICAgICAgICAgLlJlbmFtZU5vZGUodGhpcy5hcGl1cmwsIG5vZGUuUGF0aCwgbmV3Rm9sZGVybmFtZSlcbiAgICAgICAgICAgICAgICAgICAgLnN1YnNjcmliZSgocmVzdWx0OiBJQnJvd3Nlck5vZGVSZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5OYW1lID0gcmVzdWx0Lk5vZGUuTmFtZTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRQYXRoVG9BbGxOb2RlcygpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICghbmV3Rm9sZGVybmFtZSB8fCBuZXdGb2xkZXJuYW1lID09PSBudWxsIHx8IG5ld0ZvbGRlcm5hbWUubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jbGVhck5ld0NoaWxkTm9kZXModGhpcy5yb290Tm9kZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBub2RlLk5hbWUgPSBuZXdGb2xkZXJuYW1lO1xuICAgICAgICAgICAgbm9kZS5Jc05ld05vZGUgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuYnJvd3NlclNlcnZpY2VcbiAgICAgICAgICAgICAgICAuU2F2ZU5vZGUodGhpcy5hcGl1cmwsIG5vZGUuUGF0aCwgbmV3Rm9sZGVybmFtZSlcbiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKChyZXN1bHQ6IElCcm93c2VyTm9kZVJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIG5vZGUuTmFtZSA9IHJlc3VsdC5Ob2RlLk5hbWU7XG4gICAgICAgICAgICAgICAgICAgIG5vZGUuRmlsZXMgPSByZXN1bHQuTm9kZS5GaWxlcztcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFBhdGhUb0FsbE5vZGVzKCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNZXRob2QgY2FsbGVkIHdoZW4gYSBmaWxlIGlzIHNlbGVjdGVkXG4gICAgICogQHBhcmFtIGZpbGUgRmlsZSB0aGF0IGlzIHNlbGVjdGVkXG4gICAgICovXG4gICAgcHVibGljIHNlbGVjdEZpbGUoZmlsZTogSUJyb3dzZXJGaWxlKSB7XG4gICAgICAgIGlmICghZmlsZS5Jc0VkaXRNb2RlKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkTm9kZS5GaWxlcy5mb3JFYWNoKChpdG0pID0+IChpdG0uSXNFZGl0TW9kZSA9IGZhbHNlKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuc2VsZWN0ZWROb2RlLlBhdGguZW5kc1dpdGgoJy8nKSkge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEZpbGUgPSB0aGlzLnNlbGVjdGVkTm9kZS5QYXRoICsgJy8nICsgZmlsZS5GaWxlbmFtZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRGaWxlID0gJy8nICsgZmlsZS5GaWxlbmFtZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRGaWxlSXRlbSA9IGZpbGU7XG4gICAgICAgIHRoaXMuZmlsZS5lbWl0KHRoaXMuc2VsZWN0ZWRGaWxlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNZXRob2QgY2FsbGVkIHdoZW4gYSBub2RlIGlzIHNlbGVjdGVkXG4gICAgICogQHBhcmFtIG5vZGUgTm9kZSB0aGF0IHNob3VsZCBiZSBzZWxlY3RlZFxuICAgICAqL1xuICAgIHB1YmxpYyBzZWxlY3ROb2RlKG5vZGU6IElCcm93c2VyTm9kZSk6IHZvaWQge1xuICAgICAgICBpZiAoIW5vZGUuSXNFeHBhbmRlZCkge1xuICAgICAgICAgICAgdGhpcy5zd2l0Y2hFeHBhbmROb2RlKG5vZGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmVzZXQgdGhlIEVkaXQgTW9kZSBpbiBhbGwgTm9kZXNcbiAgICAgICAgdGhpcy5yZXNldE5vZGVFZGl0TW9kZShudWxsKTtcblxuICAgICAgICBpZiAoIW5vZGUuRmlsZXMpIHtcbiAgICAgICAgICAgIHRoaXMuYnJvd3NlclNlcnZpY2VcbiAgICAgICAgICAgICAgICAuR2V0RmlsZXModGhpcy5hcGl1cmwsIG5vZGUuUGF0aCwgdGhpcy5hbGxvd2VkdHlwZXMpXG4gICAgICAgICAgICAgICAgLnN1YnNjcmliZSgocmVzdWx0OiBJQnJvd3NlckZpbGVSZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBub2RlLkZpbGVzID0gcmVzdWx0LkZpbGVzO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkTm9kZSA9IG5vZGU7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucHJlc2VsZWNlZGZpbGUgIT09IG51bGwgJiYgdGhpcy5wcmVzZWxlY2VkZmlsZS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmaWxlbmFtZSA9IHRoaXMucHJlc2VsZWNlZGZpbGUuc3Vic3RyaW5nKHRoaXMucHJlc2VsZWNlZGZpbGUubGFzdEluZGV4T2YoJy8nKSArIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmlsZSA9IG5vZGUuRmlsZXMuZmluZCgoaXRtKSA9PiBpdG0uRmlsZW5hbWUgPT09IGZpbGVuYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RGaWxlKGZpbGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkTm9kZSA9IG5vZGU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFeHBhbmQvY29sbGFwc2UgbWV0aG9kIGZvciBub2Rlc1xuICAgICAqIEBwYXJhbSBub2RlIE5vZGUgdGhhdCBzaG91bGQgYmUgb3BlbmVkIG9yIGNsb3NlZFxuICAgICAqL1xuICAgIHB1YmxpYyBzd2l0Y2hFeHBhbmROb2RlKG5vZGU6IElCcm93c2VyTm9kZSk6IHZvaWQge1xuICAgICAgICBpZiAobm9kZS5Jc0V4cGFuZGVkKSB7XG4gICAgICAgICAgICBub2RlLklzRXhwYW5kZWQgPSBmYWxzZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG5vZGUuSXNFeHBhbmRlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNZXRob2QgdGhhdCBtdXN0IGJlIGNhbGxlZCB3aGVuIGFuIHVwbG9hZCBpcyBjb21wbGV0ZWQuXG4gICAgICogQHBhcmFtIG5vZGUgTm9kZSB3aGVyZSB1cGxvYWRlZCBmaWxlcyBzaG91bGQgYmUgYXR0YWNoZWQuXG4gICAgICogQHBhcmFtIHVwbG9hZElkTGlzdCBMaXN0IG9mIHVwbG9hZCBJRHMgdGhhdCBmaW5pc2hlZCB1cGxvYWRpbmcuXG4gICAgICovXG4gICAgcHVibGljIHVwbG9hZENvbXBsZXRlKG5vZGU6IElCcm93c2VyTm9kZSwgdXBsb2FkSWRMaXN0OiBzdHJpbmdbXSk6IHZvaWQge1xuICAgICAgICBpZiAodXBsb2FkSWRMaXN0ICE9PSBudWxsKSB7XG4gICAgICAgICAgICB1cGxvYWRJZExpc3QuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnVwbG9hZHMuaW5kZXhPZihlbGVtZW50KSA8IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGxvYWRzLnB1c2goZWxlbWVudCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpZCA9IHRoaXMudXBsb2Fkcy5wb3AoKTtcbiAgICAgICAgaWYgKGlkKSB7XG4gICAgICAgICAgICB0aGlzLmJyb3dzZXJTZXJ2aWNlXG4gICAgICAgICAgICAgICAgLlNhdmVGaWxlKHRoaXMuYXBpdXJsLCBub2RlLlBhdGgsIGlkLCB0aGlzLmFsbG93ZWR0eXBlcylcbiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKChyZXN1bHQ6IElCcm93c2VyRmlsZVJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWROb2RlLkZpbGVzID0gcmVzdWx0LkZpbGVzO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnVwbG9hZGVkRmlsZU1vdmVkKGlkKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFic3RyYWN0IG1ldGhvZCBpbnZva2VkIHdoZW4gdGhlIHVwbG9hZGVkIGZpbGUgaGFzIGJlZW4gbW92ZWQgZnJvbSB0aGUgdGVtcCBmb2xkZXIgaW50byB0aGUgc3RydWN0dXJlLlxuICAgICAqIEBwYXJhbSB1cGxvYWRpZCBVcGxvYWQgSURcbiAgICAgKi9cbiAgICBwdWJsaWMgYWJzdHJhY3QgdXBsb2FkZWRGaWxlTW92ZWQodXBsb2FkaWQ6IHN0cmluZyk6IHZvaWQ7XG5cbiAgICAvLyAjZW5kcmVnaW9uIFB1YmxpYyBNZXRob2RzXG5cbiAgICAvLyAjcmVnaW9uIFByaXZhdGUgTWV0aG9kc1xuXG4gICAgLyoqXG4gICAgICogUmVjdXJzaXZlIG1ldGhvZCB0aGF0IHJlbW92ZXMgbmV3IG5vZGVzIGZyb20gdGhlIGdpdmVuIG5vZGUgYW5kIGFsbCBpdHMgY2hpbGRyZW5cbiAgICAgKiBAcGFyYW0gbm9kZSBOb2RlIGZyb20gd2hpY2ggYWxsIG5ldyBub2RlcyBzaG91bGQgYmUgcmVtb3ZlZC5cbiAgICAgKi9cbiAgICBwcml2YXRlIGNsZWFyTmV3Q2hpbGROb2Rlcyhub2RlOiBJQnJvd3Nlck5vZGUpIHtcbiAgICAgICAgbm9kZS5DaGlsZE5vZGVzLmZvckVhY2goKGl0bSkgPT4ge1xuICAgICAgICAgICAgaWYgKGl0bS5Jc05ld05vZGUpIHtcbiAgICAgICAgICAgICAgICBub2RlLkNoaWxkTm9kZXMuc3BsaWNlKG5vZGUuQ2hpbGROb2Rlcy5pbmRleE9mKGl0bSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBub2RlLkNoaWxkTm9kZXMuZm9yRWFjaCgoaXRtKSA9PiB0aGlzLmNsZWFyTmV3Q2hpbGROb2RlcyhpdG0pKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNZXRob2QgdGhhdCBnZW5lcmF0ZXMgdGhlIHBhdGggZm9yIGEgbm9kZVxuICAgICAqIEBwYXJhbSBub2RlIE5vZGUgZm9yIHdoaWNoIHRoZSBwYXRoIHNob3VsZCBiZSBnZW5lcmF0ZWRcbiAgICAgKiBAcGFyYW0gcGFyZW50UGF0aCBQYXJlbnQgcGF0aFxuICAgICAqL1xuICAgIHByaXZhdGUgZmlsbFBhdGgobm9kZTogSUJyb3dzZXJOb2RlLCBwYXJlbnRQYXRoOiBzdHJpbmcpIHtcbiAgICAgICAgbm9kZS5QYXRoID0gcGFyZW50UGF0aCArICcvJyArIG5vZGUuTmFtZTtcbiAgICAgICAgbm9kZS5DaGlsZE5vZGVzLmZvckVhY2goKGl0bSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5maWxsUGF0aChpdG0sIG5vZGUuUGF0aCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZpbmRzIHRoZSBwYXJlbnQgbm9kZSBpbiB0aGUgdHJlZVxuICAgICAqIEBwYXJhbSBub2RlIEN1cnJlbnQgbm9kZVxuICAgICAqIEBwYXJhbSBub2RlVG9GaW5kIE5vZGUgdG8gZmluZFxuICAgICAqIEByZXR1cm5zIFRoZSBub2RlIGlmIGZvdW5kLCBvdGhlcndpc2UgTlVMTFxuICAgICAqL1xuICAgIHByaXZhdGUgZmluZFBhcmVudE5vZGUobm9kZTogSUJyb3dzZXJOb2RlLCBub2RlVG9GaW5kOiBJQnJvd3Nlck5vZGUpOiBJQnJvd3Nlck5vZGUge1xuICAgICAgICBpZiAobm9kZS5DaGlsZE5vZGVzLmluZGV4T2Yobm9kZVRvRmluZCkgPj0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIG5vZGUuQ2hpbGROb2Rlcykge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5maW5kUGFyZW50Tm9kZShjaGlsZCwgbm9kZVRvRmluZCk7XG4gICAgICAgICAgICBpZiAocmVzdWx0ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZpbmRzIGEgbm9kZSBhY2NvcmRpbmcgdG8gYSBVUkwgcGF0aFxuICAgICAqIEBwYXJhbSBub2RlIE5vZGUgaW4gd2hpY2ggdG8gc2VhcmNoXG4gICAgICogQHBhcmFtIHBhdGggUGF0aCB0byBzZWFyY2ggZm9yXG4gICAgICogQHJldHVybnMgTm9kZSBtYXRjaGluZyB0aGUgcGF0aC4gUmV0dXJucyBOVUxMIGlmIG5vdCBmb3VuZFxuICAgICAqL1xuICAgIHByaXZhdGUgZmluZFNlbGVjdGVkTm9kZUJ5UGF0aChub2RlOiBJQnJvd3Nlck5vZGUsIHBhdGg6IHN0cmluZyk6IElCcm93c2VyTm9kZSB7XG4gICAgICAgIC8vIENhbmNlbCBpZiBwYXRoIGlzIG5vdCBkZWZpbmVkXG4gICAgICAgIGlmIChwYXRoID09PSB1bmRlZmluZWQgfHwgcGF0aCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTcGxpdCBwYXRoIGludG8gYXJyYXkgYW5kIHNldCB0aGUgcm9vdCBmb2xkZXIgbmFtZVxuICAgICAgICBjb25zdCBwYXRoQXJyYXkgPSBwYXRoLnNwbGl0KCcvJyk7XG4gICAgICAgIHBhdGhBcnJheVswXSA9IHRoaXMucm9vdE5vZGUuTmFtZTtcblxuICAgICAgICByZXR1cm4gdGhpcy5maW5kU2VsZWN0ZWROb2RlQnlQYXRoQXJyYXkobm9kZSwgcGF0aEFycmF5LCAwKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGaW5kcyBhIG5vZGUgYmFzZWQgb24gYW4gYXJyYXkgb2Ygbm9kZSBuYW1lc1xuICAgICAqIEBwYXJhbSBub2RlIE5vZGUgaW4gd2hpY2ggdG8gc2VhcmNoXG4gICAgICogQHBhcmFtIHBhdGggQXJyYXkgb2Ygbm9kZSBuYW1lcyByZXByZXNlbnRpbmcgdGhlIGhpZXJhcmNoeSBvZiB0aGUgcGF0aFxuICAgICAqIEBwYXJhbSBpbmRleCBDdXJyZW50IGluZGV4IGluIHRoZSBwYXRoIGFycmF5XG4gICAgICogQHJldHVybnMgTm9kZSBpZiBmb3VuZCwgb3RoZXJ3aXNlIE5VTExcbiAgICAgKi9cbiAgICBwcml2YXRlIGZpbmRTZWxlY3RlZE5vZGVCeVBhdGhBcnJheShub2RlOiBJQnJvd3Nlck5vZGUsIHBhdGg6IHN0cmluZ1tdLCBpbmRleDogbnVtYmVyKTogSUJyb3dzZXJOb2RlIHtcbiAgICAgICAgLy8gQ2hlY2sgaWYgZm9sZGVyIGlzIGNvcnJlY3QuIFJldHVybiB0aGUgbGFzdCBmb2xkZXIuIFRoZSBsYXN0IGluZGV4IGluIHBhdGggaXMgdGhlIGZpbGVuYW1lXG4gICAgICAgIGlmIChub2RlLk5hbWUgPT09IHBhdGhbaW5kZXhdICYmIHBhdGgubGVuZ3RoIC0gMiA9PT0gaW5kZXgpIHtcbiAgICAgICAgICAgIHJldHVybiBub2RlO1xuICAgICAgICB9IGVsc2UgaWYgKG5vZGUuTmFtZSA9PT0gcGF0aFtpbmRleF0pIHtcbiAgICAgICAgICAgIC8vIEV4cGFuZCBOb2RlXG4gICAgICAgICAgICBub2RlLklzRXhwYW5kZWQgPSB0cnVlO1xuICAgICAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIG5vZGUuQ2hpbGROb2Rlcykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuZmluZFNlbGVjdGVkTm9kZUJ5UGF0aEFycmF5KGl0ZW0sIHBhdGgsIGluZGV4ICsgMSk7XG5cbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlY3Vyc2l2ZSBtZXRob2QgdGhhdCBlbmRzIGVkaXQgbW9kZSBmb3IgdGhlIG5vZGUgYW5kIGFsbCBpdHMgY2hpbGRyZW4uXG4gICAgICogQHBhcmFtIG5vZGUgTm9kZSBmb3Igd2hpY2ggZWRpdCBtb2RlIHNob3VsZCBiZSBlbmRlZFxuICAgICAqL1xuICAgIHByaXZhdGUgcmVzZXROb2RlRWRpdE1vZGUobm9kZTogSUJyb3dzZXJOb2RlKTogdm9pZCB7XG4gICAgICAgIGlmIChub2RlID09PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLnJlc2V0Tm9kZUVkaXRNb2RlKHRoaXMucm9vdE5vZGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbm9kZS5Jc0VkaXRNb2RlID0gZmFsc2U7XG5cbiAgICAgICAgICAgIGlmIChub2RlLkNoaWxkTm9kZXMpIHtcbiAgICAgICAgICAgICAgICBub2RlLkNoaWxkTm9kZXMuZm9yRWFjaCgoaXRtKSA9PiB0aGlzLnJlc2V0Tm9kZUVkaXRNb2RlKGl0bSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgcGF0aCBpbiBhbGwgbm9kZXNcbiAgICAgKi9cbiAgICBwcml2YXRlIHNldFBhdGhUb0FsbE5vZGVzKCkge1xuICAgICAgICB0aGlzLnJvb3ROb2RlLkNoaWxkTm9kZXMuZm9yRWFjaCgoaXRtKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmZpbGxQYXRoKGl0bSwgJycpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyAjZW5kcmVnaW9uIFByaXZhdGUgTWV0aG9kc1xufVxuIl19
@@ -1 +1 @@
1
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJvd3NlcmZpbGUuanMiLCJzb3VyY2VSb290IjoiL2hvbWUvcnVubmVyL3dvcmsvc2ltcGxlYW5ndWxhcmNvbnRyb2xzL3NpbXBsZWFuZ3VsYXJjb250cm9scy9jaC5qbmV0d29yay5zYWMtY29udHJvbHMvcHJvamVjdHMvc2FjLWNvbW1vbi9zcmMvIiwic291cmNlcyI6WyJjb21wb25lbnRzL2Jyb3dzZXIvbW9kZWxzL2Jyb3dzZXJmaWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEludGVyZmFjZSBmw7xyIERhdGVpIEl0ZW1zIGluIEZpbGUgQnJvd3NlciBDb21wb25lbnRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJQnJvd3NlckZpbGUge1xuICAvKipcbiAgICogRGF0ZWluYW1lXG4gICAqL1xuICBGaWxlbmFtZTogc3RyaW5nO1xuICAvKipcbiAgICogR3LDtnNzZSBkZXIgRGF0ZWlcbiAgICovXG4gIFNpemU6IG51bWJlcjtcbiAgLyoqXG4gICAqIEl0ZW0gd2lyZCBiZWFyYmVpdGV0XG4gICAqL1xuICBJc0VkaXRNb2RlOiBib29sZWFuO1xufVxuIl19
1
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJvd3NlcmZpbGUuanMiLCJzb3VyY2VSb290IjoiL2hvbWUvcnVubmVyL3dvcmsvc2ltcGxlYW5ndWxhcmNvbnRyb2xzL3NpbXBsZWFuZ3VsYXJjb250cm9scy9jaC5qbmV0d29yay5zYWMtY29udHJvbHMvcHJvamVjdHMvc2FjLWNvbW1vbi9zcmMvIiwic291cmNlcyI6WyJjb21wb25lbnRzL2Jyb3dzZXIvbW9kZWxzL2Jyb3dzZXJmaWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEludGVyZmFjZSBmb3IgZmlsZSBpdGVtcyBpbiB0aGUgZmlsZSBicm93c2VyIGNvbXBvbmVudFxuICovXG5leHBvcnQgaW50ZXJmYWNlIElCcm93c2VyRmlsZSB7XG4gICAgLy8gI3JlZ2lvbiBQcm9wZXJ0aWVzXG5cbiAgICAvKipcbiAgICAgKiBGaWxlIG5hbWVcbiAgICAgKi9cbiAgICBGaWxlbmFtZTogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogSXRlbSBpcyBiZWluZyBlZGl0ZWRcbiAgICAgKi9cbiAgICBJc0VkaXRNb2RlOiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICogRmlsZSBzaXplXG4gICAgICovXG4gICAgU2l6ZTogbnVtYmVyO1xuXG4gICAgLy8gI2VuZHJlZ2lvbiBQcm9wZXJ0aWVzXG59XG4iXX0=