@i-novus/n2o-components 1.0.0

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 (241) hide show
  1. package/index.js +0 -0
  2. package/lib/display/Alerts/Alert.d.ts +2 -0
  3. package/lib/display/Alerts/Alert.js +121 -0
  4. package/lib/display/Alerts/AlertSection.d.ts +18 -0
  5. package/lib/display/Alerts/AlertSection.js +64 -0
  6. package/lib/display/Alerts/AlertWrapper.d.ts +6 -0
  7. package/lib/display/Alerts/AlertWrapper.js +39 -0
  8. package/lib/display/Alerts/DefaultAlert.d.ts +6 -0
  9. package/lib/display/Alerts/DefaultAlert.js +125 -0
  10. package/lib/display/Alerts/LoaderAlert.d.ts +5 -0
  11. package/lib/display/Alerts/LoaderAlert.js +36 -0
  12. package/lib/display/Alerts/types.d.ts +49 -0
  13. package/lib/display/Alerts/types.js +24 -0
  14. package/lib/display/Alerts/utils.d.ts +15 -0
  15. package/lib/display/Alerts/utils.js +102 -0
  16. package/lib/display/Badge/Badge.d.ts +16 -0
  17. package/lib/display/Badge/Badge.js +77 -0
  18. package/lib/display/Badge/enums.d.ts +9 -0
  19. package/lib/display/Badge/enums.js +23 -0
  20. package/lib/display/Badge/utils.d.ts +9 -0
  21. package/lib/display/Badge/utils.js +49 -0
  22. package/lib/display/Block.d.ts +369 -0
  23. package/lib/display/Block.js +38 -0
  24. package/lib/display/CodeViewer/CodeViewer.d.ts +13 -0
  25. package/lib/display/CodeViewer/CodeViewer.js +96 -0
  26. package/lib/display/Drawer/Drawer.d.ts +25 -0
  27. package/lib/display/Drawer/Drawer.js +99 -0
  28. package/lib/display/DropdownCustomItem.d.ts +7 -0
  29. package/lib/display/DropdownCustomItem.js +23 -0
  30. package/lib/display/Filter/Buttons.d.ts +11 -0
  31. package/lib/display/Filter/Buttons.js +42 -0
  32. package/lib/display/Filter/Filter.d.ts +8 -0
  33. package/lib/display/Filter/Filter.js +38 -0
  34. package/lib/display/HelpPopover.d.ts +16 -0
  35. package/lib/display/HelpPopover.js +104 -0
  36. package/lib/display/Html.d.ts +8 -0
  37. package/lib/display/Html.js +29 -0
  38. package/lib/display/Icon/Icon.d.ts +11 -0
  39. package/lib/display/Icon/Icon.js +42 -0
  40. package/lib/display/Image/Image.d.ts +30 -0
  41. package/lib/display/Image/Image.js +93 -0
  42. package/lib/display/Image/ImageInfo.d.ts +7 -0
  43. package/lib/display/Image/ImageInfo.js +23 -0
  44. package/lib/display/InputIcon.d.ts +13 -0
  45. package/lib/display/InputIcon.js +33 -0
  46. package/lib/display/NavItemImage/NavItemImage.d.ts +9 -0
  47. package/lib/display/NavItemImage/NavItemImage.js +35 -0
  48. package/lib/display/OutputList.d.ts +12 -0
  49. package/lib/display/OutputList.js +46 -0
  50. package/lib/display/OutputListItem.d.ts +10 -0
  51. package/lib/display/OutputListItem.js +58 -0
  52. package/lib/display/OutputText.d.ts +15 -0
  53. package/lib/display/OutputText.js +170 -0
  54. package/lib/display/Pagination/Pagination.d.ts +2 -0
  55. package/lib/display/Pagination/Pagination.js +273 -0
  56. package/lib/display/Pagination/PaginationButton.d.ts +13 -0
  57. package/lib/display/Pagination/PaginationButton.js +53 -0
  58. package/lib/display/Pagination/types.d.ts +62 -0
  59. package/lib/display/Pagination/types.js +36 -0
  60. package/lib/display/PopoverConfirm/PopoverConfirm.d.ts +30 -0
  61. package/lib/display/PopoverConfirm/PopoverConfirm.js +87 -0
  62. package/lib/display/ProgressControl/ProgressControl.d.ts +17 -0
  63. package/lib/display/ProgressControl/ProgressControl.js +68 -0
  64. package/lib/display/Slider.d.ts +23 -0
  65. package/lib/display/Slider.js +107 -0
  66. package/lib/display/Status.d.ts +9 -0
  67. package/lib/display/Status.js +40 -0
  68. package/lib/display/StatusText/StatusText.d.ts +10 -0
  69. package/lib/display/StatusText/StatusText.js +35 -0
  70. package/lib/display/StatusText/types.d.ts +18 -0
  71. package/lib/display/StatusText/types.js +19 -0
  72. package/lib/display/StatusText/utils.d.ts +3 -0
  73. package/lib/display/StatusText/utils.js +29 -0
  74. package/lib/display/Text.d.ts +12 -0
  75. package/lib/display/Text.js +38 -0
  76. package/lib/display/Typography/Base.d.ts +32 -0
  77. package/lib/display/Typography/Base.js +259 -0
  78. package/lib/display/Typography/ContentEditable.d.ts +15 -0
  79. package/lib/display/Typography/ContentEditable.js +86 -0
  80. package/lib/display/Typography/Paragraph.d.ts +4 -0
  81. package/lib/display/Typography/Paragraph.js +23 -0
  82. package/lib/display/Typography/Text.d.ts +9 -0
  83. package/lib/display/Typography/Text.js +37 -0
  84. package/lib/display/Typography/Title.d.ts +7 -0
  85. package/lib/display/Typography/Title.js +28 -0
  86. package/lib/display/Typography/utils.d.ts +13 -0
  87. package/lib/display/Typography/utils.js +75 -0
  88. package/lib/helpers/HelpPopover.d.ts +9 -0
  89. package/lib/helpers/HelpPopover.js +46 -0
  90. package/lib/helpers/withRightPlaceholder.d.ts +9 -0
  91. package/lib/helpers/withRightPlaceholder.js +35 -0
  92. package/lib/inputs/Checkbox/Checkbox.d.ts +29 -0
  93. package/lib/inputs/Checkbox/Checkbox.js +117 -0
  94. package/lib/inputs/Checkbox/CheckboxControl.d.ts +7 -0
  95. package/lib/inputs/Checkbox/CheckboxControl.js +33 -0
  96. package/lib/inputs/CheckboxGroup/CheckboxGroup.d.ts +11 -0
  97. package/lib/inputs/CheckboxGroup/CheckboxGroup.js +84 -0
  98. package/lib/inputs/CodeEditor/CodeEditor.d.ts +21 -0
  99. package/lib/inputs/CodeEditor/CodeEditor.js +85 -0
  100. package/lib/inputs/DatePicker/Calendar.d.ts +65 -0
  101. package/lib/inputs/DatePicker/Calendar.js +556 -0
  102. package/lib/inputs/DatePicker/CalendarHeader.d.ts +26 -0
  103. package/lib/inputs/DatePicker/CalendarHeader.js +213 -0
  104. package/lib/inputs/DatePicker/Clock.d.ts +10 -0
  105. package/lib/inputs/DatePicker/Clock.js +45 -0
  106. package/lib/inputs/DatePicker/DateInput.d.ts +44 -0
  107. package/lib/inputs/DatePicker/DateInput.js +262 -0
  108. package/lib/inputs/DatePicker/DateInputGroup.d.ts +20 -0
  109. package/lib/inputs/DatePicker/DateInputGroup.js +77 -0
  110. package/lib/inputs/DatePicker/DateInterval.d.ts +24 -0
  111. package/lib/inputs/DatePicker/DateInterval.js +92 -0
  112. package/lib/inputs/DatePicker/DatePicker.d.ts +22 -0
  113. package/lib/inputs/DatePicker/DatePicker.js +36 -0
  114. package/lib/inputs/DatePicker/DateTimeControl.d.ts +98 -0
  115. package/lib/inputs/DatePicker/DateTimeControl.js +452 -0
  116. package/lib/inputs/DatePicker/Day.d.ts +14 -0
  117. package/lib/inputs/DatePicker/Day.js +50 -0
  118. package/lib/inputs/DatePicker/PopUp.d.ts +19 -0
  119. package/lib/inputs/DatePicker/PopUp.js +71 -0
  120. package/lib/inputs/DatePicker/types.d.ts +31 -0
  121. package/lib/inputs/DatePicker/types.js +25 -0
  122. package/lib/inputs/DatePicker/utils.d.ts +39 -0
  123. package/lib/inputs/DatePicker/utils.js +304 -0
  124. package/lib/inputs/Input.d.ts +51 -0
  125. package/lib/inputs/Input.js +200 -0
  126. package/lib/inputs/InputMask/InputMask.d.ts +23 -0
  127. package/lib/inputs/InputMask/InputMask.js +310 -0
  128. package/lib/inputs/InputMoney/InputMoney.d.ts +101 -0
  129. package/lib/inputs/InputMoney/InputMoney.js +258 -0
  130. package/lib/inputs/InputNumber/InputNumber.d.ts +29 -0
  131. package/lib/inputs/InputNumber/InputNumber.js +316 -0
  132. package/lib/inputs/InputNumber/index.d.ts +1 -0
  133. package/lib/inputs/InputNumber/index.js +14 -0
  134. package/lib/inputs/InputNumber/types.d.ts +18 -0
  135. package/lib/inputs/InputNumber/types.js +14 -0
  136. package/lib/inputs/InputNumber/utils.d.ts +6 -0
  137. package/lib/inputs/InputNumber/utils.js +86 -0
  138. package/lib/inputs/InputPassword/InputPassword.d.ts +10 -0
  139. package/lib/inputs/InputPassword/InputPassword.js +81 -0
  140. package/lib/inputs/InputSelect/InputAddon.d.ts +17 -0
  141. package/lib/inputs/InputSelect/InputAddon.js +31 -0
  142. package/lib/inputs/InputSelect/InputContent.d.ts +63 -0
  143. package/lib/inputs/InputSelect/InputContent.js +188 -0
  144. package/lib/inputs/InputSelect/InputSelect.d.ts +296 -0
  145. package/lib/inputs/InputSelect/InputSelect.js +795 -0
  146. package/lib/inputs/InputSelect/InputSelectGroup.d.ts +43 -0
  147. package/lib/inputs/InputSelect/InputSelectGroup.js +113 -0
  148. package/lib/inputs/InputSelect/PopupItems.d.ts +55 -0
  149. package/lib/inputs/InputSelect/PopupItems.js +357 -0
  150. package/lib/inputs/InputSelect/PopupList.d.ts +82 -0
  151. package/lib/inputs/InputSelect/PopupList.js +138 -0
  152. package/lib/inputs/InputSelect/SelectedItems.d.ts +17 -0
  153. package/lib/inputs/InputSelect/SelectedItems.js +125 -0
  154. package/lib/inputs/InputSelect/constants.d.ts +4 -0
  155. package/lib/inputs/InputSelect/constants.js +15 -0
  156. package/lib/inputs/InputSelect/types.d.ts +16 -0
  157. package/lib/inputs/InputSelect/types.js +16 -0
  158. package/lib/inputs/InputSelect/utils.d.ts +9 -0
  159. package/lib/inputs/InputSelect/utils.js +142 -0
  160. package/lib/inputs/InputSelectTree/InputSelectTree.d.ts +114 -0
  161. package/lib/inputs/InputSelectTree/InputSelectTree.js +466 -0
  162. package/lib/inputs/InputSelectTree/TreeSelectNode.d.ts +36 -0
  163. package/lib/inputs/InputSelectTree/TreeSelectNode.js +63 -0
  164. package/lib/inputs/InputSelectTree/allProps.d.ts +123 -0
  165. package/lib/inputs/InputSelectTree/allProps.js +48 -0
  166. package/lib/inputs/InputSelectTree/until.d.ts +4 -0
  167. package/lib/inputs/InputSelectTree/until.js +83 -0
  168. package/lib/inputs/InputText.d.ts +41 -0
  169. package/lib/inputs/InputText.js +170 -0
  170. package/lib/inputs/NumberPicker/NumberPicker.d.ts +15 -0
  171. package/lib/inputs/NumberPicker/NumberPicker.js +129 -0
  172. package/lib/inputs/NumberPicker/NumberPickerButton.d.ts +8 -0
  173. package/lib/inputs/NumberPicker/NumberPickerButton.js +64 -0
  174. package/lib/inputs/NumberPicker/index.d.ts +1 -0
  175. package/lib/inputs/NumberPicker/index.js +14 -0
  176. package/lib/inputs/NumberPicker/utils.d.ts +2 -0
  177. package/lib/inputs/NumberPicker/utils.js +31 -0
  178. package/lib/inputs/RadioGroup/default/Group.d.ts +15 -0
  179. package/lib/inputs/RadioGroup/default/Group.js +63 -0
  180. package/lib/inputs/RadioGroup/default/Input.d.ts +17 -0
  181. package/lib/inputs/RadioGroup/default/Input.js +77 -0
  182. package/lib/inputs/RadioGroup/tabs/Group.d.ts +3 -0
  183. package/lib/inputs/RadioGroup/tabs/Group.js +24 -0
  184. package/lib/inputs/RadioGroup/tabs/Input.d.ts +3 -0
  185. package/lib/inputs/RadioGroup/tabs/Input.js +21 -0
  186. package/lib/inputs/Rating/Rating.d.ts +30 -0
  187. package/lib/inputs/Rating/Rating.js +212 -0
  188. package/lib/inputs/Select/Popup.d.ts +31 -0
  189. package/lib/inputs/Select/Popup.js +131 -0
  190. package/lib/inputs/Select/Select.d.ts +225 -0
  191. package/lib/inputs/Select/Select.js +705 -0
  192. package/lib/inputs/Select/SelectInput.d.ts +19 -0
  193. package/lib/inputs/Select/SelectInput.js +85 -0
  194. package/lib/inputs/Select/utils.d.ts +1 -0
  195. package/lib/inputs/Select/utils.js +28 -0
  196. package/lib/inputs/Switch/Switch.d.ts +11 -0
  197. package/lib/inputs/Switch/Switch.js +41 -0
  198. package/lib/inputs/TextArea.d.ts +12 -0
  199. package/lib/inputs/TextArea.js +54 -0
  200. package/lib/inputs/TextEditor/TextEditor.d.ts +11 -0
  201. package/lib/inputs/TextEditor/TextEditor.js +89 -0
  202. package/lib/inputs/TimePicker/TimePicker.d.ts +50 -0
  203. package/lib/inputs/TimePicker/TimePicker.js +398 -0
  204. package/lib/inputs/utils.d.ts +5 -0
  205. package/lib/inputs/utils.js +39 -0
  206. package/lib/layouts/ScrollContainer.d.ts +218 -0
  207. package/lib/layouts/ScrollContainer.js +128 -0
  208. package/lib/layouts/Spinner/CoverSpinner.d.ts +29 -0
  209. package/lib/layouts/Spinner/CoverSpinner.js +153 -0
  210. package/lib/layouts/Spinner/InlineSpinner.d.ts +5 -0
  211. package/lib/layouts/Spinner/InlineSpinner.js +27 -0
  212. package/lib/layouts/Spinner/Spinner.d.ts +31 -0
  213. package/lib/layouts/Spinner/Spinner.js +178 -0
  214. package/lib/styles/components/Calendar.scss +125 -0
  215. package/lib/styles/components/CalendarHeader.scss +75 -0
  216. package/lib/styles/components/DateInputGroup.scss +39 -0
  217. package/lib/styles/components/DatePicker.scss +18 -0
  218. package/lib/styles/components/Day.scss +29 -0
  219. package/lib/styles/components/OutputList.scss +14 -0
  220. package/lib/styles/components/OutputText.scss +50 -0
  221. package/lib/styles/controls/CodeEditor.scss +4 -0
  222. package/lib/styles/controls/InputNumber.scss +36 -0
  223. package/lib/styles/controls/InputPassword.scss +17 -0
  224. package/lib/styles/controls/InputText.scss +59 -0
  225. package/lib/styles/controls/NumberPicker.scss +36 -0
  226. package/lib/styles/controls/ProgressControl.scss +3 -0
  227. package/lib/styles/controls/Slider.scss +32 -0
  228. package/lib/styles/controls/Switch.scss +105 -0
  229. package/lib/styles/controls/TextEditor.scss +23 -0
  230. package/lib/styles/controls/TimePicker.scss +32 -0
  231. package/lib/styles/n2o/variables.scss +328 -0
  232. package/lib/styles/theme/variables.scss +81 -0
  233. package/lib/styles/variables.scss +10 -0
  234. package/lib/types.d.ts +25 -0
  235. package/lib/types.js +6 -0
  236. package/lib/utils/id.d.ts +3 -0
  237. package/lib/utils/id.js +46 -0
  238. package/lib/utils/isEmptyModel.d.ts +1 -0
  239. package/lib/utils/isEmptyModel.js +21 -0
  240. package/lib/utils/parseFormatter.js +153 -0
  241. package/package.json +196 -0
@@ -0,0 +1,114 @@
1
+ import { ReactNode } from 'react';
2
+ import { Filter, TOption } from '../InputSelect/types';
3
+ import { TreeNode } from './TreeSelectNode';
4
+ /**
5
+ * @reactProps {function} onBlur
6
+ * @reactProps {string} placeholder
7
+ * @reactProps {function} setTreeExpandedKeys
8
+ * @reactProps {array} treeExpandedKeys
9
+ * @reactProps {node} children
10
+ * @returns {*}
11
+ * @constructor
12
+ * @param props
13
+ */
14
+ declare function InputSelectTree({ t, fetchData, onFocus, value, onBlur, placeholder, notFoundContent, loading, parentFieldId, valueFieldId, labelFieldId, iconFieldId, imageFieldId, badge, hasChildrenFieldId, options, onSearch, onSelect, onChange, hasCheckboxes, filter, multiSelect, children, onClose, onToggle, ajax, className, showCheckedStrategy, maxTagTextLength, disabled, }: Props): JSX.Element;
15
+ declare namespace InputSelectTree {
16
+ var defaultProps: Props;
17
+ }
18
+ declare type Props = {
19
+ /**
20
+ * Флаг динамичексой подгрузки данных. В данных обязательно указывать параметр hasChildrens
21
+ */
22
+ ajax?: boolean;
23
+ /**
24
+ * Данные для badge
25
+ */
26
+ badge: object;
27
+ children: ReactNode;
28
+ className?: string;
29
+ /**
30
+ * Флаг неактивности
31
+ */
32
+ disabled: boolean;
33
+ /**
34
+ * Callback на открытие
35
+ */
36
+ fetchData?: any;
37
+ /**
38
+ * Варианты фильтрации
39
+ */
40
+ filter: Filter;
41
+ /**
42
+ * Флаг для показа чекбоксов в элементах дерева. Переводит InputSelectTree в мульти режим
43
+ */
44
+ hasCheckboxes: boolean;
45
+ /**
46
+ * Значение ключа hasChildren в данных
47
+ */
48
+ hasChildrenFieldId: string;
49
+ /**
50
+ * Значение ключа icon в данных
51
+ */
52
+ iconFieldId: string;
53
+ /**
54
+ * Значение ключа image в данных
55
+ */
56
+ imageFieldId: string;
57
+ /**
58
+ * Значение ключа label в данных
59
+ */
60
+ labelFieldId: string;
61
+ /**
62
+ * Флаг анимации загрузки
63
+ */
64
+ loading: boolean;
65
+ /**
66
+ * Количество символов выбранных элементов в chechbox режиме
67
+ */
68
+ maxTagTextLength: number;
69
+ /**
70
+ * Мульти выбор значений
71
+ */
72
+ multiSelect: boolean;
73
+ notFoundContent?: any;
74
+ onBlur(arg?: Props['value']): void;
75
+ /**
76
+ * Calback изменения
77
+ */
78
+ onChange(arg: Props['value']): void;
79
+ /**
80
+ * Callback на закрытие
81
+ */
82
+ onClose(): void;
83
+ onFocus(): void;
84
+ /**
85
+ * Callback на поиск
86
+ */
87
+ onSearch(arg: Props['value']): void;
88
+ onSelect(arg: Props['value']): void;
89
+ onToggle(arg: boolean): void;
90
+ /**
91
+ * Данные для построения дерева
92
+ */
93
+ options: TOption[];
94
+ /**
95
+ * Значение ключа parent в данных
96
+ */
97
+ parentFieldId: string;
98
+ /**
99
+ * Placeholder контрола
100
+ */
101
+ placeholder: string;
102
+ showCheckedStrategy: string;
103
+ t(arg: string): void;
104
+ /**
105
+ * Значение
106
+ */
107
+ value?: any;
108
+ /**
109
+ * Значение ключа value в данных
110
+ */
111
+ valueFieldId: string;
112
+ };
113
+ export { TreeNode, InputSelectTree };
114
+ export declare const InputSelectTreeComponent: any;
@@ -0,0 +1,466 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ var _typeof = require("@babel/runtime/helpers/typeof");
6
+
7
+ Object.defineProperty(exports, "__esModule", {
8
+ value: true
9
+ });
10
+ exports.InputSelectTree = InputSelectTree;
11
+ Object.defineProperty(exports, "TreeNode", {
12
+ enumerable: true,
13
+ get: function get() {
14
+ return _TreeSelectNode.TreeNode;
15
+ }
16
+ });
17
+ exports.InputSelectTreeComponent = void 0;
18
+
19
+ var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
20
+
21
+ var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
22
+
23
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
24
+
25
+ var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
26
+
27
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
28
+
29
+ var _react = _interopRequireWildcard(require("react"));
30
+
31
+ var _rcTreeSelect = _interopRequireDefault(require("rc-tree-select"));
32
+
33
+ var _difference = _interopRequireDefault(require("lodash/difference"));
34
+
35
+ var _filter = _interopRequireDefault(require("lodash/filter"));
36
+
37
+ var _find = _interopRequireDefault(require("lodash/find"));
38
+
39
+ var _isArray = _interopRequireDefault(require("lodash/isArray"));
40
+
41
+ var _isEmpty = _interopRequireDefault(require("lodash/isEmpty"));
42
+
43
+ var _keys = _interopRequireDefault(require("lodash/keys"));
44
+
45
+ var _map = _interopRequireDefault(require("lodash/map"));
46
+
47
+ var _some = _interopRequireDefault(require("lodash/some"));
48
+
49
+ var _classnames = _interopRequireDefault(require("classnames"));
50
+
51
+ var _reactI18next = require("react-i18next");
52
+
53
+ var _reactOnclickoutside = _interopRequireDefault(require("react-onclickoutside"));
54
+
55
+ var _Icon = require("../../display/Icon/Icon");
56
+
57
+ var _InlineSpinner = require("../../layouts/Spinner/InlineSpinner");
58
+
59
+ var _Checkbox = require("../Checkbox/Checkbox");
60
+
61
+ var _TreeSelectNode = require("./TreeSelectNode");
62
+
63
+ var _until = require("./until");
64
+
65
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
66
+
67
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
68
+
69
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
70
+
71
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
72
+
73
+ var renderSwitcherIcon = function renderSwitcherIcon(_ref) {
74
+ var isLeaf = _ref.isLeaf;
75
+ return isLeaf ? null : /*#__PURE__*/_react["default"].createElement(_Icon.Icon, {
76
+ name: "fa fa-chevron-right"
77
+ });
78
+ }; // eslint-disable-next-line @typescript-eslint/no-explicit-any
79
+
80
+
81
+ var getPopupContainer = function getPopupContainer(container) {
82
+ return container;
83
+ };
84
+ /**
85
+ * Взять данные по ids.
86
+ * ['id', 'id'] => [{ id: 'id', ... },{ id: 'id', ... }]
87
+ * @param options
88
+ * @param ids
89
+ * @param valueFieldId
90
+ */
91
+
92
+
93
+ var getDataByIds = function getDataByIds(options, ids, valueFieldId) {
94
+ return (0, _filter["default"])(options, function (node) {
95
+ return (0, _some["default"])(ids, function (v) {
96
+ return v === node[valueFieldId];
97
+ });
98
+ });
99
+ };
100
+
101
+ var getSingleValue = function getSingleValue(options, value, valueFieldId) {
102
+ return (0, _find["default"])(options, [valueFieldId, value]);
103
+ };
104
+
105
+ var getMultiValue = function getMultiValue(options, value, valueFieldId) {
106
+ return getDataByIds(options, value, valueFieldId);
107
+ };
108
+ /**
109
+ * Функция преобразования value rcTreeSelect в формат n2o
110
+ * Производит поиск по родителям и потомкам.
111
+ * rcTreeSelect не дает информации о выделенных потомках при моде 'SHOW_PARENT'
112
+ * и о выделенных родителях при 'SHOW_CHILD'
113
+ * ['id', 'id'] => [{ id: 'id', ... },{ id: 'id', ... }]
114
+ * @param options
115
+ * @param value
116
+ * @param multiSelect
117
+ * @param valueFieldId
118
+ * @returns {*}
119
+ */
120
+
121
+
122
+ var getItemByValue = function getItemByValue(options, value, multiSelect, valueFieldId) {
123
+ if (!value) {
124
+ return null;
125
+ }
126
+
127
+ if (!multiSelect) {
128
+ return getSingleValue(options, value, valueFieldId);
129
+ }
130
+
131
+ return getMultiValue(options, value, valueFieldId);
132
+ };
133
+ /**
134
+ * @reactProps {function} onBlur
135
+ * @reactProps {string} placeholder
136
+ * @reactProps {function} setTreeExpandedKeys
137
+ * @reactProps {array} treeExpandedKeys
138
+ * @reactProps {node} children
139
+ * @returns {*}
140
+ * @constructor
141
+ * @param props
142
+ */
143
+ // TODO переделать в класс
144
+
145
+
146
+ function InputSelectTree(_ref2) {
147
+ var t = _ref2.t,
148
+ fetchData = _ref2.fetchData,
149
+ onFocus = _ref2.onFocus,
150
+ value = _ref2.value,
151
+ onBlur = _ref2.onBlur,
152
+ placeholder = _ref2.placeholder,
153
+ _ref2$notFoundContent = _ref2.notFoundContent,
154
+ notFoundContent = _ref2$notFoundContent === void 0 ? t('noData') : _ref2$notFoundContent,
155
+ loading = _ref2.loading,
156
+ parentFieldId = _ref2.parentFieldId,
157
+ valueFieldId = _ref2.valueFieldId,
158
+ labelFieldId = _ref2.labelFieldId,
159
+ iconFieldId = _ref2.iconFieldId,
160
+ imageFieldId = _ref2.imageFieldId,
161
+ badge = _ref2.badge,
162
+ hasChildrenFieldId = _ref2.hasChildrenFieldId,
163
+ options = _ref2.options,
164
+ onSearch = _ref2.onSearch,
165
+ onSelect = _ref2.onSelect,
166
+ onChange = _ref2.onChange,
167
+ hasCheckboxes = _ref2.hasCheckboxes,
168
+ filter = _ref2.filter,
169
+ multiSelect = _ref2.multiSelect,
170
+ children = _ref2.children,
171
+ onClose = _ref2.onClose,
172
+ onToggle = _ref2.onToggle,
173
+ ajax = _ref2.ajax,
174
+ className = _ref2.className,
175
+ showCheckedStrategy = _ref2.showCheckedStrategy,
176
+ maxTagTextLength = _ref2.maxTagTextLength,
177
+ disabled = _ref2.disabled;
178
+ var treeExpandedKeys = (0, _react.useRef)([]);
179
+
180
+ var _useState = (0, _react.useState)(''),
181
+ _useState2 = (0, _slicedToArray2["default"])(_useState, 2),
182
+ searchValue = _useState2[0],
183
+ setSearchValue = _useState2[1]; // eslint-disable-next-line @typescript-eslint/no-explicit-any
184
+
185
+
186
+ InputSelectTree.handleClickOutside = function () {
187
+ return setSearchValue('');
188
+ };
189
+ /**
190
+ * Функуия для создания дерева.
191
+ * Преобразует коллекцию вида [..., { ... }] в [ ..., {..., children: [...]}]
192
+ * Вложение происходит при совпадении valueFieldId и parentFieldId.
193
+ * @param items
194
+ * @returns {*}
195
+ */
196
+
197
+
198
+ var treeData = (0, _react.useMemo)(function () {
199
+ var popupProps = {
200
+ prefixCls: 'n2o-select-tree',
201
+ iconFieldId: iconFieldId,
202
+ imageFieldId: imageFieldId,
203
+ labelFieldId: labelFieldId,
204
+ badge: badge
205
+ };
206
+ var items = options || [];
207
+ var itemsByID = (0, _toConsumableArray2["default"])(items).reduce(function (acc, item) {
208
+ return _objectSpread(_objectSpread({}, acc), {}, (0, _defineProperty2["default"])({}, item[valueFieldId], _objectSpread(_objectSpread(_objectSpread({}, item), {}, {
209
+ key: item[valueFieldId],
210
+ value: item[valueFieldId],
211
+ title: item.formattedTitle || (0, _until.visiblePartPopup)(item, popupProps)
212
+ }, ajax && {
213
+ isLeaf: !item[hasChildrenFieldId]
214
+ }), {}, {
215
+ children: []
216
+ })));
217
+ }, {} // eslint-disable-next-line @typescript-eslint/no-explicit-any
218
+ );
219
+ (0, _keys["default"])(itemsByID).forEach(function (key) {
220
+ if (itemsByID[key][parentFieldId] && itemsByID[itemsByID[key][parentFieldId]] && itemsByID[itemsByID[key][parentFieldId]].children) {
221
+ itemsByID[itemsByID[key][parentFieldId]].children.push(_objectSpread({}, itemsByID[key]));
222
+ }
223
+ });
224
+ return (0, _keys["default"])(itemsByID).filter(function (key) {
225
+ if (!itemsByID[key][parentFieldId]) {
226
+ return true;
227
+ }
228
+
229
+ return !!(itemsByID[key][parentFieldId] && // eslint-disable-next-line no-prototype-builtins
230
+ !itemsByID.hasOwnProperty(itemsByID[key][parentFieldId]));
231
+ }) // eslint-disable-next-line @typescript-eslint/no-explicit-any
232
+ .reduce(function (acc, key) {
233
+ return [].concat((0, _toConsumableArray2["default"])(acc), [_objectSpread({}, itemsByID[key])]);
234
+ }, []);
235
+ }, [ajax, badge, options, hasChildrenFieldId, iconFieldId, imageFieldId, labelFieldId, parentFieldId, valueFieldId]);
236
+ /**
237
+ * Функция для поиска.
238
+ * При поиске вызов функции происходит для каждого элемента дерева.
239
+ * @param input
240
+ * @param node
241
+ * @returns {*}
242
+ */
243
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
244
+
245
+ var handlerFilter = (0, _react.useCallback)(function (input, node) {
246
+ var mode = ['includes', 'startsWith', 'endsWith'];
247
+
248
+ if (mode.includes(filter)) {
249
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
250
+ return String.prototype[filter].call(node.props[labelFieldId].toLowerCase(), input.toLowerCase());
251
+ }
252
+
253
+ return true;
254
+ }, [filter, labelFieldId]);
255
+ /**
256
+ * Функция для обратного преобразования value n2o в формат rcTreeSelect
257
+ * ['id', 'id'] => [{ id: 'id', ... },{ id: 'id', ... }]
258
+ * @param value
259
+ * @returns {*}
260
+ */
261
+
262
+ var setValue = function setValue(value) {
263
+ if (!value) {
264
+ return [];
265
+ }
266
+
267
+ if ((0, _isArray["default"])(value)) {
268
+ return (0, _map["default"])(value, function (v) {
269
+ return v[valueFieldId];
270
+ });
271
+ }
272
+
273
+ return value[valueFieldId];
274
+ };
275
+ /**
276
+ * Функция для переопределения onChange
277
+ * @param value
278
+ */
279
+
280
+
281
+ var handleChange = (0, _react.useCallback)(function (value) {
282
+ onChange(getItemByValue(options, value, multiSelect, valueFieldId));
283
+ onBlur(getItemByValue(options, value, multiSelect, valueFieldId)); // eslint-disable-next-line react-hooks/exhaustive-deps
284
+ }, [options, multiSelect, onChange, valueFieldId]);
285
+ /**
286
+ * Функция для переопределения onSelect
287
+ * @param value
288
+ */
289
+
290
+ var handleSelect = (0, _react.useCallback)(function (value) {
291
+ onSelect(getItemByValue(options, value, multiSelect, valueFieldId));
292
+ onBlur(); // eslint-disable-next-line react-hooks/exhaustive-deps
293
+ }, [options, multiSelect, onSelect, valueFieldId]);
294
+ /**
295
+ * Функция для переопределения onSearch
296
+ * @param value
297
+ */
298
+
299
+ var handleSearch = (0, _react.useCallback)(function (value) {
300
+ setSearchValue(value);
301
+ onSearch(value);
302
+ return true;
303
+ }, [onSearch]);
304
+ var clearSearch = (0, _react.useCallback)(function () {
305
+ setSearchValue('');
306
+ }, []);
307
+ /**
308
+ * Функция для контроля открытия/закрытия popup
309
+ * @param visible
310
+ * @returns {boolean}
311
+ */
312
+
313
+ var handleDropdownVisibleChange = (0, _react.useCallback)(function (visible) {
314
+ if (visible) {
315
+ onFocus();
316
+ } // onToggle(visible)
317
+ // setDropdownExpanded(visible)
318
+
319
+
320
+ if (visible && !options.length) {
321
+ fetchData();
322
+ } else {
323
+ onClose();
324
+ }
325
+
326
+ if (ajax) {
327
+ treeExpandedKeys.current = [];
328
+ }
329
+
330
+ return false; // eslint-disable-next-line react-hooks/exhaustive-deps
331
+ }, [ajax, onClose, onFocus, fetchData, onToggle]);
332
+ /**
333
+ * Функция для контроля открытия/закрытия элемента дерева
334
+ * @param keys
335
+ */
336
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
337
+
338
+ var onTreeExpand = (0, _react.useCallback)( /*#__PURE__*/function () {
339
+ var _ref3 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee(keys) {
340
+ var currentKey;
341
+ return _regenerator["default"].wrap(function _callee$(_context) {
342
+ while (1) {
343
+ switch (_context.prev = _context.next) {
344
+ case 0:
345
+ currentKey = (0, _difference["default"])(keys, treeExpandedKeys.current);
346
+
347
+ if (!ajax) {
348
+ _context.next = 4;
349
+ break;
350
+ }
351
+
352
+ _context.next = 4;
353
+ return fetchData({
354
+ 'filter.parent_id': currentKey[0]
355
+ }, true);
356
+
357
+ case 4:
358
+ treeExpandedKeys.current = keys;
359
+
360
+ case 5:
361
+ case "end":
362
+ return _context.stop();
363
+ }
364
+ }
365
+ }, _callee);
366
+ }));
367
+
368
+ return function (_x) {
369
+ return _ref3.apply(this, arguments);
370
+ };
371
+ }(), [ajax, fetchData]);
372
+
373
+ var clearIcon = /*#__PURE__*/_react["default"].createElement(_Icon.Icon, {
374
+ onClick: clearSearch,
375
+ name: "fa fa-times n2o-input-select-tree__clear-icon"
376
+ });
377
+
378
+ return /*#__PURE__*/_react["default"].createElement("div", {
379
+ className: (0, _classnames["default"])('n2o-select-tree-container', className, {
380
+ empty: (0, _isEmpty["default"])(value),
381
+ multi: multiSelect,
382
+ single: !multiSelect
383
+ })
384
+ }, /*#__PURE__*/_react["default"].createElement(_rcTreeSelect["default"], {
385
+ allowClear: !(0, _isEmpty["default"])(value),
386
+ value: setValue(value),
387
+ onDropdownVisibleChange: handleDropdownVisibleChange,
388
+ switcherIcon: renderSwitcherIcon,
389
+ suffixIcon: /*#__PURE__*/_react["default"].createElement(_Icon.Icon, {
390
+ name: "fa fa-chevron-down"
391
+ }),
392
+ multiple: multiSelect,
393
+ treeCheckable: hasCheckboxes && /*#__PURE__*/_react["default"].createElement(_Checkbox.Checkbox, {
394
+ inline: true
395
+ }),
396
+ treeData: treeData,
397
+ filterTreeNode: handlerFilter,
398
+ treeNodeFilterProp: labelFieldId,
399
+ treeNodeLabelProp: labelFieldId,
400
+ maxTagTextLength: maxTagTextLength,
401
+ clearIcon: clearIcon // иконка очищения всего инпута
402
+ ,
403
+ removeIcon: (0, _isEmpty["default"])(value) ? null : clearIcon // иконка очищения итема
404
+ ,
405
+ onChange: handleChange,
406
+ onSelect: handleSelect,
407
+ onSearch: handleSearch,
408
+ onTreeExpand: onTreeExpand,
409
+ showCheckedStrategy: (0, _until.getCheckedStrategy)(showCheckedStrategy),
410
+ getPopupContainer: getPopupContainer,
411
+ notFoundContent: loading ? /*#__PURE__*/_react["default"].createElement(_InlineSpinner.InlineSpinner, null) : notFoundContent,
412
+ placeholder: searchValue ? null : placeholder,
413
+ disabled: disabled,
414
+ searchValue: searchValue,
415
+ showSearch: !multiSelect,
416
+ listHeight: 400,
417
+ prefixCls: "n2o-select-tree"
418
+ }, children));
419
+ }
420
+
421
+ InputSelectTree.defaultProps = {
422
+ children: null,
423
+ hasChildrenFieldId: 'hasChildren',
424
+ disabled: false,
425
+ loading: false,
426
+ parentFieldId: 'parentId',
427
+ valueFieldId: 'id',
428
+ labelFieldId: 'name',
429
+ iconFieldId: 'icon',
430
+ badge: {
431
+ fieldId: 'badge',
432
+ colorFieldId: 'color'
433
+ },
434
+ imageFieldId: 'image',
435
+ sortFieldId: 'name',
436
+ filter: 'startsWith',
437
+ hasCheckboxes: false,
438
+ multiSelect: false,
439
+ options: [],
440
+ transitionName: 'slide-up',
441
+ choiceTransitionName: 'zoom',
442
+ showCheckedStrategy: 'all',
443
+ allowClear: true,
444
+ placeholder: '',
445
+ showSearch: true,
446
+ maxTagTextLength: 10,
447
+ onSearch: function onSearch() {},
448
+ onSelect: function onSelect() {},
449
+ onChange: function onChange() {},
450
+ onClose: function onClose() {},
451
+ onToggle: function onToggle() {},
452
+ onFocus: function onFocus() {},
453
+ onBlur: function onBlur() {},
454
+ onInput: function onInput() {},
455
+ t: function t() {}
456
+ };
457
+ var clickOutsideConfig = {
458
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
459
+ handleClickOutside: function handleClickOutside() {
460
+ return InputSelectTree.handleClickOutside;
461
+ }
462
+ };
463
+ var InputSelectTreeComponent = // eslint-disable-next-line @typescript-eslint/no-explicit-any
464
+ (0, _reactOnclickoutside["default"])((0, _reactI18next.withTranslation)()(InputSelectTree), clickOutsideConfig);
465
+ exports.InputSelectTreeComponent = InputSelectTreeComponent;
466
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9pbnB1dHMvSW5wdXRTZWxlY3RUcmVlL0lucHV0U2VsZWN0VHJlZS50c3giXSwibmFtZXMiOlsicmVuZGVyU3dpdGNoZXJJY29uIiwiaXNMZWFmIiwiZ2V0UG9wdXBDb250YWluZXIiLCJjb250YWluZXIiLCJnZXREYXRhQnlJZHMiLCJvcHRpb25zIiwiaWRzIiwidmFsdWVGaWVsZElkIiwibm9kZSIsInYiLCJnZXRTaW5nbGVWYWx1ZSIsInZhbHVlIiwiZ2V0TXVsdGlWYWx1ZSIsImdldEl0ZW1CeVZhbHVlIiwibXVsdGlTZWxlY3QiLCJJbnB1dFNlbGVjdFRyZWUiLCJ0IiwiZmV0Y2hEYXRhIiwib25Gb2N1cyIsIm9uQmx1ciIsInBsYWNlaG9sZGVyIiwibm90Rm91bmRDb250ZW50IiwibG9hZGluZyIsInBhcmVudEZpZWxkSWQiLCJsYWJlbEZpZWxkSWQiLCJpY29uRmllbGRJZCIsImltYWdlRmllbGRJZCIsImJhZGdlIiwiaGFzQ2hpbGRyZW5GaWVsZElkIiwib25TZWFyY2giLCJvblNlbGVjdCIsIm9uQ2hhbmdlIiwiaGFzQ2hlY2tib3hlcyIsImZpbHRlciIsImNoaWxkcmVuIiwib25DbG9zZSIsIm9uVG9nZ2xlIiwiYWpheCIsImNsYXNzTmFtZSIsInNob3dDaGVja2VkU3RyYXRlZ3kiLCJtYXhUYWdUZXh0TGVuZ3RoIiwiZGlzYWJsZWQiLCJ0cmVlRXhwYW5kZWRLZXlzIiwic2VhcmNoVmFsdWUiLCJzZXRTZWFyY2hWYWx1ZSIsImhhbmRsZUNsaWNrT3V0c2lkZSIsInRyZWVEYXRhIiwicG9wdXBQcm9wcyIsInByZWZpeENscyIsIml0ZW1zIiwiaXRlbXNCeUlEIiwicmVkdWNlIiwiYWNjIiwiaXRlbSIsImtleSIsInRpdGxlIiwiZm9ybWF0dGVkVGl0bGUiLCJmb3JFYWNoIiwicHVzaCIsImhhc093blByb3BlcnR5IiwiaGFuZGxlckZpbHRlciIsImlucHV0IiwibW9kZSIsImluY2x1ZGVzIiwiU3RyaW5nIiwicHJvdG90eXBlIiwiY2FsbCIsInByb3BzIiwidG9Mb3dlckNhc2UiLCJzZXRWYWx1ZSIsImhhbmRsZUNoYW5nZSIsImhhbmRsZVNlbGVjdCIsImhhbmRsZVNlYXJjaCIsImNsZWFyU2VhcmNoIiwiaGFuZGxlRHJvcGRvd25WaXNpYmxlQ2hhbmdlIiwidmlzaWJsZSIsImxlbmd0aCIsImN1cnJlbnQiLCJvblRyZWVFeHBhbmQiLCJrZXlzIiwiY3VycmVudEtleSIsImNsZWFySWNvbiIsImVtcHR5IiwibXVsdGkiLCJzaW5nbGUiLCJkZWZhdWx0UHJvcHMiLCJmaWVsZElkIiwiY29sb3JGaWVsZElkIiwic29ydEZpZWxkSWQiLCJ0cmFuc2l0aW9uTmFtZSIsImNob2ljZVRyYW5zaXRpb25OYW1lIiwiYWxsb3dDbGVhciIsInNob3dTZWFyY2giLCJvbklucHV0IiwiY2xpY2tPdXRzaWRlQ29uZmlnIiwiSW5wdXRTZWxlY3RUcmVlQ29tcG9uZW50Il0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBR0E7O0FBQ0E7O0FBQ0E7O0FBRUE7O0FBQ0E7Ozs7Ozs7Ozs7QUFFQSxJQUFNQSxrQkFBa0IsR0FBRyxTQUFyQkEsa0JBQXFCO0FBQUEsTUFBR0MsTUFBSCxRQUFHQSxNQUFIO0FBQUEsU0FBb0NBLE1BQU0sR0FBRyxJQUFILGdCQUFVLGdDQUFDLFVBQUQ7QUFBTSxJQUFBLElBQUksRUFBQztBQUFYLElBQXBEO0FBQUEsQ0FBM0IsQyxDQUNBOzs7QUFDQSxJQUFNQyxpQkFBaUIsR0FBRyxTQUFwQkEsaUJBQW9CLENBQUNDLFNBQUQ7QUFBQSxTQUFvQkEsU0FBcEI7QUFBQSxDQUExQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFDQSxJQUFNQyxZQUFZLEdBQUcsU0FBZkEsWUFBZSxDQUFDQyxPQUFELEVBQTRCQyxHQUE1QixFQUEyQ0MsWUFBM0M7QUFBQSxTQUFtRix3QkFBUUYsT0FBUixFQUFpQixVQUFBRyxJQUFJO0FBQUEsV0FBSSxzQkFBS0YsR0FBTCxFQUFVLFVBQUFHLENBQUM7QUFBQSxhQUFJQSxDQUFDLEtBQUtELElBQUksQ0FBQ0QsWUFBRCxDQUFkO0FBQUEsS0FBWCxDQUFKO0FBQUEsR0FBckIsQ0FBbkY7QUFBQSxDQUFyQjs7QUFFQSxJQUFNRyxjQUFjLEdBQUcsU0FBakJBLGNBQWlCLENBQUNMLE9BQUQsRUFBNEJNLEtBQTVCLEVBQW1ESixZQUFuRDtBQUFBLFNBQTJGLHNCQUFLRixPQUFMLEVBQWMsQ0FBQ0UsWUFBRCxFQUFlSSxLQUFmLENBQWQsQ0FBM0Y7QUFBQSxDQUF2Qjs7QUFDQSxJQUFNQyxhQUFhLEdBQUcsU0FBaEJBLGFBQWdCLENBQUNQLE9BQUQsRUFBNEJNLEtBQTVCLEVBQW1ESixZQUFuRDtBQUFBLFNBQTJGSCxZQUFZLENBQUNDLE9BQUQsRUFBVU0sS0FBVixFQUFpQkosWUFBakIsQ0FBdkc7QUFBQSxDQUF0QjtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQ0EsSUFBTU0sY0FBYyxHQUFHLFNBQWpCQSxjQUFpQixDQUFDUixPQUFELEVBQTRCTSxLQUE1QixFQUFtREcsV0FBbkQsRUFBc0ZQLFlBQXRGLEVBQThIO0FBQ2pKLE1BQUksQ0FBQ0ksS0FBTCxFQUFZO0FBQUUsV0FBTyxJQUFQO0FBQWE7O0FBQzNCLE1BQUksQ0FBQ0csV0FBTCxFQUFrQjtBQUNkLFdBQU9KLGNBQWMsQ0FBQ0wsT0FBRCxFQUFVTSxLQUFWLEVBQWlCSixZQUFqQixDQUFyQjtBQUNIOztBQUVELFNBQU9LLGFBQWEsQ0FBQ1AsT0FBRCxFQUFVTSxLQUFWLEVBQWlCSixZQUFqQixDQUFwQjtBQUNILENBUEQ7QUFTQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFDQSxTQUFTUSxlQUFULFFBK0JVO0FBQUEsTUE5Qk5DLENBOEJNLFNBOUJOQSxDQThCTTtBQUFBLE1BN0JOQyxTQTZCTSxTQTdCTkEsU0E2Qk07QUFBQSxNQTVCTkMsT0E0Qk0sU0E1Qk5BLE9BNEJNO0FBQUEsTUEzQk5QLEtBMkJNLFNBM0JOQSxLQTJCTTtBQUFBLE1BMUJOUSxNQTBCTSxTQTFCTkEsTUEwQk07QUFBQSxNQXpCTkMsV0F5Qk0sU0F6Qk5BLFdBeUJNO0FBQUEsb0NBeEJOQyxlQXdCTTtBQUFBLE1BeEJOQSxlQXdCTSxzQ0F4QllMLENBQUMsQ0FBQyxRQUFELENBd0JiO0FBQUEsTUF2Qk5NLE9BdUJNLFNBdkJOQSxPQXVCTTtBQUFBLE1BdEJOQyxhQXNCTSxTQXRCTkEsYUFzQk07QUFBQSxNQXJCTmhCLFlBcUJNLFNBckJOQSxZQXFCTTtBQUFBLE1BcEJOaUIsWUFvQk0sU0FwQk5BLFlBb0JNO0FBQUEsTUFuQk5DLFdBbUJNLFNBbkJOQSxXQW1CTTtBQUFBLE1BbEJOQyxZQWtCTSxTQWxCTkEsWUFrQk07QUFBQSxNQWpCTkMsS0FpQk0sU0FqQk5BLEtBaUJNO0FBQUEsTUFoQk5DLGtCQWdCTSxTQWhCTkEsa0JBZ0JNO0FBQUEsTUFmTnZCLE9BZU0sU0FmTkEsT0FlTTtBQUFBLE1BZE53QixRQWNNLFNBZE5BLFFBY007QUFBQSxNQWJOQyxRQWFNLFNBYk5BLFFBYU07QUFBQSxNQVpOQyxRQVlNLFNBWk5BLFFBWU07QUFBQSxNQVhOQyxhQVdNLFNBWE5BLGFBV007QUFBQSxNQVZOQyxNQVVNLFNBVk5BLE1BVU07QUFBQSxNQVRObkIsV0FTTSxTQVROQSxXQVNNO0FBQUEsTUFSTm9CLFFBUU0sU0FSTkEsUUFRTTtBQUFBLE1BUE5DLE9BT00sU0FQTkEsT0FPTTtBQUFBLE1BTk5DLFFBTU0sU0FOTkEsUUFNTTtBQUFBLE1BTE5DLElBS00sU0FMTkEsSUFLTTtBQUFBLE1BSk5DLFNBSU0sU0FKTkEsU0FJTTtBQUFBLE1BSE5DLG1CQUdNLFNBSE5BLG1CQUdNO0FBQUEsTUFGTkMsZ0JBRU0sU0FGTkEsZ0JBRU07QUFBQSxNQUROQyxRQUNNLFNBRE5BLFFBQ007QUFDTixNQUFNQyxnQkFBZ0IsR0FBRyxtQkFBTyxFQUFQLENBQXpCOztBQUNBLGtCQUFzQyxxQkFBUyxFQUFULENBQXRDO0FBQUE7QUFBQSxNQUFPQyxXQUFQO0FBQUEsTUFBb0JDLGNBQXBCLGlCQUZNLENBSU47OztBQUNDN0IsRUFBQUEsZUFBRCxDQUF5QjhCLGtCQUF6QixHQUE4QztBQUFBLFdBQU1ELGNBQWMsQ0FBQyxFQUFELENBQXBCO0FBQUEsR0FBOUM7QUFFQTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQ0ksTUFBTUUsUUFBUSxHQUFHLG9CQUFRLFlBQU07QUFDM0IsUUFBTUMsVUFBVSxHQUFHO0FBQ2ZDLE1BQUFBLFNBQVMsRUFBRSxpQkFESTtBQUVmdkIsTUFBQUEsV0FBVyxFQUFYQSxXQUZlO0FBR2ZDLE1BQUFBLFlBQVksRUFBWkEsWUFIZTtBQUlmRixNQUFBQSxZQUFZLEVBQVpBLFlBSmU7QUFLZkcsTUFBQUEsS0FBSyxFQUFMQTtBQUxlLEtBQW5CO0FBT0EsUUFBTXNCLEtBQUssR0FBRzVDLE9BQU8sSUFBSSxFQUF6QjtBQUNBLFFBQU02QyxTQUFTLEdBQUcsb0NBQUlELEtBQUosRUFBV0UsTUFBWCxDQUNkLFVBQUNDLEdBQUQsRUFBTUMsSUFBTjtBQUFBLDZDQUNPRCxHQURQLDRDQUVLQyxJQUFJLENBQUM5QyxZQUFELENBRlQsZ0RBR1c4QyxJQUhYO0FBSVFDLFFBQUFBLEdBQUcsRUFBRUQsSUFBSSxDQUFDOUMsWUFBRCxDQUpqQjtBQUtRSSxRQUFBQSxLQUFLLEVBQUUwQyxJQUFJLENBQUM5QyxZQUFELENBTG5CO0FBTVFnRCxRQUFBQSxLQUFLLEVBQUVGLElBQUksQ0FBQ0csY0FBTCxJQUF1Qiw2QkFBaUJILElBQWpCLEVBQXVCTixVQUF2QjtBQU50QyxTQU9ZVixJQUFJLElBQUk7QUFBRXBDLFFBQUFBLE1BQU0sRUFBRSxDQUFDb0QsSUFBSSxDQUFDekIsa0JBQUQ7QUFBZixPQVBwQjtBQVFRTSxRQUFBQSxRQUFRLEVBQUU7QUFSbEI7QUFBQSxLQURjLEVBWWQsRUFaYyxDQWFsQjtBQWJrQixLQUFsQjtBQWdCQSwwQkFBS2dCLFNBQUwsRUFBZ0JPLE9BQWhCLENBQXdCLFVBQUNILEdBQUQsRUFBUztBQUM3QixVQUNJSixTQUFTLENBQUNJLEdBQUQsQ0FBVCxDQUFlL0IsYUFBZixLQUNBMkIsU0FBUyxDQUFDQSxTQUFTLENBQUNJLEdBQUQsQ0FBVCxDQUFlL0IsYUFBZixDQUFELENBRFQsSUFFQTJCLFNBQVMsQ0FBQ0EsU0FBUyxDQUFDSSxHQUFELENBQVQsQ0FBZS9CLGFBQWYsQ0FBRCxDQUFULENBQXlDVyxRQUg3QyxFQUlFO0FBQ0VnQixRQUFBQSxTQUFTLENBQUNBLFNBQVMsQ0FBQ0ksR0FBRCxDQUFULENBQWUvQixhQUFmLENBQUQsQ0FBVCxDQUF5Q1csUUFBekMsQ0FBa0R3QixJQUFsRCxtQkFDT1IsU0FBUyxDQUFDSSxHQUFELENBRGhCO0FBR0g7QUFDSixLQVZEO0FBWUEsV0FBTyxzQkFBS0osU0FBTCxFQUNGakIsTUFERSxDQUNLLFVBQUNxQixHQUFELEVBQVM7QUFDYixVQUFJLENBQUNKLFNBQVMsQ0FBQ0ksR0FBRCxDQUFULENBQWUvQixhQUFmLENBQUwsRUFBb0M7QUFDaEMsZUFBTyxJQUFQO0FBQ0g7O0FBRUQsYUFBTyxDQUFDLEVBQUUyQixTQUFTLENBQUNJLEdBQUQsQ0FBVCxDQUFlL0IsYUFBZixLQUNOO0FBQ0EsT0FBQzJCLFNBQVMsQ0FBQ1MsY0FBVixDQUF5QlQsU0FBUyxDQUFDSSxHQUFELENBQVQsQ0FBZS9CLGFBQWYsQ0FBekIsQ0FGRyxDQUFSO0FBR0gsS0FURSxFQVVIO0FBVkcsS0FXRjRCLE1BWEUsQ0FXSyxVQUFDQyxHQUFELEVBQU1FLEdBQU47QUFBQSwyREFBa0JGLEdBQWxCLHNCQUE0QkYsU0FBUyxDQUFDSSxHQUFELENBQXJDO0FBQUEsS0FYTCxFQVcyRCxFQVgzRCxDQUFQO0FBWUgsR0FqRGdCLEVBaURkLENBQ0NqQixJQURELEVBQ09WLEtBRFAsRUFDY3RCLE9BRGQsRUFDdUJ1QixrQkFEdkIsRUFFQ0gsV0FGRCxFQUVjQyxZQUZkLEVBRTRCRixZQUY1QixFQUdDRCxhQUhELEVBR2dCaEIsWUFIaEIsQ0FqRGMsQ0FBakI7QUF1REE7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDSTs7QUFDQSxNQUFNcUQsYUFBYSxHQUFHLHdCQUFZLFVBQUNDLEtBQUQsRUFBZ0JyRCxJQUFoQixFQUE4QjtBQUM1RCxRQUFNc0QsSUFBSSxHQUFHLENBQUMsVUFBRCxFQUFhLFlBQWIsRUFBMkIsVUFBM0IsQ0FBYjs7QUFFQSxRQUFJQSxJQUFJLENBQUNDLFFBQUwsQ0FBYzlCLE1BQWQsQ0FBSixFQUEyQjtBQUN2QjtBQUNBLGFBQVErQixNQUFNLENBQUNDLFNBQVAsQ0FBaUJoQyxNQUFqQixDQUFELENBQXlDaUMsSUFBekMsQ0FDSDFELElBQUksQ0FBQzJELEtBQUwsQ0FBVzNDLFlBQVgsRUFBeUI0QyxXQUF6QixFQURHLEVBRUhQLEtBQUssQ0FBQ08sV0FBTixFQUZHLENBQVA7QUFJSDs7QUFFRCxXQUFPLElBQVA7QUFDSCxHQVpxQixFQVluQixDQUFDbkMsTUFBRCxFQUFTVCxZQUFULENBWm1CLENBQXRCO0FBY0E7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUNJLE1BQU02QyxRQUFRLEdBQUcsU0FBWEEsUUFBVyxDQUFDMUQsS0FBRCxFQUEyQjtBQUN4QyxRQUFJLENBQUNBLEtBQUwsRUFBWTtBQUFFLGFBQU8sRUFBUDtBQUFXOztBQUN6QixRQUFJLHlCQUFRQSxLQUFSLENBQUosRUFBb0I7QUFDaEIsYUFBTyxxQkFBSUEsS0FBSixFQUFXLFVBQUFGLENBQUM7QUFBQSxlQUFJQSxDQUFDLENBQUNGLFlBQUQsQ0FBTDtBQUFBLE9BQVosQ0FBUDtBQUNIOztBQUVELFdBQU9JLEtBQUssQ0FBQ0osWUFBRCxDQUFaO0FBQ0gsR0FQRDtBQVNBO0FBQ0o7QUFDQTtBQUNBOzs7QUFDSSxNQUFNK0QsWUFBWSxHQUFHLHdCQUFZLFVBQUMzRCxLQUFELEVBQTJCO0FBQ3hEb0IsSUFBQUEsUUFBUSxDQUFDbEIsY0FBYyxDQUFDUixPQUFELEVBQVVNLEtBQVYsRUFBaUJHLFdBQWpCLEVBQThCUCxZQUE5QixDQUFmLENBQVI7QUFDQVksSUFBQUEsTUFBTSxDQUFDTixjQUFjLENBQUNSLE9BQUQsRUFBVU0sS0FBVixFQUFpQkcsV0FBakIsRUFBOEJQLFlBQTlCLENBQWYsQ0FBTixDQUZ3RCxDQUd4RDtBQUNILEdBSm9CLEVBSWxCLENBQUNGLE9BQUQsRUFBVVMsV0FBVixFQUF1QmlCLFFBQXZCLEVBQWlDeEIsWUFBakMsQ0FKa0IsQ0FBckI7QUFNQTtBQUNKO0FBQ0E7QUFDQTs7QUFDSSxNQUFNZ0UsWUFBWSxHQUFHLHdCQUFZLFVBQUM1RCxLQUFELEVBQTJCO0FBQ3hEbUIsSUFBQUEsUUFBUSxDQUFDakIsY0FBYyxDQUFDUixPQUFELEVBQVVNLEtBQVYsRUFBaUJHLFdBQWpCLEVBQThCUCxZQUE5QixDQUFmLENBQVI7QUFDQVksSUFBQUEsTUFBTSxHQUZrRCxDQUd4RDtBQUNILEdBSm9CLEVBSWxCLENBQUNkLE9BQUQsRUFBVVMsV0FBVixFQUF1QmdCLFFBQXZCLEVBQWlDdkIsWUFBakMsQ0FKa0IsQ0FBckI7QUFNQTtBQUNKO0FBQ0E7QUFDQTs7QUFDSSxNQUFNaUUsWUFBWSxHQUFHLHdCQUFZLFVBQUM3RCxLQUFELEVBQTJCO0FBQ3hEaUMsSUFBQUEsY0FBYyxDQUFDakMsS0FBRCxDQUFkO0FBQ0FrQixJQUFBQSxRQUFRLENBQUNsQixLQUFELENBQVI7QUFFQSxXQUFPLElBQVA7QUFDSCxHQUxvQixFQUtsQixDQUFDa0IsUUFBRCxDQUxrQixDQUFyQjtBQU9BLE1BQU00QyxXQUFXLEdBQUcsd0JBQVksWUFBTTtBQUNsQzdCLElBQUFBLGNBQWMsQ0FBQyxFQUFELENBQWQ7QUFDSCxHQUZtQixFQUVqQixFQUZpQixDQUFwQjtBQUlBO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7O0FBQ0ksTUFBTThCLDJCQUEyQixHQUFHLHdCQUFZLFVBQUNDLE9BQUQsRUFBc0I7QUFDbEUsUUFBSUEsT0FBSixFQUFhO0FBQ1R6RCxNQUFBQSxPQUFPO0FBQ1YsS0FIaUUsQ0FJbEU7QUFDQTs7O0FBRUEsUUFBSXlELE9BQU8sSUFBSSxDQUFDdEUsT0FBTyxDQUFDdUUsTUFBeEIsRUFBZ0M7QUFDNUIzRCxNQUFBQSxTQUFTO0FBQ1osS0FGRCxNQUVPO0FBQ0hrQixNQUFBQSxPQUFPO0FBQ1Y7O0FBQ0QsUUFBSUUsSUFBSixFQUFVO0FBQUVLLE1BQUFBLGdCQUFnQixDQUFDbUMsT0FBakIsR0FBMkIsRUFBM0I7QUFBK0I7O0FBRTNDLFdBQU8sS0FBUCxDQWRrRSxDQWVsRTtBQUNILEdBaEJtQyxFQWdCakMsQ0FBQ3hDLElBQUQsRUFBT0YsT0FBUCxFQUFnQmpCLE9BQWhCLEVBQXlCRCxTQUF6QixFQUFvQ21CLFFBQXBDLENBaEJpQyxDQUFwQztBQWtCQTtBQUNKO0FBQ0E7QUFDQTtBQUNJOztBQUNBLE1BQU0wQyxZQUFZLEdBQUc7QUFBQSw4RkFBWSxpQkFBT0MsSUFBUDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDdkJDLGNBQUFBLFVBRHVCLEdBQ1YsNEJBQVdELElBQVgsRUFBaUJyQyxnQkFBZ0IsQ0FBQ21DLE9BQWxDLENBRFU7O0FBQUEsbUJBR3pCeEMsSUFIeUI7QUFBQTtBQUFBO0FBQUE7O0FBQUE7QUFBQSxxQkFJbkJwQixTQUFTLENBQUM7QUFBRSxvQ0FBb0IrRCxVQUFVLENBQUMsQ0FBRDtBQUFoQyxlQUFELEVBQXdDLElBQXhDLENBSlU7O0FBQUE7QUFNN0J0QyxjQUFBQSxnQkFBZ0IsQ0FBQ21DLE9BQWpCLEdBQTJCRSxJQUEzQjs7QUFONkI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsS0FBWjs7QUFBQTtBQUFBO0FBQUE7QUFBQSxPQU9sQixDQUFDMUMsSUFBRCxFQUFPcEIsU0FBUCxDQVBrQixDQUFyQjs7QUFTQSxNQUFNZ0UsU0FBUyxnQkFDWCxnQ0FBQyxVQUFEO0FBQ0ksSUFBQSxPQUFPLEVBQUVSLFdBRGI7QUFFSSxJQUFBLElBQUksRUFBQztBQUZULElBREo7O0FBT0Esc0JBQ0k7QUFBSyxJQUFBLFNBQVMsRUFBRSw0QkFDWiwyQkFEWSxFQUVabkMsU0FGWSxFQUdaO0FBQ0k0QyxNQUFBQSxLQUFLLEVBQUUseUJBQVF2RSxLQUFSLENBRFg7QUFDMkJ3RSxNQUFBQSxLQUFLLEVBQUVyRSxXQURsQztBQUMrQ3NFLE1BQUFBLE1BQU0sRUFBRSxDQUFDdEU7QUFEeEQsS0FIWTtBQUFoQixrQkFRSSxnQ0FBQyx3QkFBRDtBQUNJLElBQUEsVUFBVSxFQUFFLENBQUMseUJBQVFILEtBQVIsQ0FEakI7QUFFSSxJQUFBLEtBQUssRUFBRTBELFFBQVEsQ0FBQzFELEtBQUQsQ0FGbkI7QUFHSSxJQUFBLHVCQUF1QixFQUFFK0QsMkJBSDdCO0FBSUksSUFBQSxZQUFZLEVBQUUxRSxrQkFKbEI7QUFLSSxJQUFBLFVBQVUsZUFBRSxnQ0FBQyxVQUFEO0FBQU0sTUFBQSxJQUFJLEVBQUM7QUFBWCxNQUxoQjtBQU1JLElBQUEsUUFBUSxFQUFFYyxXQU5kO0FBT0ksSUFBQSxhQUFhLEVBQUVrQixhQUFhLGlCQUFJLGdDQUFDLGtCQUFEO0FBQVUsTUFBQSxNQUFNO0FBQWhCLE1BUHBDO0FBUUksSUFBQSxRQUFRLEVBQUVjLFFBUmQ7QUFTSSxJQUFBLGNBQWMsRUFBRWMsYUFUcEI7QUFVSSxJQUFBLGtCQUFrQixFQUFFcEMsWUFWeEI7QUFXSSxJQUFBLGlCQUFpQixFQUFFQSxZQVh2QjtBQVlJLElBQUEsZ0JBQWdCLEVBQUVnQixnQkFadEI7QUFhSSxJQUFBLFNBQVMsRUFBRXlDLFNBYmYsQ0FhMEI7QUFiMUI7QUFjSSxJQUFBLFVBQVUsRUFBRSx5QkFBUXRFLEtBQVIsSUFBaUIsSUFBakIsR0FBd0JzRSxTQWR4QyxDQWNtRDtBQWRuRDtBQWVJLElBQUEsUUFBUSxFQUFFWCxZQWZkO0FBZ0JJLElBQUEsUUFBUSxFQUFFQyxZQWhCZDtBQWlCSSxJQUFBLFFBQVEsRUFBRUMsWUFqQmQ7QUFrQkksSUFBQSxZQUFZLEVBQUVNLFlBbEJsQjtBQW1CSSxJQUFBLG1CQUFtQixFQUFFLCtCQUFtQnZDLG1CQUFuQixDQW5CekI7QUFvQkksSUFBQSxpQkFBaUIsRUFBRXJDLGlCQXBCdkI7QUFxQkksSUFBQSxlQUFlLEVBQUVvQixPQUFPLGdCQUFHLGdDQUFDLDRCQUFELE9BQUgsR0FBdUJELGVBckJuRDtBQXNCSSxJQUFBLFdBQVcsRUFBRXNCLFdBQVcsR0FBRyxJQUFILEdBQVV2QixXQXRCdEM7QUF1QkksSUFBQSxRQUFRLEVBQUVxQixRQXZCZDtBQXdCSSxJQUFBLFdBQVcsRUFBRUUsV0F4QmpCO0FBeUJJLElBQUEsVUFBVSxFQUFFLENBQUM3QixXQXpCakI7QUEwQkksSUFBQSxVQUFVLEVBQUUsR0ExQmhCO0FBMkJJLElBQUEsU0FBUyxFQUFDO0FBM0JkLEtBNkJLb0IsUUE3QkwsQ0FSSixDQURKO0FBMENIOztBQUVEbkIsZUFBZSxDQUFDc0UsWUFBaEIsR0FBK0I7QUFDM0JuRCxFQUFBQSxRQUFRLEVBQUUsSUFEaUI7QUFFM0JOLEVBQUFBLGtCQUFrQixFQUFFLGFBRk87QUFHM0JhLEVBQUFBLFFBQVEsRUFBRSxLQUhpQjtBQUkzQm5CLEVBQUFBLE9BQU8sRUFBRSxLQUprQjtBQUszQkMsRUFBQUEsYUFBYSxFQUFFLFVBTFk7QUFNM0JoQixFQUFBQSxZQUFZLEVBQUUsSUFOYTtBQU8zQmlCLEVBQUFBLFlBQVksRUFBRSxNQVBhO0FBUTNCQyxFQUFBQSxXQUFXLEVBQUUsTUFSYztBQVMzQkUsRUFBQUEsS0FBSyxFQUFFO0FBQ0gyRCxJQUFBQSxPQUFPLEVBQUUsT0FETjtBQUVIQyxJQUFBQSxZQUFZLEVBQUU7QUFGWCxHQVRvQjtBQWEzQjdELEVBQUFBLFlBQVksRUFBRSxPQWJhO0FBYzNCOEQsRUFBQUEsV0FBVyxFQUFFLE1BZGM7QUFlM0J2RCxFQUFBQSxNQUFNLEVBQUUsWUFmbUI7QUFnQjNCRCxFQUFBQSxhQUFhLEVBQUUsS0FoQlk7QUFpQjNCbEIsRUFBQUEsV0FBVyxFQUFFLEtBakJjO0FBa0IzQlQsRUFBQUEsT0FBTyxFQUFFLEVBbEJrQjtBQW1CM0JvRixFQUFBQSxjQUFjLEVBQUUsVUFuQlc7QUFvQjNCQyxFQUFBQSxvQkFBb0IsRUFBRSxNQXBCSztBQXFCM0JuRCxFQUFBQSxtQkFBbUIsRUFBRSxLQXJCTTtBQXNCM0JvRCxFQUFBQSxVQUFVLEVBQUUsSUF0QmU7QUF1QjNCdkUsRUFBQUEsV0FBVyxFQUFFLEVBdkJjO0FBd0IzQndFLEVBQUFBLFVBQVUsRUFBRSxJQXhCZTtBQXlCM0JwRCxFQUFBQSxnQkFBZ0IsRUFBRSxFQXpCUztBQTBCM0JYLEVBQUFBLFFBQVEsRUFBRSxvQkFBTSxDQUFFLENBMUJTO0FBMkIzQkMsRUFBQUEsUUFBUSxFQUFFLG9CQUFNLENBQUUsQ0EzQlM7QUE0QjNCQyxFQUFBQSxRQUFRLEVBQUUsb0JBQU0sQ0FBRSxDQTVCUztBQTZCM0JJLEVBQUFBLE9BQU8sRUFBRSxtQkFBTSxDQUFFLENBN0JVO0FBOEIzQkMsRUFBQUEsUUFBUSxFQUFFLG9CQUFNLENBQUUsQ0E5QlM7QUErQjNCbEIsRUFBQUEsT0FBTyxFQUFFLG1CQUFNLENBQUUsQ0EvQlU7QUFnQzNCQyxFQUFBQSxNQUFNLEVBQUUsa0JBQU0sQ0FBRSxDQWhDVztBQWlDM0IwRSxFQUFBQSxPQUFPLEVBQUUsbUJBQU0sQ0FBRSxDQWpDVTtBQWtDM0I3RSxFQUFBQSxDQUFDLEVBQUUsYUFBTSxDQUFFO0FBbENnQixDQUEvQjtBQTBJQSxJQUFNOEUsa0JBQWtCLEdBQUc7QUFDdkI7QUFDQWpELEVBQUFBLGtCQUFrQixFQUFFO0FBQUEsV0FBTzlCLGVBQUQsQ0FBeUI4QixrQkFBL0I7QUFBQTtBQUZHLENBQTNCO0FBS08sSUFBTWtELHdCQUF3QixHQUNqQztBQUNBLHFDQUFrQixxQ0FBa0JoRixlQUFsQixDQUFsQixFQUE2RCtFLGtCQUE3RCxDQUZHIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFJlYWN0LCB7IHVzZUNhbGxiYWNrLCBSZWFjdE5vZGUsIHVzZU1lbW8sIHVzZVJlZiwgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCdcbmltcG9ydCBUcmVlU2VsZWN0IGZyb20gJ3JjLXRyZWUtc2VsZWN0J1xuaW1wb3J0IGRpZmZlcmVuY2UgZnJvbSAnbG9kYXNoL2RpZmZlcmVuY2UnXG5pbXBvcnQgZmlsdGVyRiBmcm9tICdsb2Rhc2gvZmlsdGVyJ1xuaW1wb3J0IGZpbmQgZnJvbSAnbG9kYXNoL2ZpbmQnXG5pbXBvcnQgaXNBcnJheSBmcm9tICdsb2Rhc2gvaXNBcnJheSdcbmltcG9ydCBpc0VtcHR5IGZyb20gJ2xvZGFzaC9pc0VtcHR5J1xuaW1wb3J0IGtleXMgZnJvbSAnbG9kYXNoL2tleXMnXG5pbXBvcnQgbWFwIGZyb20gJ2xvZGFzaC9tYXAnXG5pbXBvcnQgc29tZSBmcm9tICdsb2Rhc2gvc29tZSdcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnXG5pbXBvcnQgeyB3aXRoVHJhbnNsYXRpb24gfSBmcm9tICdyZWFjdC1pMThuZXh0J1xuaW1wb3J0IG9uQ2xpY2tPdXRzaWRlSE9DIGZyb20gJ3JlYWN0LW9uY2xpY2tvdXRzaWRlJ1xuXG5pbXBvcnQgeyBGaWx0ZXIsIFRPcHRpb24gfSBmcm9tICcuLi9JbnB1dFNlbGVjdC90eXBlcydcbmltcG9ydCB7IEljb24gfSBmcm9tICcuLi8uLi9kaXNwbGF5L0ljb24vSWNvbidcbmltcG9ydCB7IElubGluZVNwaW5uZXIgfSBmcm9tICcuLi8uLi9sYXlvdXRzL1NwaW5uZXIvSW5saW5lU3Bpbm5lcidcbmltcG9ydCB7IENoZWNrYm94IH0gZnJvbSAnLi4vQ2hlY2tib3gvQ2hlY2tib3gnXG5cbmltcG9ydCB7IFRyZWVOb2RlIH0gZnJvbSAnLi9UcmVlU2VsZWN0Tm9kZSdcbmltcG9ydCB7IHZpc2libGVQYXJ0UG9wdXAsIGdldENoZWNrZWRTdHJhdGVneSB9IGZyb20gJy4vdW50aWwnXG5cbmNvbnN0IHJlbmRlclN3aXRjaGVySWNvbiA9ICh7IGlzTGVhZiB9OiB7aXNMZWFmOiBib29sZWFufSkgPT4gKGlzTGVhZiA/IG51bGwgOiA8SWNvbiBuYW1lPVwiZmEgZmEtY2hldnJvbi1yaWdodFwiIC8+KVxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbmNvbnN0IGdldFBvcHVwQ29udGFpbmVyID0gKGNvbnRhaW5lcjogYW55KSA9PiBjb250YWluZXJcbi8qKlxuICog0JLQt9GP0YLRjCDQtNCw0L3QvdGL0LUg0L/QviBpZHMuXG4gKiBbJ2lkJywgJ2lkJ10gPT4gW3sgaWQ6ICdpZCcsIC4uLiB9LHsgaWQ6ICdpZCcsIC4uLiB9XVxuICogQHBhcmFtIG9wdGlvbnNcbiAqIEBwYXJhbSBpZHNcbiAqIEBwYXJhbSB2YWx1ZUZpZWxkSWRcbiAqL1xuY29uc3QgZ2V0RGF0YUJ5SWRzID0gKG9wdGlvbnM6IFByb3BzWydvcHRpb25zJ10sIGlkczogc3RyaW5nW10sIHZhbHVlRmllbGRJZDogUHJvcHNbJ3ZhbHVlRmllbGRJZCddKSA9PiBmaWx0ZXJGKG9wdGlvbnMsIG5vZGUgPT4gc29tZShpZHMsIHYgPT4gdiA9PT0gbm9kZVt2YWx1ZUZpZWxkSWQgYXMga2V5b2YgVE9wdGlvbl0pKVxuXG5jb25zdCBnZXRTaW5nbGVWYWx1ZSA9IChvcHRpb25zOiBQcm9wc1snb3B0aW9ucyddLCB2YWx1ZTogUHJvcHNbJ3ZhbHVlJ10sIHZhbHVlRmllbGRJZDogUHJvcHNbJ3ZhbHVlRmllbGRJZCddKSA9PiBmaW5kKG9wdGlvbnMsIFt2YWx1ZUZpZWxkSWQsIHZhbHVlXSlcbmNvbnN0IGdldE11bHRpVmFsdWUgPSAob3B0aW9uczogUHJvcHNbJ29wdGlvbnMnXSwgdmFsdWU6IFByb3BzWyd2YWx1ZSddLCB2YWx1ZUZpZWxkSWQ6IFByb3BzWyd2YWx1ZUZpZWxkSWQnXSkgPT4gZ2V0RGF0YUJ5SWRzKG9wdGlvbnMsIHZhbHVlLCB2YWx1ZUZpZWxkSWQpXG5cbi8qKlxuICog0KTRg9C90LrRhtC40Y8g0L/RgNC10L7QsdGA0LDQt9C+0LLQsNC90LjRjyB2YWx1ZSByY1RyZWVTZWxlY3Qg0LIg0YTQvtGA0LzQsNGCIG4yb1xuICog0J/RgNC+0LjQt9Cy0L7QtNC40YIg0L/QvtC40YHQuiDQv9C+INGA0L7QtNC40YLQtdC70Y/QvCDQuCDQv9C+0YLQvtC80LrQsNC8LlxuICogcmNUcmVlU2VsZWN0INC90LUg0LTQsNC10YIg0LjQvdGE0L7RgNC80LDRhtC40Lgg0L4g0LLRi9C00LXQu9C10L3QvdGL0YUg0L/QvtGC0L7QvNC60LDRhSDQv9GA0Lgg0LzQvtC00LUgJ1NIT1dfUEFSRU5UJ1xuICog0Lgg0L4g0LLRi9C00LXQu9C10L3QvdGL0YUg0YDQvtC00LjRgtC10LvRj9GFINC/0YDQuCAnU0hPV19DSElMRCdcbiAqIFsnaWQnLCAnaWQnXSA9PiBbeyBpZDogJ2lkJywgLi4uIH0seyBpZDogJ2lkJywgLi4uIH1dXG4gKiBAcGFyYW0gb3B0aW9uc1xuICogQHBhcmFtIHZhbHVlXG4gKiBAcGFyYW0gbXVsdGlTZWxlY3RcbiAqIEBwYXJhbSB2YWx1ZUZpZWxkSWRcbiAqIEByZXR1cm5zIHsqfVxuICovXG5jb25zdCBnZXRJdGVtQnlWYWx1ZSA9IChvcHRpb25zOiBQcm9wc1snb3B0aW9ucyddLCB2YWx1ZTogUHJvcHNbJ3ZhbHVlJ10sIG11bHRpU2VsZWN0OiBQcm9wc1snbXVsdGlTZWxlY3QnXSwgdmFsdWVGaWVsZElkOiBQcm9wc1sndmFsdWVGaWVsZElkJ10pID0+IHtcbiAgICBpZiAoIXZhbHVlKSB7IHJldHVybiBudWxsIH1cbiAgICBpZiAoIW11bHRpU2VsZWN0KSB7XG4gICAgICAgIHJldHVybiBnZXRTaW5nbGVWYWx1ZShvcHRpb25zLCB2YWx1ZSwgdmFsdWVGaWVsZElkKVxuICAgIH1cblxuICAgIHJldHVybiBnZXRNdWx0aVZhbHVlKG9wdGlvbnMsIHZhbHVlLCB2YWx1ZUZpZWxkSWQpXG59XG5cbi8qKlxuICogQHJlYWN0UHJvcHMge2Z1bmN0aW9ufSBvbkJsdXJcbiAqIEByZWFjdFByb3BzIHtzdHJpbmd9IHBsYWNlaG9sZGVyXG4gKiBAcmVhY3RQcm9wcyB7ZnVuY3Rpb259IHNldFRyZWVFeHBhbmRlZEtleXNcbiAqIEByZWFjdFByb3BzIHthcnJheX0gdHJlZUV4cGFuZGVkS2V5c1xuICogQHJlYWN0UHJvcHMge25vZGV9IGNoaWxkcmVuXG4gKiBAcmV0dXJucyB7Kn1cbiAqIEBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHByb3BzXG4gKi9cbi8vIFRPRE8g0L/QtdGA0LXQtNC10LvQsNGC0Ywg0LIg0LrQu9Cw0YHRgVxuZnVuY3Rpb24gSW5wdXRTZWxlY3RUcmVlKHtcbiAgICB0LFxuICAgIGZldGNoRGF0YSxcbiAgICBvbkZvY3VzLFxuICAgIHZhbHVlLFxuICAgIG9uQmx1cixcbiAgICBwbGFjZWhvbGRlcixcbiAgICBub3RGb3VuZENvbnRlbnQgPSB0KCdub0RhdGEnKSxcbiAgICBsb2FkaW5nLFxuICAgIHBhcmVudEZpZWxkSWQsXG4gICAgdmFsdWVGaWVsZElkLFxuICAgIGxhYmVsRmllbGRJZCxcbiAgICBpY29uRmllbGRJZCxcbiAgICBpbWFnZUZpZWxkSWQsXG4gICAgYmFkZ2UsXG4gICAgaGFzQ2hpbGRyZW5GaWVsZElkLFxuICAgIG9wdGlvbnMsXG4gICAgb25TZWFyY2gsXG4gICAgb25TZWxlY3QsXG4gICAgb25DaGFuZ2UsXG4gICAgaGFzQ2hlY2tib3hlcyxcbiAgICBmaWx0ZXIsXG4gICAgbXVsdGlTZWxlY3QsXG4gICAgY2hpbGRyZW4sXG4gICAgb25DbG9zZSxcbiAgICBvblRvZ2dsZSxcbiAgICBhamF4LFxuICAgIGNsYXNzTmFtZSxcbiAgICBzaG93Q2hlY2tlZFN0cmF0ZWd5LFxuICAgIG1heFRhZ1RleHRMZW5ndGgsXG4gICAgZGlzYWJsZWQsXG59OiBQcm9wcykge1xuICAgIGNvbnN0IHRyZWVFeHBhbmRlZEtleXMgPSB1c2VSZWYoW10pXG4gICAgY29uc3QgW3NlYXJjaFZhbHVlLCBzZXRTZWFyY2hWYWx1ZV0gPSB1c2VTdGF0ZSgnJyk7XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIChJbnB1dFNlbGVjdFRyZWUgYXMgYW55KS5oYW5kbGVDbGlja091dHNpZGUgPSAoKSA9PiBzZXRTZWFyY2hWYWx1ZSgnJylcblxuICAgIC8qKlxuICAgICAqINCk0YPQvdC60YPQuNGPINC00LvRjyDRgdC+0LfQtNCw0L3QuNGPINC00LXRgNC10LLQsC5cbiAgICAgKiDQn9GA0LXQvtCx0YDQsNC30YPQtdGCINC60L7Qu9C70LXQutGG0LjRjiDQstC40LTQsCBbLi4uLCB7IC4uLiB9XSDQsiBbIC4uLiwgey4uLiwgY2hpbGRyZW46IFsuLi5dfV1cbiAgICAgKiDQktC70L7QttC10L3QuNC1INC/0YDQvtC40YHRhdC+0LTQuNGCINC/0YDQuCDRgdC+0LLQv9Cw0LTQtdC90LjQuCB2YWx1ZUZpZWxkSWQg0LggcGFyZW50RmllbGRJZC5cbiAgICAgKiBAcGFyYW0gaXRlbXNcbiAgICAgKiBAcmV0dXJucyB7Kn1cbiAgICAgKi9cbiAgICBjb25zdCB0cmVlRGF0YSA9IHVzZU1lbW8oKCkgPT4ge1xuICAgICAgICBjb25zdCBwb3B1cFByb3BzID0ge1xuICAgICAgICAgICAgcHJlZml4Q2xzOiAnbjJvLXNlbGVjdC10cmVlJyxcbiAgICAgICAgICAgIGljb25GaWVsZElkLFxuICAgICAgICAgICAgaW1hZ2VGaWVsZElkLFxuICAgICAgICAgICAgbGFiZWxGaWVsZElkLFxuICAgICAgICAgICAgYmFkZ2UsXG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaXRlbXMgPSBvcHRpb25zIHx8IFtdXG4gICAgICAgIGNvbnN0IGl0ZW1zQnlJRCA9IFsuLi5pdGVtc10ucmVkdWNlKFxuICAgICAgICAgICAgKGFjYywgaXRlbSkgPT4gKHtcbiAgICAgICAgICAgICAgICAuLi5hY2MsXG4gICAgICAgICAgICAgICAgW2l0ZW1bdmFsdWVGaWVsZElkIGFzIGtleW9mIFRPcHRpb25dXToge1xuICAgICAgICAgICAgICAgICAgICAuLi5pdGVtLFxuICAgICAgICAgICAgICAgICAgICBrZXk6IGl0ZW1bdmFsdWVGaWVsZElkIGFzIGtleW9mIFRPcHRpb25dLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogaXRlbVt2YWx1ZUZpZWxkSWQgYXMga2V5b2YgVE9wdGlvbl0sXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiBpdGVtLmZvcm1hdHRlZFRpdGxlIHx8IHZpc2libGVQYXJ0UG9wdXAoaXRlbSwgcG9wdXBQcm9wcyksXG4gICAgICAgICAgICAgICAgICAgIC4uLihhamF4ICYmIHsgaXNMZWFmOiAhaXRlbVtoYXNDaGlsZHJlbkZpZWxkSWQgYXMga2V5b2YgVE9wdGlvbl0gfSksXG4gICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuOiBbXSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICB7fSxcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgKSBhcyBhbnlcblxuICAgICAgICBrZXlzKGl0ZW1zQnlJRCkuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgaXRlbXNCeUlEW2tleV1bcGFyZW50RmllbGRJZF0gJiZcbiAgICAgICAgICAgICAgICBpdGVtc0J5SURbaXRlbXNCeUlEW2tleV1bcGFyZW50RmllbGRJZF1dICYmXG4gICAgICAgICAgICAgICAgaXRlbXNCeUlEW2l0ZW1zQnlJRFtrZXldW3BhcmVudEZpZWxkSWRdXS5jaGlsZHJlblxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgaXRlbXNCeUlEW2l0ZW1zQnlJRFtrZXldW3BhcmVudEZpZWxkSWRdXS5jaGlsZHJlbi5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgLi4uaXRlbXNCeUlEW2tleV0sXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcblxuICAgICAgICByZXR1cm4ga2V5cyhpdGVtc0J5SUQpXG4gICAgICAgICAgICAuZmlsdGVyKChrZXkpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIWl0ZW1zQnlJRFtrZXldW3BhcmVudEZpZWxkSWRdKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuICEhKGl0ZW1zQnlJRFtrZXldW3BhcmVudEZpZWxkSWRdICYmXG4gICAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wcm90b3R5cGUtYnVpbHRpbnNcbiAgICAgICAgICAgICAgICAgICAgIWl0ZW1zQnlJRC5oYXNPd25Qcm9wZXJ0eShpdGVtc0J5SURba2V5XVtwYXJlbnRGaWVsZElkXSkpXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgICAgIC5yZWR1Y2UoKGFjYywga2V5KSA9PiBbLi4uYWNjLCB7IC4uLml0ZW1zQnlJRFtrZXldIH1dIGFzIGFueSwgW10pXG4gICAgfSwgW1xuICAgICAgICBhamF4LCBiYWRnZSwgb3B0aW9ucywgaGFzQ2hpbGRyZW5GaWVsZElkLFxuICAgICAgICBpY29uRmllbGRJZCwgaW1hZ2VGaWVsZElkLCBsYWJlbEZpZWxkSWQsXG4gICAgICAgIHBhcmVudEZpZWxkSWQsIHZhbHVlRmllbGRJZCxcbiAgICBdKVxuXG4gICAgLyoqXG4gICAgICog0KTRg9C90LrRhtC40Y8g0LTQu9GPINC/0L7QuNGB0LrQsC5cbiAgICAgKiDQn9GA0Lgg0L/QvtC40YHQutC1INCy0YvQt9C+0LIg0YTRg9C90LrRhtC40Lgg0L/RgNC+0LjRgdGF0L7QtNC40YIg0LTQu9GPINC60LDQttC00L7Qs9C+INGN0LvQtdC80LXQvdGC0LAg0LTQtdGA0LXQstCwLlxuICAgICAqIEBwYXJhbSBpbnB1dFxuICAgICAqIEBwYXJhbSBub2RlXG4gICAgICogQHJldHVybnMgeyp9XG4gICAgICovXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBjb25zdCBoYW5kbGVyRmlsdGVyID0gdXNlQ2FsbGJhY2soKGlucHV0OiBzdHJpbmcsIG5vZGU6IGFueSkgPT4ge1xuICAgICAgICBjb25zdCBtb2RlID0gWydpbmNsdWRlcycsICdzdGFydHNXaXRoJywgJ2VuZHNXaXRoJ11cblxuICAgICAgICBpZiAobW9kZS5pbmNsdWRlcyhmaWx0ZXIpKSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICAgICAgcmV0dXJuIChTdHJpbmcucHJvdG90eXBlW2ZpbHRlciBhcyBhbnldIGFzIGFueSkuY2FsbChcbiAgICAgICAgICAgICAgICBub2RlLnByb3BzW2xhYmVsRmllbGRJZF0udG9Mb3dlckNhc2UoKSxcbiAgICAgICAgICAgICAgICBpbnB1dC50b0xvd2VyQ2FzZSgpLFxuICAgICAgICAgICAgKVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICB9LCBbZmlsdGVyLCBsYWJlbEZpZWxkSWRdKVxuXG4gICAgLyoqXG4gICAgICog0KTRg9C90LrRhtC40Y8g0LTQu9GPINC+0LHRgNCw0YLQvdC+0LPQviDQv9GA0LXQvtCx0YDQsNC30L7QstCw0L3QuNGPIHZhbHVlIG4ybyDQsiDRhNC+0YDQvNCw0YIgcmNUcmVlU2VsZWN0XG4gICAgICogWydpZCcsICdpZCddID0+IFt7IGlkOiAnaWQnLCAuLi4gfSx7IGlkOiAnaWQnLCAuLi4gfV1cbiAgICAgKiBAcGFyYW0gdmFsdWVcbiAgICAgKiBAcmV0dXJucyB7Kn1cbiAgICAgKi9cbiAgICBjb25zdCBzZXRWYWx1ZSA9ICh2YWx1ZTogUHJvcHNbJ3ZhbHVlJ10pID0+IHtcbiAgICAgICAgaWYgKCF2YWx1ZSkgeyByZXR1cm4gW10gfVxuICAgICAgICBpZiAoaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBtYXAodmFsdWUsIHYgPT4gdlt2YWx1ZUZpZWxkSWRdKVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHZhbHVlW3ZhbHVlRmllbGRJZF1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQpNGD0L3QutGG0LjRjyDQtNC70Y8g0L/QtdGA0LXQvtC/0YDQtdC00LXQu9C10L3QuNGPIG9uQ2hhbmdlXG4gICAgICogQHBhcmFtIHZhbHVlXG4gICAgICovXG4gICAgY29uc3QgaGFuZGxlQ2hhbmdlID0gdXNlQ2FsbGJhY2soKHZhbHVlOiBQcm9wc1sndmFsdWUnXSkgPT4ge1xuICAgICAgICBvbkNoYW5nZShnZXRJdGVtQnlWYWx1ZShvcHRpb25zLCB2YWx1ZSwgbXVsdGlTZWxlY3QsIHZhbHVlRmllbGRJZCkpXG4gICAgICAgIG9uQmx1cihnZXRJdGVtQnlWYWx1ZShvcHRpb25zLCB2YWx1ZSwgbXVsdGlTZWxlY3QsIHZhbHVlRmllbGRJZCkpXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1ob29rcy9leGhhdXN0aXZlLWRlcHNcbiAgICB9LCBbb3B0aW9ucywgbXVsdGlTZWxlY3QsIG9uQ2hhbmdlLCB2YWx1ZUZpZWxkSWRdKVxuXG4gICAgLyoqXG4gICAgICog0KTRg9C90LrRhtC40Y8g0LTQu9GPINC/0LXRgNC10L7Qv9GA0LXQtNC10LvQtdC90LjRjyBvblNlbGVjdFxuICAgICAqIEBwYXJhbSB2YWx1ZVxuICAgICAqL1xuICAgIGNvbnN0IGhhbmRsZVNlbGVjdCA9IHVzZUNhbGxiYWNrKCh2YWx1ZTogUHJvcHNbJ3ZhbHVlJ10pID0+IHtcbiAgICAgICAgb25TZWxlY3QoZ2V0SXRlbUJ5VmFsdWUob3B0aW9ucywgdmFsdWUsIG11bHRpU2VsZWN0LCB2YWx1ZUZpZWxkSWQpKVxuICAgICAgICBvbkJsdXIoKVxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaG9va3MvZXhoYXVzdGl2ZS1kZXBzXG4gICAgfSwgW29wdGlvbnMsIG11bHRpU2VsZWN0LCBvblNlbGVjdCwgdmFsdWVGaWVsZElkXSlcblxuICAgIC8qKlxuICAgICAqINCk0YPQvdC60YbQuNGPINC00LvRjyDQv9C10YDQtdC+0L/RgNC10LTQtdC70LXQvdC40Y8gb25TZWFyY2hcbiAgICAgKiBAcGFyYW0gdmFsdWVcbiAgICAgKi9cbiAgICBjb25zdCBoYW5kbGVTZWFyY2ggPSB1c2VDYWxsYmFjaygodmFsdWU6IFByb3BzWyd2YWx1ZSddKSA9PiB7XG4gICAgICAgIHNldFNlYXJjaFZhbHVlKHZhbHVlKVxuICAgICAgICBvblNlYXJjaCh2YWx1ZSlcblxuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgIH0sIFtvblNlYXJjaF0pXG5cbiAgICBjb25zdCBjbGVhclNlYXJjaCA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICAgICAgc2V0U2VhcmNoVmFsdWUoJycpXG4gICAgfSwgW10pXG5cbiAgICAvKipcbiAgICAgKiDQpNGD0L3QutGG0LjRjyDQtNC70Y8g0LrQvtC90YLRgNC+0LvRjyDQvtGC0LrRgNGL0YLQuNGPL9C30LDQutGA0YvRgtC40Y8gcG9wdXBcbiAgICAgKiBAcGFyYW0gdmlzaWJsZVxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAqL1xuICAgIGNvbnN0IGhhbmRsZURyb3Bkb3duVmlzaWJsZUNoYW5nZSA9IHVzZUNhbGxiYWNrKCh2aXNpYmxlOiBib29sZWFuKSA9PiB7XG4gICAgICAgIGlmICh2aXNpYmxlKSB7XG4gICAgICAgICAgICBvbkZvY3VzKClcbiAgICAgICAgfVxuICAgICAgICAvLyBvblRvZ2dsZSh2aXNpYmxlKVxuICAgICAgICAvLyBzZXREcm9wZG93bkV4cGFuZGVkKHZpc2libGUpXG5cbiAgICAgICAgaWYgKHZpc2libGUgJiYgIW9wdGlvbnMubGVuZ3RoKSB7XG4gICAgICAgICAgICBmZXRjaERhdGEoKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgb25DbG9zZSgpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFqYXgpIHsgdHJlZUV4cGFuZGVkS2V5cy5jdXJyZW50ID0gW10gfVxuXG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaG9va3MvZXhoYXVzdGl2ZS1kZXBzXG4gICAgfSwgW2FqYXgsIG9uQ2xvc2UsIG9uRm9jdXMsIGZldGNoRGF0YSwgb25Ub2dnbGVdKVxuXG4gICAgLyoqXG4gICAgICog0KTRg9C90LrRhtC40Y8g0LTQu9GPINC60L7QvdGC0YDQvtC70Y8g0L7RgtC60YDRi9GC0LjRjy/Qt9Cw0LrRgNGL0YLQuNGPINGN0LvQtdC80LXQvdGC0LAg0LTQtdGA0LXQstCwXG4gICAgICogQHBhcmFtIGtleXNcbiAgICAgKi9cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIGNvbnN0IG9uVHJlZUV4cGFuZCA9IHVzZUNhbGxiYWNrKGFzeW5jIChrZXlzOiBhbnkpID0+IHtcbiAgICAgICAgY29uc3QgY3VycmVudEtleSA9IGRpZmZlcmVuY2Uoa2V5cywgdHJlZUV4cGFuZGVkS2V5cy5jdXJyZW50KVxuXG4gICAgICAgIGlmIChhamF4KSB7XG4gICAgICAgICAgICBhd2FpdCBmZXRjaERhdGEoeyAnZmlsdGVyLnBhcmVudF9pZCc6IGN1cnJlbnRLZXlbMF0gfSwgdHJ1ZSlcbiAgICAgICAgfVxuICAgICAgICB0cmVlRXhwYW5kZWRLZXlzLmN1cnJlbnQgPSBrZXlzXG4gICAgfSwgW2FqYXgsIGZldGNoRGF0YV0pXG5cbiAgICBjb25zdCBjbGVhckljb24gPSAoXG4gICAgICAgIDxJY29uXG4gICAgICAgICAgICBvbkNsaWNrPXtjbGVhclNlYXJjaH1cbiAgICAgICAgICAgIG5hbWU9XCJmYSBmYS10aW1lcyBuMm8taW5wdXQtc2VsZWN0LXRyZWVfX2NsZWFyLWljb25cIlxuICAgICAgICAvPlxuICAgIClcblxuICAgIHJldHVybiAoXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPXtjbGFzc05hbWVzKFxuICAgICAgICAgICAgJ24yby1zZWxlY3QtdHJlZS1jb250YWluZXInLFxuICAgICAgICAgICAgY2xhc3NOYW1lLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGVtcHR5OiBpc0VtcHR5KHZhbHVlKSwgbXVsdGk6IG11bHRpU2VsZWN0LCBzaW5nbGU6ICFtdWx0aVNlbGVjdCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICl9XG4gICAgICAgID5cbiAgICAgICAgICAgIDxUcmVlU2VsZWN0XG4gICAgICAgICAgICAgICAgYWxsb3dDbGVhcj17IWlzRW1wdHkodmFsdWUpfVxuICAgICAgICAgICAgICAgIHZhbHVlPXtzZXRWYWx1ZSh2YWx1ZSl9XG4gICAgICAgICAgICAgICAgb25Ecm9wZG93blZpc2libGVDaGFuZ2U9e2hhbmRsZURyb3Bkb3duVmlzaWJsZUNoYW5nZX1cbiAgICAgICAgICAgICAgICBzd2l0Y2hlckljb249e3JlbmRlclN3aXRjaGVySWNvbn1cbiAgICAgICAgICAgICAgICBzdWZmaXhJY29uPXs8SWNvbiBuYW1lPVwiZmEgZmEtY2hldnJvbi1kb3duXCIgLz59XG4gICAgICAgICAgICAgICAgbXVsdGlwbGU9e211bHRpU2VsZWN0fVxuICAgICAgICAgICAgICAgIHRyZWVDaGVja2FibGU9e2hhc0NoZWNrYm94ZXMgJiYgPENoZWNrYm94IGlubGluZSAvPn1cbiAgICAgICAgICAgICAgICB0cmVlRGF0YT17dHJlZURhdGF9XG4gICAgICAgICAgICAgICAgZmlsdGVyVHJlZU5vZGU9e2hhbmRsZXJGaWx0ZXJ9XG4gICAgICAgICAgICAgICAgdHJlZU5vZGVGaWx0ZXJQcm9wPXtsYWJlbEZpZWxkSWR9XG4gICAgICAgICAgICAgICAgdHJlZU5vZGVMYWJlbFByb3A9e2xhYmVsRmllbGRJZH1cbiAgICAgICAgICAgICAgICBtYXhUYWdUZXh0TGVuZ3RoPXttYXhUYWdUZXh0TGVuZ3RofVxuICAgICAgICAgICAgICAgIGNsZWFySWNvbj17Y2xlYXJJY29ufSAvLyDQuNC60L7QvdC60LAg0L7Rh9C40YnQtdC90LjRjyDQstGB0LXQs9C+INC40L3Qv9GD0YLQsFxuICAgICAgICAgICAgICAgIHJlbW92ZUljb249e2lzRW1wdHkodmFsdWUpID8gbnVsbCA6IGNsZWFySWNvbn0gLy8g0LjQutC+0L3QutCwINC+0YfQuNGJ0LXQvdC40Y8g0LjRgtC10LzQsFxuICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXtoYW5kbGVDaGFuZ2V9XG4gICAgICAgICAgICAgICAgb25TZWxlY3Q9e2hhbmRsZVNlbGVjdH1cbiAgICAgICAgICAgICAgICBvblNlYXJjaD17aGFuZGxlU2VhcmNofVxuICAgICAgICAgICAgICAgIG9uVHJlZUV4cGFuZD17b25UcmVlRXhwYW5kfVxuICAgICAgICAgICAgICAgIHNob3dDaGVja2VkU3RyYXRlZ3k9e2dldENoZWNrZWRTdHJhdGVneShzaG93Q2hlY2tlZFN0cmF0ZWd5KX1cbiAgICAgICAgICAgICAgICBnZXRQb3B1cENvbnRhaW5lcj17Z2V0UG9wdXBDb250YWluZXJ9XG4gICAgICAgICAgICAgICAgbm90Rm91bmRDb250ZW50PXtsb2FkaW5nID8gPElubGluZVNwaW5uZXIgLz4gOiBub3RGb3VuZENvbnRlbnR9XG4gICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9e3NlYXJjaFZhbHVlID8gbnVsbCA6IHBsYWNlaG9sZGVyfVxuICAgICAgICAgICAgICAgIGRpc2FibGVkPXtkaXNhYmxlZH1cbiAgICAgICAgICAgICAgICBzZWFyY2hWYWx1ZT17c2VhcmNoVmFsdWV9XG4gICAgICAgICAgICAgICAgc2hvd1NlYXJjaD17IW11bHRpU2VsZWN0fVxuICAgICAgICAgICAgICAgIGxpc3RIZWlnaHQ9ezQwMH1cbiAgICAgICAgICAgICAgICBwcmVmaXhDbHM9XCJuMm8tc2VsZWN0LXRyZWVcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIHtjaGlsZHJlbn1cbiAgICAgICAgICAgIDwvVHJlZVNlbGVjdD5cbiAgICAgICAgPC9kaXY+XG4gICAgKVxufVxuXG5JbnB1dFNlbGVjdFRyZWUuZGVmYXVsdFByb3BzID0ge1xuICAgIGNoaWxkcmVuOiBudWxsLFxuICAgIGhhc0NoaWxkcmVuRmllbGRJZDogJ2hhc0NoaWxkcmVuJyxcbiAgICBkaXNhYmxlZDogZmFsc2UsXG4gICAgbG9hZGluZzogZmFsc2UsXG4gICAgcGFyZW50RmllbGRJZDogJ3BhcmVudElkJyxcbiAgICB2YWx1ZUZpZWxkSWQ6ICdpZCcsXG4gICAgbGFiZWxGaWVsZElkOiAnbmFtZScsXG4gICAgaWNvbkZpZWxkSWQ6ICdpY29uJyxcbiAgICBiYWRnZToge1xuICAgICAgICBmaWVsZElkOiAnYmFkZ2UnLFxuICAgICAgICBjb2xvckZpZWxkSWQ6ICdjb2xvcicsXG4gICAgfSxcbiAgICBpbWFnZUZpZWxkSWQ6ICdpbWFnZScsXG4gICAgc29ydEZpZWxkSWQ6ICduYW1lJyxcbiAgICBmaWx0ZXI6ICdzdGFydHNXaXRoJyxcbiAgICBoYXNDaGVja2JveGVzOiBmYWxzZSxcbiAgICBtdWx0aVNlbGVjdDogZmFsc2UsXG4gICAgb3B0aW9uczogW10sXG4gICAgdHJhbnNpdGlvbk5hbWU6ICdzbGlkZS11cCcsXG4gICAgY2hvaWNlVHJhbnNpdGlvbk5hbWU6ICd6b29tJyxcbiAgICBzaG93Q2hlY2tlZFN0cmF0ZWd5OiAnYWxsJyxcbiAgICBhbGxvd0NsZWFyOiB0cnVlLFxuICAgIHBsYWNlaG9sZGVyOiAnJyxcbiAgICBzaG93U2VhcmNoOiB0cnVlLFxuICAgIG1heFRhZ1RleHRMZW5ndGg6IDEwLFxuICAgIG9uU2VhcmNoOiAoKSA9PiB7fSxcbiAgICBvblNlbGVjdDogKCkgPT4ge30sXG4gICAgb25DaGFuZ2U6ICgpID0+IHt9LFxuICAgIG9uQ2xvc2U6ICgpID0+IHt9LFxuICAgIG9uVG9nZ2xlOiAoKSA9PiB7fSxcbiAgICBvbkZvY3VzOiAoKSA9PiB7fSxcbiAgICBvbkJsdXI6ICgpID0+IHt9LFxuICAgIG9uSW5wdXQ6ICgpID0+IHt9LFxuICAgIHQ6ICgpID0+IHt9LFxufSBhcyBQcm9wc1xuXG50eXBlIFByb3BzID0ge1xuICAgIC8qKlxuICAgICAqINCk0LvQsNCzINC00LjQvdCw0LzQuNGH0LXQutGB0L7QuSDQv9C+0LTQs9GA0YPQt9C60Lgg0LTQsNC90L3Ri9GFLiDQkiDQtNCw0L3QvdGL0YUg0L7QsdGP0LfQsNGC0LXQu9GM0L3QviDRg9C60LDQt9GL0LLQsNGC0Ywg0L/QsNGA0LDQvNC10YLRgCBoYXNDaGlsZHJlbnNcbiAgICAgKi9cbiAgICBhamF4PzogYm9vbGVhbixcbiAgICAvKipcbiAgICAgKiDQlNCw0L3QvdGL0LUg0LTQu9GPIGJhZGdlXG4gICAgICovXG4gICAgYmFkZ2U6IG9iamVjdCxcbiAgICBjaGlsZHJlbjogUmVhY3ROb2RlLFxuICAgIGNsYXNzTmFtZT86IHN0cmluZyxcbiAgICAvKipcbiAgICAgKiDQpNC70LDQsyDQvdC10LDQutGC0LjQstC90L7RgdGC0LhcbiAgICAgKi9cbiAgICBkaXNhYmxlZDogYm9vbGVhbixcbiAgICAvKipcbiAgICAgKiBDYWxsYmFjayDQvdCwINC+0YLQutGA0YvRgtC40LVcbiAgICAgKi9cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIGZldGNoRGF0YT86IGFueSxcbiAgICAvKipcbiAgICAgKiDQktCw0YDQuNCw0L3RgtGLINGE0LjQu9GM0YLRgNCw0YbQuNC4XG4gICAgICovXG4gICAgZmlsdGVyOiBGaWx0ZXIsXG4gICAgLyoqXG4gICAgICog0KTQu9Cw0LMg0LTQu9GPINC/0L7QutCw0LfQsCDRh9C10LrQsdC+0LrRgdC+0LIg0LIg0Y3Qu9C10LzQtdC90YLQsNGFINC00LXRgNC10LLQsC4g0J/QtdGA0LXQstC+0LTQuNGCIElucHV0U2VsZWN0VHJlZSDQsiDQvNGD0LvRjNGC0Lgg0YDQtdC20LjQvFxuICAgICAqL1xuICAgIGhhc0NoZWNrYm94ZXM6IGJvb2xlYW4sXG4gICAgLyoqXG4gICAgICog0JfQvdCw0YfQtdC90LjQtSDQutC70Y7Rh9CwIGhhc0NoaWxkcmVuINCyINC00LDQvdC90YvRhVxuICAgICAqL1xuICAgIGhhc0NoaWxkcmVuRmllbGRJZDogc3RyaW5nLFxuICAgIC8qKlxuICAgICAqINCX0L3QsNGH0LXQvdC40LUg0LrQu9GO0YfQsCBpY29uINCyINC00LDQvdC90YvRhVxuICAgICAqL1xuICAgIGljb25GaWVsZElkOiBzdHJpbmcsXG4gICAgLyoqXG4gICAgICogINCX0L3QsNGH0LXQvdC40LUg0LrQu9GO0YfQsCBpbWFnZSDQsiDQtNCw0L3QvdGL0YVcbiAgICAgKi9cbiAgICBpbWFnZUZpZWxkSWQ6IHN0cmluZyxcbiAgICAvKipcbiAgICAgKiDQl9C90LDRh9C10L3QuNC1INC60LvRjtGH0LAgbGFiZWwg0LIg0LTQsNC90L3Ri9GFXG4gICAgICovXG4gICAgbGFiZWxGaWVsZElkOiBzdHJpbmcsXG4gICAgLyoqXG4gICAgICog0KTQu9Cw0LMg0LDQvdC40LzQsNGG0LjQuCDQt9Cw0LPRgNGD0LfQutC4XG4gICAgICovXG4gICAgbG9hZGluZzogYm9vbGVhbixcbiAgICAvKipcbiAgICAgKiDQmtC+0LvQuNGH0LXRgdGC0LLQviDRgdC40LzQstC+0LvQvtCyINCy0YvQsdGA0LDQvdC90YvRhSDRjdC70LXQvNC10L3RgtC+0LIg0LIgY2hlY2hib3gg0YDQtdC20LjQvNC1XG4gICAgICovXG4gICAgbWF4VGFnVGV4dExlbmd0aDogbnVtYmVyLFxuICAgIC8qKlxuICAgICAqINCc0YPQu9GM0YLQuCDQstGL0LHQvtGAINC30L3QsNGH0LXQvdC40LlcbiAgICAgKi9cbiAgICBtdWx0aVNlbGVjdDogYm9vbGVhbixcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIG5vdEZvdW5kQ29udGVudD86IGFueSxcbiAgICBvbkJsdXIoYXJnPzogUHJvcHNbJ3ZhbHVlJ10pOiB2b2lkLFxuICAgIC8qKlxuICAgICAqIENhbGJhY2sg0LjQt9C80LXQvdC10L3QuNGPXG4gICAgICovXG4gICAgb25DaGFuZ2UoYXJnOiBQcm9wc1sndmFsdWUnXSk6IHZvaWQsXG4gICAgLyoqXG4gICAgICogQ2FsbGJhY2sg0L3QsCDQt9Cw0LrRgNGL0YLQuNC1XG4gICAgICovXG4gICAgb25DbG9zZSgpOiB2b2lkLFxuICAgIG9uRm9jdXMoKTogdm9pZCxcbiAgICAvKipcbiAgICAgKiBDYWxsYmFjayDQvdCwINC/0L7QuNGB0LpcbiAgICAgKi9cbiAgICBvblNlYXJjaChhcmc6IFByb3BzWyd2YWx1ZSddKTogdm9pZCxcbiAgICBvblNlbGVjdChhcmc6IFByb3BzWyd2YWx1ZSddKTogdm9pZCxcbiAgICBvblRvZ2dsZShhcmc6IGJvb2xlYW4pOiB2b2lkLFxuICAgIC8qKlxuICAgICAqINCU0LDQvdC90YvQtSDQtNC70Y8g0L/QvtGB0YLRgNC+0LXQvdC40Y8g0LTQtdGA0LXQstCwXG4gICAgICovXG4gICAgb3B0aW9uczogVE9wdGlvbltdLFxuICAgIC8qKlxuICAgICAqINCX0L3QsNGH0LXQvdC40LUg0LrQu9GO0YfQsCBwYXJlbnQg0LIg0LTQsNC90L3Ri9GFXG4gICAgICovXG4gICAgcGFyZW50RmllbGRJZDogc3RyaW5nLFxuICAgIC8qKlxuICAgICAqIFBsYWNlaG9sZGVyINC60L7QvdGC0YDQvtC70LBcbiAgICAgKi9cbiAgICBwbGFjZWhvbGRlcjogc3RyaW5nLFxuICAgIHNob3dDaGVja2VkU3RyYXRlZ3k6IHN0cmluZyxcbiAgICB0KGFyZzogc3RyaW5nKTogdm9pZCxcbiAgICAvKipcbiAgICAgKiDQl9C90LDRh9C10L3QuNC1XG4gICAgICovXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICB2YWx1ZT86IGFueSxcbiAgICAvKipcbiAgICAgKiDQl9C90LDRh9C10L3QuNC1INC60LvRjtGH0LAgdmFsdWUg0LIg0LTQsNC90L3Ri9GFXG4gICAgICovXG4gICAgdmFsdWVGaWVsZElkOiBzdHJpbmdcbn1cblxuZXhwb3J0IHsgVHJlZU5vZGUsIElucHV0U2VsZWN0VHJlZSB9XG5cbmNvbnN0IGNsaWNrT3V0c2lkZUNvbmZpZyA9IHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIGhhbmRsZUNsaWNrT3V0c2lkZTogKCkgPT4gKElucHV0U2VsZWN0VHJlZSBhcyBhbnkpLmhhbmRsZUNsaWNrT3V0c2lkZSxcbn1cblxuZXhwb3J0IGNvbnN0IElucHV0U2VsZWN0VHJlZUNvbXBvbmVudCA9IChcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIG9uQ2xpY2tPdXRzaWRlSE9DKHdpdGhUcmFuc2xhdGlvbigpKElucHV0U2VsZWN0VHJlZSBhcyBhbnkpLCBjbGlja091dHNpZGVDb25maWcpIGFzIGFueVxuKVxuIl19