studiokit-scaffolding-js 7.0.12-next.1.4 → 7.0.12-next.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (258) hide show
  1. package/lib/components/ActionList.js +170 -34
  2. package/lib/components/AlertDialog.js +133 -9
  3. package/lib/components/AlertWithIcon.js +92 -25
  4. package/lib/components/ConnectedModal.js +43 -13
  5. package/lib/components/Dropdowns/GroupsDropdown.js +69 -44
  6. package/lib/components/Dropdowns/ManagedNavDropdown.js +100 -67
  7. package/lib/components/Dropdowns/UserDropdown.js +111 -21
  8. package/lib/components/Dropdowns/index.js +27 -9
  9. package/lib/components/EntityOwnerList.js +52 -18
  10. package/lib/components/Error.js +106 -11
  11. package/lib/components/ErrorBoundary.js +134 -35
  12. package/lib/components/ErrorMessage.js +44 -9
  13. package/lib/components/Forms/DateField.js +61 -42
  14. package/lib/components/Forms/TimeField.js +81 -42
  15. package/lib/components/Forms/index.js +27 -4
  16. package/lib/components/Groups/CreateEditCopySaveButtons.js +114 -11
  17. package/lib/components/Groups/ExternalGroups/Attach.js +212 -148
  18. package/lib/components/Groups/ExternalGroups/Table.js +181 -45
  19. package/lib/components/Groups/GroupCreateOrEditCommonProps.js +5 -1
  20. package/lib/components/Groups/RosterSyncInfo.js +147 -20
  21. package/lib/components/HOC/AccessibleAppComponent.js +98 -73
  22. package/lib/components/HOC/ActivityRequiredComponent.js +92 -49
  23. package/lib/components/HOC/AsyncComponent.js +54 -39
  24. package/lib/components/HOC/AuthenticatedComponent.js +58 -38
  25. package/lib/components/HOC/CollectionComponent.js +170 -110
  26. package/lib/components/HOC/CollectionFirstItemComponent.js +51 -38
  27. package/lib/components/HOC/CollectionItemComponent.js +168 -106
  28. package/lib/components/HOC/ConnectedModalComponent.js +109 -80
  29. package/lib/components/HOC/DataDependentComponent.js +29 -21
  30. package/lib/components/HOC/EntityComponent.js +71 -57
  31. package/lib/components/HOC/FullscreenModalComponent.js +163 -123
  32. package/lib/components/HOC/GroupActivityRequiredComponent.js +45 -31
  33. package/lib/components/HOC/GuidComponent.js +29 -22
  34. package/lib/components/HOC/ModelContextDependencyVerifyComponent.js +41 -31
  35. package/lib/components/HOC/ModelErrorRedirectComponent.js +51 -47
  36. package/lib/components/HOC/SearchPersistorComponent.js +240 -166
  37. package/lib/components/HOC/UnauthenticatedComponent.js +37 -25
  38. package/lib/components/HOC/UserComponent.js +12 -7
  39. package/lib/components/Icons/IconAlphaList.js +33 -5
  40. package/lib/components/Icons/IconExternalUser.js +33 -5
  41. package/lib/components/Icons/IconImpersonation.js +33 -5
  42. package/lib/components/Icons/IconStopImpersonating.js +33 -5
  43. package/lib/components/Icons/IconTable.js +35 -7
  44. package/lib/components/Icons/IconTableDeleteCol.js +33 -5
  45. package/lib/components/Icons/IconTableDeleteRow.js +33 -5
  46. package/lib/components/Icons/IconTableInsertCol.js +33 -5
  47. package/lib/components/Icons/IconTableInsertRow.js +33 -5
  48. package/lib/components/Impersonation/Button.js +77 -13
  49. package/lib/components/Impersonation/Link.js +77 -13
  50. package/lib/components/Impersonation/UserDetail.js +66 -9
  51. package/lib/components/Loading.js +26 -4
  52. package/lib/components/LockDownBrowser/Check.js +194 -49
  53. package/lib/components/LockDownBrowser/ExitButton.js +26 -9
  54. package/lib/components/LockDownBrowser/Launch.js +70 -62
  55. package/lib/components/Lti/Confirm.js +152 -11
  56. package/lib/components/Lti/CreateNonLtiGroupAlertDialog.js +170 -33
  57. package/lib/components/Lti/Launch.js +105 -24
  58. package/lib/components/Lti/LaunchGroup.js +85 -13
  59. package/lib/components/ManageTable.js +309 -87
  60. package/lib/components/ManageTableNoDataComponent.js +42 -4
  61. package/lib/components/NewVersionAlert.js +82 -46
  62. package/lib/components/NotFound.js +86 -10
  63. package/lib/components/Notifications.js +185 -126
  64. package/lib/components/PaginationNextButton.js +33 -6
  65. package/lib/components/PaginationPreviousButton.js +33 -6
  66. package/lib/components/Quill/CustomToolbar.js +432 -218
  67. package/lib/components/Quill/Formats/Image.js +73 -63
  68. package/lib/components/Quill/Formats/List.js +45 -45
  69. package/lib/components/Quill/Formats/Video.js +28 -24
  70. package/lib/components/Quill/ImageDropModule.js +147 -117
  71. package/lib/components/Quill/ImageWarning.js +47 -9
  72. package/lib/components/Quill/ImageWithAltTextModal.js +425 -86
  73. package/lib/components/Quill/Specs/CustomImageSpec.js +42 -34
  74. package/lib/components/Quill/Specs/CustomVideoSpec.js +34 -28
  75. package/lib/components/Quill/TableModule/Blots/BaseTableBlot.js +98 -98
  76. package/lib/components/Quill/TableModule/Blots/TableBlot.js +52 -47
  77. package/lib/components/Quill/TableModule/Blots/TableBodyBlot.js +53 -48
  78. package/lib/components/Quill/TableModule/Blots/TableCellBlot.js +224 -221
  79. package/lib/components/Quill/TableModule/Blots/TableContainer.js +80 -83
  80. package/lib/components/Quill/TableModule/Blots/TableRowBlot.js +75 -70
  81. package/lib/components/Quill/TableModule/constants.js +45 -41
  82. package/lib/components/Quill/TableModule/index.js +362 -301
  83. package/lib/components/Quill/TableModule/utils.js +42 -38
  84. package/lib/components/Quill/accessibilityFix.js +234 -232
  85. package/lib/components/Quill/index.js +34 -28
  86. package/lib/components/RefreshIndicator/Bordered.js +47 -6
  87. package/lib/components/RefreshIndicator/Inline.js +47 -8
  88. package/lib/components/RefreshIndicator/index.js +263 -59
  89. package/lib/components/SearchControls.js +216 -11
  90. package/lib/components/SentryRoute.js +11 -6
  91. package/lib/components/Tables/RoleFilter.js +69 -32
  92. package/lib/components/Tables/TextFilter.js +62 -13
  93. package/lib/components/UserRoles/Add.js +199 -96
  94. package/lib/components/UserRoles/Context.js +11 -7
  95. package/lib/components/UserRoles/RoleCell.js +181 -72
  96. package/lib/components/UserRoles/Select.js +157 -17
  97. package/lib/components/UserRoles/Table.js +221 -80
  98. package/lib/components/UserRoles/index.js +534 -384
  99. package/lib/config/eslint/index.js +32 -28
  100. package/lib/config/eslint/lib/order.js +26 -27
  101. package/lib/config/eslint/lib/prettier.js +20 -18
  102. package/lib/config/eslint/lib/typescript.js +93 -112
  103. package/lib/config/eslint/react.js +24 -14
  104. package/lib/constants/baseActivity.js +30 -26
  105. package/lib/constants/baseRole.js +14 -10
  106. package/lib/constants/configuration.js +33 -29
  107. package/lib/constants/externalProviderType.js +10 -6
  108. package/lib/constants/fetchErrorData.js +15 -11
  109. package/lib/constants/index.js +137 -14
  110. package/lib/constants/lockDownBrowser.js +28 -24
  111. package/lib/constants/mockData.js +382 -297
  112. package/lib/constants/modelStatus.js +15 -11
  113. package/lib/constants/notificationType.js +12 -8
  114. package/lib/constants/operatingSystem.js +12 -8
  115. package/lib/constants/shard.js +11 -7
  116. package/lib/constants/table.js +21 -21
  117. package/lib/constants/tier.js +12 -8
  118. package/lib/constants/userRole.js +15 -5
  119. package/lib/endpointMappings.js +197 -181
  120. package/lib/hooks/useCollection.js +82 -62
  121. package/lib/hooks/useCollectionConfiguration.js +228 -83
  122. package/lib/hooks/useCollectionItem.js +154 -54
  123. package/lib/hooks/useGuid.js +20 -8
  124. package/lib/hooks/usePrevious.js +19 -13
  125. package/lib/index.js +157 -25
  126. package/lib/redux/actionCreator.js +50 -28
  127. package/lib/redux/actions/AuthAction.js +44 -31
  128. package/lib/redux/actions/ModalAction.js +10 -6
  129. package/lib/redux/actions/ModelAction.js +77 -39
  130. package/lib/redux/actions/NotificationAction.js +10 -6
  131. package/lib/redux/actions/SearchAction.js +9 -5
  132. package/lib/redux/actions/index.js +60 -7
  133. package/lib/redux/configureReducers.js +60 -49
  134. package/lib/redux/configureStore.js +83 -87
  135. package/lib/redux/helpers.js +6 -2
  136. package/lib/redux/reducers/authReducer.js +50 -43
  137. package/lib/redux/reducers/index.js +41 -13
  138. package/lib/redux/reducers/modalsReducer.js +47 -29
  139. package/lib/redux/reducers/modelsReducer.js +178 -173
  140. package/lib/redux/reducers/notificationsReducer.js +24 -18
  141. package/lib/redux/reducers/searchReducer.js +25 -19
  142. package/lib/redux/sagas/appInsightsSaga.js +22 -18
  143. package/lib/redux/sagas/authSaga.js +253 -218
  144. package/lib/redux/sagas/caliperSaga.js +159 -143
  145. package/lib/redux/sagas/clockOffsetSaga.js +34 -31
  146. package/lib/redux/sagas/configurationSaga.js +11 -7
  147. package/lib/redux/sagas/downtimeApiErrorSaga.js +20 -17
  148. package/lib/redux/sagas/errorSaga.js +27 -21
  149. package/lib/redux/sagas/googleAnalyticsSaga.js +28 -24
  150. package/lib/redux/sagas/identityProviderSaga.js +22 -18
  151. package/lib/redux/sagas/initialDataLoadSaga.js +37 -28
  152. package/lib/redux/sagas/lockDownBrowserErrorSaga.js +29 -20
  153. package/lib/redux/sagas/modelFetchSaga.js +355 -322
  154. package/lib/redux/sagas/noStoreSaga.js +61 -48
  155. package/lib/redux/sagas/postLoginDataSaga.js +45 -34
  156. package/lib/redux/sagas/postLoginRedirectSaga.js +27 -27
  157. package/lib/redux/sagas/rootSaga.js +82 -57
  158. package/lib/redux/sagas/sentrySaga.js +29 -25
  159. package/lib/redux/sagas/userIdSaga.js +16 -12
  160. package/lib/services/codeProviderService.js +25 -19
  161. package/lib/services/dateService.js +12 -7
  162. package/lib/services/documentService.js +17 -12
  163. package/lib/services/fetchService.js +129 -112
  164. package/lib/services/persistenceService.js +33 -29
  165. package/lib/services/ticketProviderService.js +29 -23
  166. package/lib/services/tokenPersistenceService.js +12 -8
  167. package/lib/services/windowService.js +18 -14
  168. package/lib/startup.js +132 -114
  169. package/lib/types/AppConfiguration.js +5 -1
  170. package/lib/types/Artifact.js +11 -7
  171. package/lib/types/BaseReduxState.js +5 -1
  172. package/lib/types/Client.js +5 -1
  173. package/lib/types/Collection.js +5 -1
  174. package/lib/types/Configuration.js +5 -1
  175. package/lib/types/DeepLinkingResponseRequest.js +5 -1
  176. package/lib/types/DeletableModel.js +5 -1
  177. package/lib/types/Event.js +5 -1
  178. package/lib/types/ExternalGroup.js +5 -1
  179. package/lib/types/ExternalProvider.js +5 -1
  180. package/lib/types/ExternalTerm.js +5 -1
  181. package/lib/types/Group.js +5 -1
  182. package/lib/types/IdentityProvider.js +5 -1
  183. package/lib/types/LtiLaunch.js +5 -1
  184. package/lib/types/NameOnlyEntity.js +5 -1
  185. package/lib/types/Notification.js +5 -1
  186. package/lib/types/OptionalRecord.js +5 -1
  187. package/lib/types/OwnerSchedule.js +5 -1
  188. package/lib/types/PropertyOfType.js +5 -1
  189. package/lib/types/Quill.js +5 -1
  190. package/lib/types/RoleDescription.js +5 -1
  191. package/lib/types/Search.js +5 -1
  192. package/lib/types/SimpleLocation.js +5 -1
  193. package/lib/types/UniTime.js +5 -1
  194. package/lib/types/User.js +5 -1
  195. package/lib/types/UserRole.js +5 -1
  196. package/lib/types/auth/AuthState.js +5 -1
  197. package/lib/types/auth/CasV1LoginRequestBody.js +5 -1
  198. package/lib/types/auth/ClientCredentials.js +5 -1
  199. package/lib/types/auth/CodeProviderService.js +5 -1
  200. package/lib/types/auth/LocalLoginRequestBody.js +5 -1
  201. package/lib/types/auth/TicketProviderService.js +5 -1
  202. package/lib/types/auth/TokenPersistenceService.js +5 -1
  203. package/lib/types/auth/index.js +82 -9
  204. package/lib/types/externals.d.js +2 -0
  205. package/lib/types/index.js +313 -30
  206. package/lib/types/net/EndpointConfig.js +5 -1
  207. package/lib/types/net/EndpointMapping.js +5 -1
  208. package/lib/types/net/EndpointMappings.js +5 -1
  209. package/lib/types/net/ErrorHandler.js +5 -1
  210. package/lib/types/net/FetchConfig.js +5 -1
  211. package/lib/types/net/FetchErrorData.js +10 -6
  212. package/lib/types/net/FetchResult.js +5 -1
  213. package/lib/types/net/HTTPMethod.js +5 -1
  214. package/lib/types/net/HTTPStatusCode.js +16 -12
  215. package/lib/types/net/Metadata.js +5 -1
  216. package/lib/types/net/Model.js +5 -1
  217. package/lib/types/net/ModelCollection.js +5 -1
  218. package/lib/types/net/ModelsState.js +5 -1
  219. package/lib/types/net/OAuthToken.js +5 -1
  220. package/lib/types/net/OAuthTokenOrNull.js +5 -1
  221. package/lib/types/net/TokenAccessFunction.js +5 -1
  222. package/lib/types/net/index.js +181 -18
  223. package/lib/utils/baseActivity.js +133 -123
  224. package/lib/utils/baseRole.js +37 -33
  225. package/lib/utils/collection.js +425 -298
  226. package/lib/utils/cookies.js +22 -19
  227. package/lib/utils/date.js +303 -279
  228. package/lib/utils/dom.js +176 -165
  229. package/lib/utils/domainIdentifier.js +9 -5
  230. package/lib/utils/entityUserRole.js +6 -2
  231. package/lib/utils/error.js +17 -15
  232. package/lib/utils/events.js +40 -31
  233. package/lib/utils/externalGroup.js +22 -18
  234. package/lib/utils/externalProviders.js +8 -4
  235. package/lib/utils/externalTerms.js +10 -3
  236. package/lib/utils/fetch.js +179 -180
  237. package/lib/utils/group.js +18 -7
  238. package/lib/utils/groupDates.js +37 -33
  239. package/lib/utils/groupRoles.js +25 -21
  240. package/lib/utils/lockDownBrowser.js +15 -11
  241. package/lib/utils/logger.js +26 -22
  242. package/lib/utils/lti.js +9 -4
  243. package/lib/utils/model.js +36 -41
  244. package/lib/utils/number.js +21 -18
  245. package/lib/utils/promise.js +28 -21
  246. package/lib/utils/quill.js +65 -62
  247. package/lib/utils/route.js +58 -55
  248. package/lib/utils/search.js +76 -80
  249. package/lib/utils/shard.js +37 -37
  250. package/lib/utils/sort.js +50 -42
  251. package/lib/utils/string.js +13 -8
  252. package/lib/utils/table.js +38 -33
  253. package/lib/utils/timezone.js +10 -6
  254. package/lib/utils/url.js +142 -142
  255. package/lib/utils/user.js +58 -55
  256. package/lib/utils/userAgent.js +10 -10
  257. package/lib/utils/userRole.js +57 -49
  258. package/package.json +17 -3
@@ -1,354 +1,481 @@
1
1
  "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.selectCollectionItemFromState = selectCollectionItemFromState;
4
- exports.selectCollectionFromState = selectCollectionFromState;
5
- exports.stopCollectionPeriodicLoad = stopCollectionPeriodicLoad;
6
- exports.loadCollection = loadCollection;
7
- exports.loadCollectionItem = loadCollectionItem;
8
- exports.createItemInCollection = createItemInCollection;
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.cleanupCollectionGuidKey = cleanupCollectionGuidKey;
9
8
  exports.createCollectionItem = createCollectionItem;
10
- exports.updateItemInCollection = updateItemInCollection;
11
- exports.updateCollectionItem = updateCollectionItem;
12
- exports.deleteItemFromCollection = deleteItemFromCollection;
9
+ exports.createItemInCollection = createItemInCollection;
13
10
  exports.deleteCollectionItem = deleteCollectionItem;
14
- exports.initializeCollectionItem = initializeCollectionItem;
15
- exports.initializeCollection = initializeCollection;
11
+ exports.deleteItemFromCollection = deleteItemFromCollection;
16
12
  exports.handleCollectionItemParamsChange = handleCollectionItemParamsChange;
17
13
  exports.handleCollectionParamsChange = handleCollectionParamsChange;
18
- exports.cleanupCollectionGuidKey = cleanupCollectionGuidKey;
19
- const tslib_1 = require("tslib");
20
- const lodash_1 = require("lodash");
21
- const memoize_one_1 = tslib_1.__importDefault(require("memoize-one"));
22
- const constants_1 = require("../constants");
23
- const actionCreator_1 = require("../redux/actionCreator");
24
- const route_1 = require("./route");
14
+ exports.initializeCollection = initializeCollection;
15
+ exports.initializeCollectionItem = initializeCollectionItem;
16
+ exports.loadCollection = loadCollection;
17
+ exports.loadCollectionItem = loadCollectionItem;
18
+ exports.selectCollectionFromState = selectCollectionFromState;
19
+ exports.selectCollectionItemFromState = selectCollectionItemFromState;
20
+ exports.stopCollectionPeriodicLoad = stopCollectionPeriodicLoad;
21
+ exports.updateCollectionItem = updateCollectionItem;
22
+ exports.updateItemInCollection = updateItemInCollection;
23
+ var _lodash = require("lodash");
24
+ var _memoizeOne = _interopRequireDefault(require("memoize-one"));
25
+ var _constants = require("../constants");
26
+ var _actionCreator = require("../redux/actionCreator");
27
+ var _route = require("./route");
25
28
  //#region Redux Methods
26
- const getPathParams = (0, memoize_one_1.default)((pathParams, routeMatchParams, modelName) => pathParams || (0, route_1.getPathParamsFromRouteMatchParams)(routeMatchParams, modelName));
29
+
30
+ const getPathParams = (0, _memoizeOne.default)((pathParams, routeMatchParams, modelName) => pathParams || (0, _route.getPathParamsFromRouteMatchParams)(routeMatchParams, modelName));
27
31
  function selectCollectionItemFromState(params) {
28
- const { guid, modelName, pathParams, routeMatchParams, state } = params;
29
- const modelNameLevelCount = (0, route_1.getMinRequiredPathParamsCount)(modelName);
30
- const p = getPathParams(pathParams, routeMatchParams, modelName);
31
- const reduxModelName = (0, route_1.getReduxModelName)(p, modelName);
32
- let model = {};
33
- // find `model` using `guid` as its key, to match new item created in `create()`
34
- if (p.length === modelNameLevelCount) {
35
- const collection = ((0, lodash_1.get)(state.models, reduxModelName) || {});
36
- if (Object.prototype.hasOwnProperty.call(collection, guid)) {
37
- model = collection[guid];
38
- }
39
- else {
40
- const modelByGuid = (0, lodash_1.find)((0, lodash_1.values)(collection), (m) => !!m && 'guid' in m && m.guid === guid);
41
- model = modelByGuid || model;
42
- }
32
+ const {
33
+ guid,
34
+ modelName,
35
+ pathParams,
36
+ routeMatchParams,
37
+ state
38
+ } = params;
39
+ const modelNameLevelCount = (0, _route.getMinRequiredPathParamsCount)(modelName);
40
+ const p = getPathParams(pathParams, routeMatchParams, modelName);
41
+ const reduxModelName = (0, _route.getReduxModelName)(p, modelName);
42
+ let model = {};
43
+ // find `model` using `guid` as its key, to match new item created in `create()`
44
+ if (p.length === modelNameLevelCount) {
45
+ const collection = (0, _lodash.get)(state.models, reduxModelName) || {};
46
+ if (Object.prototype.hasOwnProperty.call(collection, guid)) {
47
+ model = collection[guid];
48
+ } else {
49
+ const modelByGuid = (0, _lodash.find)((0, _lodash.values)(collection), m => !!m && 'guid' in m && m.guid === guid);
50
+ model = modelByGuid || model;
43
51
  }
44
- else {
45
- // find `model` using pathParams
46
- const reduxModel = ((0, lodash_1.get)(state.models, reduxModelName) || {});
47
- model = (Object.keys(reduxModel).length > 0 ? reduxModel : {});
48
- }
49
- return {
50
- modelName,
51
- pathParams: p,
52
- model,
53
- isCollectionItem: true
54
- };
52
+ } else {
53
+ // find `model` using pathParams
54
+ const reduxModel = (0, _lodash.get)(state.models, reduxModelName) || {};
55
+ model = Object.keys(reduxModel).length > 0 ? reduxModel : {};
56
+ }
57
+ return {
58
+ modelName,
59
+ pathParams: p,
60
+ model,
61
+ isCollectionItem: true
62
+ };
55
63
  }
56
64
  function selectCollectionFromState(params) {
57
- const { modelName, pathParams, routeMatchParams, state } = params;
58
- const p = getPathParams(pathParams, routeMatchParams, modelName);
59
- const reduxModelName = (0, route_1.getReduxModelName)(p, modelName);
60
- let model = (0, lodash_1.get)(state.models, reduxModelName);
61
- model = model && Object.keys(model).length > 0 ? model : {};
62
- return {
63
- modelName,
64
- pathParams: p,
65
- model,
66
- isCollectionItem: false
67
- };
65
+ const {
66
+ modelName,
67
+ pathParams,
68
+ routeMatchParams,
69
+ state
70
+ } = params;
71
+ const p = getPathParams(pathParams, routeMatchParams, modelName);
72
+ const reduxModelName = (0, _route.getReduxModelName)(p, modelName);
73
+ let model = (0, _lodash.get)(state.models, reduxModelName);
74
+ model = model && Object.keys(model).length > 0 ? model : {};
75
+ return {
76
+ modelName,
77
+ pathParams: p,
78
+ model,
79
+ isCollectionItem: false
80
+ };
68
81
  }
82
+
69
83
  //#endregion Redux Methods
84
+
70
85
  //#region Collection/Item CRUD Methods
86
+
71
87
  //#region Load
88
+
72
89
  function stopCollectionPeriodicLoad(taskId) {
73
- (0, actionCreator_1.dispatchPeriodicModelFetchTerminateAction)({
74
- taskId
75
- });
90
+ (0, _actionCreator.dispatchPeriodicModelFetchTerminateAction)({
91
+ taskId
92
+ });
76
93
  }
77
- function loadCollection(config, params = {}) {
78
- const { modelName, isInitialized, pathParams: configPathParams, queryParams: configQueryParams, changeModelStatus } = config;
79
- const { id, pathParams, queryParams, period, taskId, replaceValue } = params;
80
- const p = (0, lodash_1.concat)([], pathParams || configPathParams, id ? [id] : []);
81
- if (p.length !== (0, route_1.getMinRequiredPathParamsCount)(modelName) + (id ? 1 : 0)) {
82
- throw new Error('pathParams length does not match length of path components');
83
- }
84
- if (isInitialized) {
85
- changeModelStatus(constants_1.MODEL_STATUS.LOADING, id);
86
- }
87
- if (!period) {
88
- (0, actionCreator_1.dispatchModelFetchRequest)({
89
- modelName,
90
- method: 'GET',
91
- pathParams: p,
92
- queryParams: queryParams || configQueryParams,
93
- replaceValue
94
- });
95
- }
96
- else {
97
- if (!taskId)
98
- throw new Error('taskId is required for periodic data requests');
99
- (0, actionCreator_1.dispatchPeriodicModelFetchRequest)({
100
- modelName,
101
- method: 'GET',
102
- pathParams: p,
103
- queryParams: queryParams || configQueryParams,
104
- period,
105
- taskId,
106
- replaceValue
107
- });
108
- }
94
+ function loadCollection(config) {
95
+ let params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
96
+ const {
97
+ modelName,
98
+ isInitialized,
99
+ pathParams: configPathParams,
100
+ queryParams: configQueryParams,
101
+ changeModelStatus
102
+ } = config;
103
+ const {
104
+ id,
105
+ pathParams,
106
+ queryParams,
107
+ period,
108
+ taskId,
109
+ replaceValue
110
+ } = params;
111
+ const p = (0, _lodash.concat)([], pathParams || configPathParams, id ? [id] : []);
112
+ if (p.length !== (0, _route.getMinRequiredPathParamsCount)(modelName) + (id ? 1 : 0)) {
113
+ throw new Error('pathParams length does not match length of path components');
114
+ }
115
+ if (isInitialized) {
116
+ changeModelStatus(_constants.MODEL_STATUS.LOADING, id);
117
+ }
118
+ if (!period) {
119
+ (0, _actionCreator.dispatchModelFetchRequest)({
120
+ modelName,
121
+ method: 'GET',
122
+ pathParams: p,
123
+ queryParams: queryParams || configQueryParams,
124
+ replaceValue
125
+ });
126
+ } else {
127
+ if (!taskId) throw new Error('taskId is required for periodic data requests');
128
+ (0, _actionCreator.dispatchPeriodicModelFetchRequest)({
129
+ modelName,
130
+ method: 'GET',
131
+ pathParams: p,
132
+ queryParams: queryParams || configQueryParams,
133
+ period,
134
+ taskId,
135
+ replaceValue
136
+ });
137
+ }
109
138
  }
110
- function loadCollectionItem(config, params = {}) {
111
- const { modelName, isInitialized, pathParams: configPathParams, queryParams: configQueryParams, changeModelStatus } = config;
112
- const { pathParams, queryParams, period, taskId, replaceValue } = params;
113
- const p = pathParams || configPathParams;
114
- if (p.length < (0, route_1.getMinRequiredPathParamsCount)(modelName) + 1) {
115
- throw new Error('pathParams length does not match length of path components');
116
- }
117
- if (isInitialized) {
118
- changeModelStatus(constants_1.MODEL_STATUS.LOADING);
119
- }
120
- if (!period) {
121
- (0, actionCreator_1.dispatchModelFetchRequest)({
122
- modelName,
123
- method: 'GET',
124
- pathParams: p,
125
- queryParams: queryParams || configQueryParams,
126
- replaceValue
127
- });
128
- }
129
- else {
130
- if (!taskId)
131
- throw new Error('taskId is required for periodic data requests');
132
- (0, actionCreator_1.dispatchPeriodicModelFetchRequest)({
133
- modelName,
134
- method: 'GET',
135
- pathParams: p,
136
- queryParams: queryParams || configQueryParams,
137
- period,
138
- taskId,
139
- replaceValue
140
- });
141
- }
139
+ function loadCollectionItem(config) {
140
+ let params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
141
+ const {
142
+ modelName,
143
+ isInitialized,
144
+ pathParams: configPathParams,
145
+ queryParams: configQueryParams,
146
+ changeModelStatus
147
+ } = config;
148
+ const {
149
+ pathParams,
150
+ queryParams,
151
+ period,
152
+ taskId,
153
+ replaceValue
154
+ } = params;
155
+ const p = pathParams || configPathParams;
156
+ if (p.length < (0, _route.getMinRequiredPathParamsCount)(modelName) + 1) {
157
+ throw new Error('pathParams length does not match length of path components');
158
+ }
159
+ if (isInitialized) {
160
+ changeModelStatus(_constants.MODEL_STATUS.LOADING);
161
+ }
162
+ if (!period) {
163
+ (0, _actionCreator.dispatchModelFetchRequest)({
164
+ modelName,
165
+ method: 'GET',
166
+ pathParams: p,
167
+ queryParams: queryParams || configQueryParams,
168
+ replaceValue
169
+ });
170
+ } else {
171
+ if (!taskId) throw new Error('taskId is required for periodic data requests');
172
+ (0, _actionCreator.dispatchPeriodicModelFetchRequest)({
173
+ modelName,
174
+ method: 'GET',
175
+ pathParams: p,
176
+ queryParams: queryParams || configQueryParams,
177
+ period,
178
+ taskId,
179
+ replaceValue
180
+ });
181
+ }
142
182
  }
183
+
143
184
  //#endregion Load
185
+
144
186
  //#region Create
187
+
145
188
  function createItemInCollection(config, params) {
146
- const { guid, modelName, pathParams, queryParams: configQueryParams, changeModelStatus } = config;
147
- const { body, contentType, queryParams } = params;
148
- if (pathParams.length < (0, route_1.getMinRequiredPathParamsCount)(modelName)) {
149
- throw new Error('pathParams length does not match length of path components');
150
- }
151
- changeModelStatus(constants_1.MODEL_STATUS.CREATING, guid);
152
- (0, actionCreator_1.dispatchModelFetchRequest)({
153
- modelName,
154
- guid,
155
- method: 'POST',
156
- body,
157
- pathParams,
158
- contentType,
159
- queryParams: queryParams || configQueryParams
160
- });
189
+ const {
190
+ guid,
191
+ modelName,
192
+ pathParams,
193
+ queryParams: configQueryParams,
194
+ changeModelStatus
195
+ } = config;
196
+ const {
197
+ body,
198
+ contentType,
199
+ queryParams
200
+ } = params;
201
+ if (pathParams.length < (0, _route.getMinRequiredPathParamsCount)(modelName)) {
202
+ throw new Error('pathParams length does not match length of path components');
203
+ }
204
+ changeModelStatus(_constants.MODEL_STATUS.CREATING, guid);
205
+ (0, _actionCreator.dispatchModelFetchRequest)({
206
+ modelName,
207
+ guid,
208
+ method: 'POST',
209
+ body,
210
+ pathParams,
211
+ contentType,
212
+ queryParams: queryParams || configQueryParams
213
+ });
161
214
  }
162
215
  function createCollectionItem(model, config, params) {
163
- if (model.id) {
164
- throw new Error('model already exists');
165
- }
166
- const { guid, modelName, pathParams, queryParams: configQueryParams, changeModelStatus } = config;
167
- const { body, contentType, queryParams } = params;
168
- if (pathParams.length < (0, route_1.getMinRequiredPathParamsCount)(modelName)) {
169
- throw new Error('pathParams length does not match length of path components');
170
- }
171
- changeModelStatus(constants_1.MODEL_STATUS.CREATING);
172
- (0, actionCreator_1.dispatchModelFetchRequest)({
173
- modelName,
174
- guid,
175
- method: 'POST',
176
- body,
177
- pathParams,
178
- contentType,
179
- queryParams: queryParams || configQueryParams
180
- });
216
+ if (model.id) {
217
+ throw new Error('model already exists');
218
+ }
219
+ const {
220
+ guid,
221
+ modelName,
222
+ pathParams,
223
+ queryParams: configQueryParams,
224
+ changeModelStatus
225
+ } = config;
226
+ const {
227
+ body,
228
+ contentType,
229
+ queryParams
230
+ } = params;
231
+ if (pathParams.length < (0, _route.getMinRequiredPathParamsCount)(modelName)) {
232
+ throw new Error('pathParams length does not match length of path components');
233
+ }
234
+ changeModelStatus(_constants.MODEL_STATUS.CREATING);
235
+ (0, _actionCreator.dispatchModelFetchRequest)({
236
+ modelName,
237
+ guid,
238
+ method: 'POST',
239
+ body,
240
+ pathParams,
241
+ contentType,
242
+ queryParams: queryParams || configQueryParams
243
+ });
181
244
  }
245
+
182
246
  //#endregion Create
247
+
183
248
  //#region Update
249
+
184
250
  function updateItemInCollection(config, params) {
185
- const { id, body, contentType, method, queryParams } = params;
186
- if (!id) {
187
- throw new Error(`'id' is required`);
188
- }
189
- if (!body) {
190
- throw new Error(`'body' is required`);
191
- }
192
- const { modelName, pathParams: configPathParams, queryParams: configQueryParams, changeModelStatus } = config;
193
- const pathParams = (0, lodash_1.concat)([], configPathParams, [id]);
194
- if (pathParams.length !== (0, route_1.getMinRequiredPathParamsCount)(modelName) + 1) {
195
- throw new Error('pathParams+id length does not match length of path components');
196
- }
197
- const m = method || 'PUT';
198
- changeModelStatus(constants_1.MODEL_STATUS.UPDATING, id);
199
- (0, actionCreator_1.dispatchModelFetchRequest)({
200
- modelName,
201
- method: m,
202
- pathParams,
203
- queryParams: queryParams || configQueryParams,
204
- body,
205
- contentType
206
- });
251
+ const {
252
+ id,
253
+ body,
254
+ contentType,
255
+ method,
256
+ queryParams
257
+ } = params;
258
+ if (!id) {
259
+ throw new Error(`'id' is required`);
260
+ }
261
+ if (!body) {
262
+ throw new Error(`'body' is required`);
263
+ }
264
+ const {
265
+ modelName,
266
+ pathParams: configPathParams,
267
+ queryParams: configQueryParams,
268
+ changeModelStatus
269
+ } = config;
270
+ const pathParams = (0, _lodash.concat)([], configPathParams, [id]);
271
+ if (pathParams.length !== (0, _route.getMinRequiredPathParamsCount)(modelName) + 1) {
272
+ throw new Error('pathParams+id length does not match length of path components');
273
+ }
274
+ const m = method || 'PUT';
275
+ changeModelStatus(_constants.MODEL_STATUS.UPDATING, id);
276
+ (0, _actionCreator.dispatchModelFetchRequest)({
277
+ modelName,
278
+ method: m,
279
+ pathParams,
280
+ queryParams: queryParams || configQueryParams,
281
+ body,
282
+ contentType
283
+ });
207
284
  }
208
285
  function updateCollectionItem(model, config, params) {
209
- if (!model.id) {
210
- throw new Error('model does not exist');
211
- }
212
- const { body, contentType, method, queryParams } = params;
213
- if (!body) {
214
- throw new Error(`'body' is required`);
215
- }
216
- const { modelName, pathParams, queryParams: configQueryParams, changeModelStatus } = config;
217
- if (pathParams.length < (0, route_1.getMinRequiredPathParamsCount)(modelName) + 1) {
218
- throw new Error('pathParams length does not match length of path components');
219
- }
220
- const m = method || 'PUT';
221
- changeModelStatus(constants_1.MODEL_STATUS.UPDATING);
222
- (0, actionCreator_1.dispatchModelFetchRequest)({
223
- modelName,
224
- method: m,
225
- pathParams,
226
- body,
227
- contentType,
228
- queryParams: queryParams || configQueryParams
229
- });
286
+ if (!model.id) {
287
+ throw new Error('model does not exist');
288
+ }
289
+ const {
290
+ body,
291
+ contentType,
292
+ method,
293
+ queryParams
294
+ } = params;
295
+ if (!body) {
296
+ throw new Error(`'body' is required`);
297
+ }
298
+ const {
299
+ modelName,
300
+ pathParams,
301
+ queryParams: configQueryParams,
302
+ changeModelStatus
303
+ } = config;
304
+ if (pathParams.length < (0, _route.getMinRequiredPathParamsCount)(modelName) + 1) {
305
+ throw new Error('pathParams length does not match length of path components');
306
+ }
307
+ const m = method || 'PUT';
308
+ changeModelStatus(_constants.MODEL_STATUS.UPDATING);
309
+ (0, _actionCreator.dispatchModelFetchRequest)({
310
+ modelName,
311
+ method: m,
312
+ pathParams,
313
+ body,
314
+ contentType,
315
+ queryParams: queryParams || configQueryParams
316
+ });
230
317
  }
318
+
231
319
  //#endregion Update
320
+
232
321
  //#region Delete
322
+
233
323
  function deleteItemFromCollection(config, params) {
234
- const { id, body, queryParams } = params;
235
- if (!id) {
236
- throw new Error(`'id' is required`);
237
- }
238
- const { modelName, pathParams, queryParams: configQueryParams, changeModelStatus } = config;
239
- const p = (0, lodash_1.concat)([], pathParams, [id]);
240
- if (p.length !== (0, route_1.getMinRequiredPathParamsCount)(modelName) + 1) {
241
- throw new Error('pathParams+id length does not match length of path components');
242
- }
243
- changeModelStatus(constants_1.MODEL_STATUS.DELETING, id);
244
- (0, actionCreator_1.dispatchModelFetchRequest)({
245
- modelName,
246
- method: 'DELETE',
247
- pathParams: p,
248
- queryParams: queryParams || configQueryParams,
249
- body
250
- });
324
+ const {
325
+ id,
326
+ body,
327
+ queryParams
328
+ } = params;
329
+ if (!id) {
330
+ throw new Error(`'id' is required`);
331
+ }
332
+ const {
333
+ modelName,
334
+ pathParams,
335
+ queryParams: configQueryParams,
336
+ changeModelStatus
337
+ } = config;
338
+ const p = (0, _lodash.concat)([], pathParams, [id]);
339
+ if (p.length !== (0, _route.getMinRequiredPathParamsCount)(modelName) + 1) {
340
+ throw new Error('pathParams+id length does not match length of path components');
341
+ }
342
+ changeModelStatus(_constants.MODEL_STATUS.DELETING, id);
343
+ (0, _actionCreator.dispatchModelFetchRequest)({
344
+ modelName,
345
+ method: 'DELETE',
346
+ pathParams: p,
347
+ queryParams: queryParams || configQueryParams,
348
+ body
349
+ });
251
350
  }
252
- function deleteCollectionItem(model, config, params = {}) {
253
- if (!model.id) {
254
- throw new Error('model does not exist');
255
- }
256
- const { body, queryParams } = params;
257
- const { modelName, pathParams, queryParams: configQueryParams, changeModelStatus } = config;
258
- if (pathParams.length < (0, route_1.getMinRequiredPathParamsCount)(modelName) + 1) {
259
- throw new Error('pathParams length does not match length of path components');
260
- }
261
- changeModelStatus(constants_1.MODEL_STATUS.DELETING);
262
- (0, actionCreator_1.dispatchModelFetchRequest)({
263
- modelName,
264
- method: 'DELETE',
265
- pathParams,
266
- body,
267
- queryParams: queryParams || configQueryParams
268
- });
351
+ function deleteCollectionItem(model, config) {
352
+ let params = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
353
+ if (!model.id) {
354
+ throw new Error('model does not exist');
355
+ }
356
+ const {
357
+ body,
358
+ queryParams
359
+ } = params;
360
+ const {
361
+ modelName,
362
+ pathParams,
363
+ queryParams: configQueryParams,
364
+ changeModelStatus
365
+ } = config;
366
+ if (pathParams.length < (0, _route.getMinRequiredPathParamsCount)(modelName) + 1) {
367
+ throw new Error('pathParams length does not match length of path components');
368
+ }
369
+ changeModelStatus(_constants.MODEL_STATUS.DELETING);
370
+ (0, _actionCreator.dispatchModelFetchRequest)({
371
+ modelName,
372
+ method: 'DELETE',
373
+ pathParams,
374
+ body,
375
+ queryParams: queryParams || configQueryParams
376
+ });
269
377
  }
378
+
270
379
  //#endregion Delete
380
+
271
381
  //#endregion Collection/Item CRUD Methods
382
+
272
383
  //#region Helper Methods
273
- /**
274
- * Automatically call `load`, or `changeModelStatus` to `READY`.
275
- *
276
- * Does NOT automatically load if:
277
- * * pathParams does not contain enough items.
278
- * * model is already fetching.
279
- * * auto load is disabled.
384
+
385
+ /**
386
+ * Automatically call `load`, or `changeModelStatus` to `READY`.
387
+ *
388
+ * Does NOT automatically load if:
389
+ * * pathParams does not contain enough items.
390
+ * * model is already fetching.
391
+ * * auto load is disabled.
280
392
  */
281
393
  function initializeCollectionItem(model, load, config) {
282
- const { modelName, pathParams, disableAutoLoad, changeModelStatus } = config;
283
- if (pathParams.length === (0, route_1.getMinRequiredPathParamsCount)(modelName) + 1 &&
284
- !disableAutoLoad &&
285
- (!model._metadata || !model._metadata.isFetching)) {
286
- load();
287
- }
288
- else {
289
- changeModelStatus(constants_1.MODEL_STATUS.READY);
290
- }
394
+ const {
395
+ modelName,
396
+ pathParams,
397
+ disableAutoLoad,
398
+ changeModelStatus
399
+ } = config;
400
+ if (pathParams.length === (0, _route.getMinRequiredPathParamsCount)(modelName) + 1 && !disableAutoLoad && (!model._metadata || !model._metadata.isFetching)) {
401
+ load();
402
+ } else {
403
+ changeModelStatus(_constants.MODEL_STATUS.READY);
404
+ }
291
405
  }
292
- /**
293
- * Automatically call `load`, or `changeModelStatus` to `READY`.
294
- *
295
- * Does NOT automatically load if:
296
- * * model is already fetching.
297
- * * auto load is disabled.
406
+
407
+ /**
408
+ * Automatically call `load`, or `changeModelStatus` to `READY`.
409
+ *
410
+ * Does NOT automatically load if:
411
+ * * model is already fetching.
412
+ * * auto load is disabled.
298
413
  */
299
414
  function initializeCollection(model, load, config) {
300
- const { disableAutoLoad, changeModelStatus } = config;
301
- if (!disableAutoLoad && (!model._metadata || !model._metadata.isFetching)) {
302
- load();
303
- }
304
- else if (disableAutoLoad) {
305
- changeModelStatus(constants_1.MODEL_STATUS.READY);
306
- }
415
+ const {
416
+ disableAutoLoad,
417
+ changeModelStatus
418
+ } = config;
419
+ if (!disableAutoLoad && (!model._metadata || !model._metadata.isFetching)) {
420
+ load();
421
+ } else if (disableAutoLoad) {
422
+ changeModelStatus(_constants.MODEL_STATUS.READY);
423
+ }
307
424
  }
308
- /**
309
- * When `pathParams` or `queryParams` change, call `load`
425
+
426
+ /**
427
+ * When `pathParams` or `queryParams` change, call `load`
310
428
  */
311
429
  function handleCollectionItemParamsChange(modelName, prevModelName, pathParams, prevPathParams, queryParams, prevQueryParams, load) {
312
- if (modelName !== prevModelName ||
313
- (pathParams.length === (0, route_1.getMinRequiredPathParamsCount)(modelName) + 1 && !(0, lodash_1.isEqual)(prevPathParams, pathParams)) ||
314
- !(0, lodash_1.isEqual)(prevQueryParams, queryParams)) {
315
- load({ pathParams, queryParams });
316
- }
430
+ if (modelName !== prevModelName || pathParams.length === (0, _route.getMinRequiredPathParamsCount)(modelName) + 1 && !(0, _lodash.isEqual)(prevPathParams, pathParams) || !(0, _lodash.isEqual)(prevQueryParams, queryParams)) {
431
+ load({
432
+ pathParams,
433
+ queryParams
434
+ });
435
+ }
317
436
  }
318
- /**
319
- * When `pathParams` or `queryParams` change, call `load`
437
+
438
+ /**
439
+ * When `pathParams` or `queryParams` change, call `load`
320
440
  */
321
441
  function handleCollectionParamsChange(modelName, prevModelName, pathParams, prevPathParams, queryParams, prevQueryParams, load) {
322
- if (modelName !== prevModelName ||
323
- (pathParams.length > 0 && !(0, lodash_1.isEqual)(prevPathParams, pathParams)) ||
324
- !(0, lodash_1.isEqual)(prevQueryParams, queryParams)) {
325
- load({ pathParams, queryParams });
326
- }
442
+ if (modelName !== prevModelName || pathParams.length > 0 && !(0, _lodash.isEqual)(prevPathParams, pathParams) || !(0, _lodash.isEqual)(prevQueryParams, queryParams)) {
443
+ load({
444
+ pathParams,
445
+ queryParams
446
+ });
447
+ }
327
448
  }
328
- /**
329
- * Delete the guid in the model
449
+
450
+ /**
451
+ * Delete the guid in the model
330
452
  */
331
453
  function cleanupCollectionGuidKey(model, config) {
332
- const { guid, modelName, pathParams } = config;
333
- if ((0, lodash_1.includes)(Object.keys(model), guid)) {
334
- const modelNames = modelName.split('.');
335
- const tempPathParams = pathParams.slice();
336
- // should include the guid at the end
337
- tempPathParams.push(guid);
338
- if (modelNames.length === tempPathParams.length) {
339
- let path = '';
340
- modelNames.forEach((m, i) => {
341
- if (i === 0) {
342
- path += `${m}.${tempPathParams[i]}`;
343
- }
344
- else {
345
- path += `.${m}.${tempPathParams[i]}`;
346
- }
347
- });
348
- (0, actionCreator_1.dispatchModelRemoveKeyAction)({
349
- modelPath: path
350
- });
454
+ const {
455
+ guid,
456
+ modelName,
457
+ pathParams
458
+ } = config;
459
+ if ((0, _lodash.includes)(Object.keys(model), guid)) {
460
+ const modelNames = modelName.split('.');
461
+ const tempPathParams = pathParams.slice();
462
+ // should include the guid at the end
463
+ tempPathParams.push(guid);
464
+ if (modelNames.length === tempPathParams.length) {
465
+ let path = '';
466
+ modelNames.forEach((m, i) => {
467
+ if (i === 0) {
468
+ path += `${m}.${tempPathParams[i]}`;
469
+ } else {
470
+ path += `.${m}.${tempPathParams[i]}`;
351
471
  }
472
+ });
473
+ (0, _actionCreator.dispatchModelRemoveKeyAction)({
474
+ modelPath: path
475
+ });
352
476
  }
477
+ }
353
478
  }
479
+
354
480
  //#endregion Helper Methods
481
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbG9kYXNoIiwicmVxdWlyZSIsIl9tZW1vaXplT25lIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsIl9jb25zdGFudHMiLCJfYWN0aW9uQ3JlYXRvciIsIl9yb3V0ZSIsImdldFBhdGhQYXJhbXMiLCJtZW1vaXplT25lIiwicGF0aFBhcmFtcyIsInJvdXRlTWF0Y2hQYXJhbXMiLCJtb2RlbE5hbWUiLCJnZXRQYXRoUGFyYW1zRnJvbVJvdXRlTWF0Y2hQYXJhbXMiLCJzZWxlY3RDb2xsZWN0aW9uSXRlbUZyb21TdGF0ZSIsInBhcmFtcyIsImd1aWQiLCJzdGF0ZSIsIm1vZGVsTmFtZUxldmVsQ291bnQiLCJnZXRNaW5SZXF1aXJlZFBhdGhQYXJhbXNDb3VudCIsInAiLCJyZWR1eE1vZGVsTmFtZSIsImdldFJlZHV4TW9kZWxOYW1lIiwibW9kZWwiLCJsZW5ndGgiLCJjb2xsZWN0aW9uIiwiZ2V0IiwibW9kZWxzIiwiT2JqZWN0IiwicHJvdG90eXBlIiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwibW9kZWxCeUd1aWQiLCJmaW5kIiwidmFsdWVzIiwibSIsInJlZHV4TW9kZWwiLCJrZXlzIiwiaXNDb2xsZWN0aW9uSXRlbSIsInNlbGVjdENvbGxlY3Rpb25Gcm9tU3RhdGUiLCJzdG9wQ29sbGVjdGlvblBlcmlvZGljTG9hZCIsInRhc2tJZCIsImRpc3BhdGNoUGVyaW9kaWNNb2RlbEZldGNoVGVybWluYXRlQWN0aW9uIiwibG9hZENvbGxlY3Rpb24iLCJjb25maWciLCJhcmd1bWVudHMiLCJ1bmRlZmluZWQiLCJpc0luaXRpYWxpemVkIiwiY29uZmlnUGF0aFBhcmFtcyIsInF1ZXJ5UGFyYW1zIiwiY29uZmlnUXVlcnlQYXJhbXMiLCJjaGFuZ2VNb2RlbFN0YXR1cyIsImlkIiwicGVyaW9kIiwicmVwbGFjZVZhbHVlIiwiY29uY2F0IiwiRXJyb3IiLCJNT0RFTF9TVEFUVVMiLCJMT0FESU5HIiwiZGlzcGF0Y2hNb2RlbEZldGNoUmVxdWVzdCIsIm1ldGhvZCIsImRpc3BhdGNoUGVyaW9kaWNNb2RlbEZldGNoUmVxdWVzdCIsImxvYWRDb2xsZWN0aW9uSXRlbSIsImNyZWF0ZUl0ZW1JbkNvbGxlY3Rpb24iLCJib2R5IiwiY29udGVudFR5cGUiLCJDUkVBVElORyIsImNyZWF0ZUNvbGxlY3Rpb25JdGVtIiwidXBkYXRlSXRlbUluQ29sbGVjdGlvbiIsIlVQREFUSU5HIiwidXBkYXRlQ29sbGVjdGlvbkl0ZW0iLCJkZWxldGVJdGVtRnJvbUNvbGxlY3Rpb24iLCJERUxFVElORyIsImRlbGV0ZUNvbGxlY3Rpb25JdGVtIiwiaW5pdGlhbGl6ZUNvbGxlY3Rpb25JdGVtIiwibG9hZCIsImRpc2FibGVBdXRvTG9hZCIsIl9tZXRhZGF0YSIsImlzRmV0Y2hpbmciLCJSRUFEWSIsImluaXRpYWxpemVDb2xsZWN0aW9uIiwiaGFuZGxlQ29sbGVjdGlvbkl0ZW1QYXJhbXNDaGFuZ2UiLCJwcmV2TW9kZWxOYW1lIiwicHJldlBhdGhQYXJhbXMiLCJwcmV2UXVlcnlQYXJhbXMiLCJpc0VxdWFsIiwiaGFuZGxlQ29sbGVjdGlvblBhcmFtc0NoYW5nZSIsImNsZWFudXBDb2xsZWN0aW9uR3VpZEtleSIsImluY2x1ZGVzIiwibW9kZWxOYW1lcyIsInNwbGl0IiwidGVtcFBhdGhQYXJhbXMiLCJzbGljZSIsInB1c2giLCJwYXRoIiwiZm9yRWFjaCIsImkiLCJkaXNwYXRjaE1vZGVsUmVtb3ZlS2V5QWN0aW9uIiwibW9kZWxQYXRoIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxzL2NvbGxlY3Rpb24udHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY29uY2F0LCBEaWN0aW9uYXJ5LCBmaW5kLCBnZXQsIGluY2x1ZGVzLCBpc0VxdWFsLCB2YWx1ZXMgfSBmcm9tICdsb2Rhc2gnXHJcbmltcG9ydCBtZW1vaXplT25lIGZyb20gJ21lbW9pemUtb25lJ1xyXG5pbXBvcnQgeyBNT0RFTF9TVEFUVVMgfSBmcm9tICcuLi9jb25zdGFudHMnXHJcbmltcG9ydCB7XHJcblx0ZGlzcGF0Y2hNb2RlbEZldGNoUmVxdWVzdCxcclxuXHRkaXNwYXRjaE1vZGVsUmVtb3ZlS2V5QWN0aW9uLFxyXG5cdGRpc3BhdGNoUGVyaW9kaWNNb2RlbEZldGNoUmVxdWVzdCxcclxuXHRkaXNwYXRjaFBlcmlvZGljTW9kZWxGZXRjaFRlcm1pbmF0ZUFjdGlvblxyXG59IGZyb20gJy4uL3JlZHV4L2FjdGlvbkNyZWF0b3InXHJcbmltcG9ydCB7XHJcblx0Q29sbGVjdGlvbkNyZWF0ZVBhcmFtcyxcclxuXHRDb2xsZWN0aW9uRGVsZXRlUGFyYW1zLFxyXG5cdENvbGxlY3Rpb25JdGVtRGVsZXRlUGFyYW1zLFxyXG5cdENvbGxlY3Rpb25JdGVtTG9hZFBhcmFtcyxcclxuXHRDb2xsZWN0aW9uSXRlbVVwZGF0ZVBhcmFtcyxcclxuXHRDb2xsZWN0aW9uTG9hZFBhcmFtcyxcclxuXHRDb2xsZWN0aW9uTWV0aG9kQ29uZmlndXJhdGlvbixcclxuXHRDb2xsZWN0aW9uU2VsZWN0b3JNZXRob2RQYXJhbXMsXHJcblx0Q29sbGVjdGlvblNlbGVjdG9yTWV0aG9kUmVzcG9uc2UsXHJcblx0Q29sbGVjdGlvblVwZGF0ZVBhcmFtcyxcclxuXHRNb2RlbCxcclxuXHRNb2RlbENvbGxlY3Rpb25cclxufSBmcm9tICcuLi90eXBlcydcclxuaW1wb3J0IHsgZ2V0TWluUmVxdWlyZWRQYXRoUGFyYW1zQ291bnQsIGdldFBhdGhQYXJhbXNGcm9tUm91dGVNYXRjaFBhcmFtcywgZ2V0UmVkdXhNb2RlbE5hbWUgfSBmcm9tICcuL3JvdXRlJ1xyXG5cclxuLy8jcmVnaW9uIFJlZHV4IE1ldGhvZHNcclxuXHJcbmNvbnN0IGdldFBhdGhQYXJhbXMgPSBtZW1vaXplT25lKFxyXG5cdChwYXRoUGFyYW1zOiBBcnJheTxzdHJpbmcgfCBudW1iZXI+IHwgdW5kZWZpbmVkLCByb3V0ZU1hdGNoUGFyYW1zOiBEaWN0aW9uYXJ5PHN0cmluZz4sIG1vZGVsTmFtZTogc3RyaW5nKSA9PlxyXG5cdFx0cGF0aFBhcmFtcyB8fCBnZXRQYXRoUGFyYW1zRnJvbVJvdXRlTWF0Y2hQYXJhbXMocm91dGVNYXRjaFBhcmFtcywgbW9kZWxOYW1lKVxyXG4pXHJcblxyXG5leHBvcnQgZnVuY3Rpb24gc2VsZWN0Q29sbGVjdGlvbkl0ZW1Gcm9tU3RhdGU8VE1vZGVsIGV4dGVuZHMgTW9kZWw+KFxyXG5cdHBhcmFtczogQ29sbGVjdGlvblNlbGVjdG9yTWV0aG9kUGFyYW1zXHJcbik6IENvbGxlY3Rpb25TZWxlY3Rvck1ldGhvZFJlc3BvbnNlPFRNb2RlbD4ge1xyXG5cdGNvbnN0IHsgZ3VpZCwgbW9kZWxOYW1lLCBwYXRoUGFyYW1zLCByb3V0ZU1hdGNoUGFyYW1zLCBzdGF0ZSB9ID0gcGFyYW1zXHJcblx0Y29uc3QgbW9kZWxOYW1lTGV2ZWxDb3VudCA9IGdldE1pblJlcXVpcmVkUGF0aFBhcmFtc0NvdW50KG1vZGVsTmFtZSlcclxuXHRjb25zdCBwID0gZ2V0UGF0aFBhcmFtcyhwYXRoUGFyYW1zLCByb3V0ZU1hdGNoUGFyYW1zLCBtb2RlbE5hbWUpXHJcblx0Y29uc3QgcmVkdXhNb2RlbE5hbWUgPSBnZXRSZWR1eE1vZGVsTmFtZShwLCBtb2RlbE5hbWUpXHJcblxyXG5cdGxldCBtb2RlbCA9IHt9IGFzIFRNb2RlbFxyXG5cdC8vIGZpbmQgYG1vZGVsYCB1c2luZyBgZ3VpZGAgYXMgaXRzIGtleSwgdG8gbWF0Y2ggbmV3IGl0ZW0gY3JlYXRlZCBpbiBgY3JlYXRlKClgXHJcblx0aWYgKHAubGVuZ3RoID09PSBtb2RlbE5hbWVMZXZlbENvdW50KSB7XHJcblx0XHRjb25zdCBjb2xsZWN0aW9uID0gKGdldChzdGF0ZS5tb2RlbHMsIHJlZHV4TW9kZWxOYW1lKSB8fCB7fSkgYXMgTW9kZWxDb2xsZWN0aW9uPFRNb2RlbD5cclxuXHRcdGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoY29sbGVjdGlvbiwgZ3VpZCkpIHtcclxuXHRcdFx0bW9kZWwgPSBjb2xsZWN0aW9uW2d1aWRdIGFzIFRNb2RlbFxyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0Y29uc3QgbW9kZWxCeUd1aWQgPSBmaW5kKHZhbHVlcyhjb2xsZWN0aW9uKSwgKG0pOiBtIGlzIFRNb2RlbCA9PiAhIW0gJiYgJ2d1aWQnIGluIG0gJiYgbS5ndWlkID09PSBndWlkKVxyXG5cdFx0XHRtb2RlbCA9IG1vZGVsQnlHdWlkIHx8IG1vZGVsXHJcblx0XHR9XHJcblx0fSBlbHNlIHtcclxuXHRcdC8vIGZpbmQgYG1vZGVsYCB1c2luZyBwYXRoUGFyYW1zXHJcblx0XHRjb25zdCByZWR1eE1vZGVsID0gKGdldChzdGF0ZS5tb2RlbHMsIHJlZHV4TW9kZWxOYW1lKSB8fCB7fSkgYXMgVE1vZGVsXHJcblx0XHRtb2RlbCA9IChPYmplY3Qua2V5cyhyZWR1eE1vZGVsKS5sZW5ndGggPiAwID8gcmVkdXhNb2RlbCA6IHt9KSBhcyBUTW9kZWxcclxuXHR9XHJcblxyXG5cdHJldHVybiB7XHJcblx0XHRtb2RlbE5hbWUsXHJcblx0XHRwYXRoUGFyYW1zOiBwLFxyXG5cdFx0bW9kZWwsXHJcblx0XHRpc0NvbGxlY3Rpb25JdGVtOiB0cnVlXHJcblx0fVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gc2VsZWN0Q29sbGVjdGlvbkZyb21TdGF0ZTxUTW9kZWwgZXh0ZW5kcyBNb2RlbD4oXHJcblx0cGFyYW1zOiBDb2xsZWN0aW9uU2VsZWN0b3JNZXRob2RQYXJhbXNcclxuKTogQ29sbGVjdGlvblNlbGVjdG9yTWV0aG9kUmVzcG9uc2U8VE1vZGVsPiB7XHJcblx0Y29uc3QgeyBtb2RlbE5hbWUsIHBhdGhQYXJhbXMsIHJvdXRlTWF0Y2hQYXJhbXMsIHN0YXRlIH0gPSBwYXJhbXNcclxuXHRjb25zdCBwID0gZ2V0UGF0aFBhcmFtcyhwYXRoUGFyYW1zLCByb3V0ZU1hdGNoUGFyYW1zLCBtb2RlbE5hbWUpXHJcblx0Y29uc3QgcmVkdXhNb2RlbE5hbWUgPSBnZXRSZWR1eE1vZGVsTmFtZShwLCBtb2RlbE5hbWUpXHJcblxyXG5cdGxldCBtb2RlbCA9IGdldChzdGF0ZS5tb2RlbHMsIHJlZHV4TW9kZWxOYW1lKSBhcyBNb2RlbENvbGxlY3Rpb248VE1vZGVsPiB8IHVuZGVmaW5lZFxyXG5cdG1vZGVsID0gbW9kZWwgJiYgT2JqZWN0LmtleXMobW9kZWwpLmxlbmd0aCA+IDAgPyBtb2RlbCA6IHt9XHJcblxyXG5cdHJldHVybiB7XHJcblx0XHRtb2RlbE5hbWUsXHJcblx0XHRwYXRoUGFyYW1zOiBwLFxyXG5cdFx0bW9kZWwsXHJcblx0XHRpc0NvbGxlY3Rpb25JdGVtOiBmYWxzZVxyXG5cdH1cclxufVxyXG5cclxuLy8jZW5kcmVnaW9uIFJlZHV4IE1ldGhvZHNcclxuXHJcbi8vI3JlZ2lvbiBDb2xsZWN0aW9uL0l0ZW0gQ1JVRCBNZXRob2RzXHJcblxyXG4vLyNyZWdpb24gTG9hZFxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHN0b3BDb2xsZWN0aW9uUGVyaW9kaWNMb2FkKHRhc2tJZDogc3RyaW5nKSB7XHJcblx0ZGlzcGF0Y2hQZXJpb2RpY01vZGVsRmV0Y2hUZXJtaW5hdGVBY3Rpb24oe1xyXG5cdFx0dGFza0lkXHJcblx0fSlcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGxvYWRDb2xsZWN0aW9uKGNvbmZpZzogQ29sbGVjdGlvbk1ldGhvZENvbmZpZ3VyYXRpb24sIHBhcmFtczogQ29sbGVjdGlvbkxvYWRQYXJhbXMgPSB7fSkge1xyXG5cdGNvbnN0IHtcclxuXHRcdG1vZGVsTmFtZSxcclxuXHRcdGlzSW5pdGlhbGl6ZWQsXHJcblx0XHRwYXRoUGFyYW1zOiBjb25maWdQYXRoUGFyYW1zLFxyXG5cdFx0cXVlcnlQYXJhbXM6IGNvbmZpZ1F1ZXJ5UGFyYW1zLFxyXG5cdFx0Y2hhbmdlTW9kZWxTdGF0dXNcclxuXHR9ID0gY29uZmlnXHJcblx0Y29uc3QgeyBpZCwgcGF0aFBhcmFtcywgcXVlcnlQYXJhbXMsIHBlcmlvZCwgdGFza0lkLCByZXBsYWNlVmFsdWUgfSA9IHBhcmFtc1xyXG5cdGNvbnN0IHAgPSBjb25jYXQoW10sIHBhdGhQYXJhbXMgfHwgY29uZmlnUGF0aFBhcmFtcywgaWQgPyBbaWRdIDogW10pXHJcblx0aWYgKHAubGVuZ3RoICE9PSBnZXRNaW5SZXF1aXJlZFBhdGhQYXJhbXNDb3VudChtb2RlbE5hbWUpICsgKGlkID8gMSA6IDApKSB7XHJcblx0XHR0aHJvdyBuZXcgRXJyb3IoJ3BhdGhQYXJhbXMgbGVuZ3RoIGRvZXMgbm90IG1hdGNoIGxlbmd0aCBvZiBwYXRoIGNvbXBvbmVudHMnKVxyXG5cdH1cclxuXHRpZiAoaXNJbml0aWFsaXplZCkge1xyXG5cdFx0Y2hhbmdlTW9kZWxTdGF0dXMoTU9ERUxfU1RBVFVTLkxPQURJTkcsIGlkKVxyXG5cdH1cclxuXHRpZiAoIXBlcmlvZCkge1xyXG5cdFx0ZGlzcGF0Y2hNb2RlbEZldGNoUmVxdWVzdCh7XHJcblx0XHRcdG1vZGVsTmFtZSxcclxuXHRcdFx0bWV0aG9kOiAnR0VUJyxcclxuXHRcdFx0cGF0aFBhcmFtczogcCxcclxuXHRcdFx0cXVlcnlQYXJhbXM6IHF1ZXJ5UGFyYW1zIHx8IGNvbmZpZ1F1ZXJ5UGFyYW1zLFxyXG5cdFx0XHRyZXBsYWNlVmFsdWVcclxuXHRcdH0pXHJcblx0fSBlbHNlIHtcclxuXHRcdGlmICghdGFza0lkKSB0aHJvdyBuZXcgRXJyb3IoJ3Rhc2tJZCBpcyByZXF1aXJlZCBmb3IgcGVyaW9kaWMgZGF0YSByZXF1ZXN0cycpXHJcblx0XHRkaXNwYXRjaFBlcmlvZGljTW9kZWxGZXRjaFJlcXVlc3Qoe1xyXG5cdFx0XHRtb2RlbE5hbWUsXHJcblx0XHRcdG1ldGhvZDogJ0dFVCcsXHJcblx0XHRcdHBhdGhQYXJhbXM6IHAsXHJcblx0XHRcdHF1ZXJ5UGFyYW1zOiBxdWVyeVBhcmFtcyB8fCBjb25maWdRdWVyeVBhcmFtcyxcclxuXHRcdFx0cGVyaW9kLFxyXG5cdFx0XHR0YXNrSWQsXHJcblx0XHRcdHJlcGxhY2VWYWx1ZVxyXG5cdFx0fSlcclxuXHR9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBsb2FkQ29sbGVjdGlvbkl0ZW0oY29uZmlnOiBDb2xsZWN0aW9uTWV0aG9kQ29uZmlndXJhdGlvbiwgcGFyYW1zOiBDb2xsZWN0aW9uSXRlbUxvYWRQYXJhbXMgPSB7fSkge1xyXG5cdGNvbnN0IHtcclxuXHRcdG1vZGVsTmFtZSxcclxuXHRcdGlzSW5pdGlhbGl6ZWQsXHJcblx0XHRwYXRoUGFyYW1zOiBjb25maWdQYXRoUGFyYW1zLFxyXG5cdFx0cXVlcnlQYXJhbXM6IGNvbmZpZ1F1ZXJ5UGFyYW1zLFxyXG5cdFx0Y2hhbmdlTW9kZWxTdGF0dXNcclxuXHR9ID0gY29uZmlnXHJcblx0Y29uc3QgeyBwYXRoUGFyYW1zLCBxdWVyeVBhcmFtcywgcGVyaW9kLCB0YXNrSWQsIHJlcGxhY2VWYWx1ZSB9ID0gcGFyYW1zXHJcblx0Y29uc3QgcCA9IHBhdGhQYXJhbXMgfHwgY29uZmlnUGF0aFBhcmFtc1xyXG5cdGlmIChwLmxlbmd0aCA8IGdldE1pblJlcXVpcmVkUGF0aFBhcmFtc0NvdW50KG1vZGVsTmFtZSkgKyAxKSB7XHJcblx0XHR0aHJvdyBuZXcgRXJyb3IoJ3BhdGhQYXJhbXMgbGVuZ3RoIGRvZXMgbm90IG1hdGNoIGxlbmd0aCBvZiBwYXRoIGNvbXBvbmVudHMnKVxyXG5cdH1cclxuXHRpZiAoaXNJbml0aWFsaXplZCkge1xyXG5cdFx0Y2hhbmdlTW9kZWxTdGF0dXMoTU9ERUxfU1RBVFVTLkxPQURJTkcpXHJcblx0fVxyXG5cdGlmICghcGVyaW9kKSB7XHJcblx0XHRkaXNwYXRjaE1vZGVsRmV0Y2hSZXF1ZXN0KHtcclxuXHRcdFx0bW9kZWxOYW1lLFxyXG5cdFx0XHRtZXRob2Q6ICdHRVQnLFxyXG5cdFx0XHRwYXRoUGFyYW1zOiBwLFxyXG5cdFx0XHRxdWVyeVBhcmFtczogcXVlcnlQYXJhbXMgfHwgY29uZmlnUXVlcnlQYXJhbXMsXHJcblx0XHRcdHJlcGxhY2VWYWx1ZVxyXG5cdFx0fSlcclxuXHR9IGVsc2Uge1xyXG5cdFx0aWYgKCF0YXNrSWQpIHRocm93IG5ldyBFcnJvcigndGFza0lkIGlzIHJlcXVpcmVkIGZvciBwZXJpb2RpYyBkYXRhIHJlcXVlc3RzJylcclxuXHRcdGRpc3BhdGNoUGVyaW9kaWNNb2RlbEZldGNoUmVxdWVzdCh7XHJcblx0XHRcdG1vZGVsTmFtZSxcclxuXHRcdFx0bWV0aG9kOiAnR0VUJyxcclxuXHRcdFx0cGF0aFBhcmFtczogcCxcclxuXHRcdFx0cXVlcnlQYXJhbXM6IHF1ZXJ5UGFyYW1zIHx8IGNvbmZpZ1F1ZXJ5UGFyYW1zLFxyXG5cdFx0XHRwZXJpb2QsXHJcblx0XHRcdHRhc2tJZCxcclxuXHRcdFx0cmVwbGFjZVZhbHVlXHJcblx0XHR9KVxyXG5cdH1cclxufVxyXG5cclxuLy8jZW5kcmVnaW9uIExvYWRcclxuXHJcbi8vI3JlZ2lvbiBDcmVhdGVcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVJdGVtSW5Db2xsZWN0aW9uKGNvbmZpZzogQ29sbGVjdGlvbk1ldGhvZENvbmZpZ3VyYXRpb24sIHBhcmFtczogQ29sbGVjdGlvbkNyZWF0ZVBhcmFtcykge1xyXG5cdGNvbnN0IHsgZ3VpZCwgbW9kZWxOYW1lLCBwYXRoUGFyYW1zLCBxdWVyeVBhcmFtczogY29uZmlnUXVlcnlQYXJhbXMsIGNoYW5nZU1vZGVsU3RhdHVzIH0gPSBjb25maWdcclxuXHRjb25zdCB7IGJvZHksIGNvbnRlbnRUeXBlLCBxdWVyeVBhcmFtcyB9ID0gcGFyYW1zXHJcblx0aWYgKHBhdGhQYXJhbXMubGVuZ3RoIDwgZ2V0TWluUmVxdWlyZWRQYXRoUGFyYW1zQ291bnQobW9kZWxOYW1lKSkge1xyXG5cdFx0dGhyb3cgbmV3IEVycm9yKCdwYXRoUGFyYW1zIGxlbmd0aCBkb2VzIG5vdCBtYXRjaCBsZW5ndGggb2YgcGF0aCBjb21wb25lbnRzJylcclxuXHR9XHJcblx0Y2hhbmdlTW9kZWxTdGF0dXMoTU9ERUxfU1RBVFVTLkNSRUFUSU5HLCBndWlkKVxyXG5cdGRpc3BhdGNoTW9kZWxGZXRjaFJlcXVlc3Qoe1xyXG5cdFx0bW9kZWxOYW1lLFxyXG5cdFx0Z3VpZCxcclxuXHRcdG1ldGhvZDogJ1BPU1QnLFxyXG5cdFx0Ym9keSxcclxuXHRcdHBhdGhQYXJhbXMsXHJcblx0XHRjb250ZW50VHlwZSxcclxuXHRcdHF1ZXJ5UGFyYW1zOiBxdWVyeVBhcmFtcyB8fCBjb25maWdRdWVyeVBhcmFtc1xyXG5cdH0pXHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVDb2xsZWN0aW9uSXRlbShcclxuXHRtb2RlbDogTW9kZWwsXHJcblx0Y29uZmlnOiBDb2xsZWN0aW9uTWV0aG9kQ29uZmlndXJhdGlvbixcclxuXHRwYXJhbXM6IENvbGxlY3Rpb25DcmVhdGVQYXJhbXNcclxuKSB7XHJcblx0aWYgKG1vZGVsLmlkKSB7XHJcblx0XHR0aHJvdyBuZXcgRXJyb3IoJ21vZGVsIGFscmVhZHkgZXhpc3RzJylcclxuXHR9XHJcblx0Y29uc3QgeyBndWlkLCBtb2RlbE5hbWUsIHBhdGhQYXJhbXMsIHF1ZXJ5UGFyYW1zOiBjb25maWdRdWVyeVBhcmFtcywgY2hhbmdlTW9kZWxTdGF0dXMgfSA9IGNvbmZpZ1xyXG5cdGNvbnN0IHsgYm9keSwgY29udGVudFR5cGUsIHF1ZXJ5UGFyYW1zIH0gPSBwYXJhbXNcclxuXHRpZiAocGF0aFBhcmFtcy5sZW5ndGggPCBnZXRNaW5SZXF1aXJlZFBhdGhQYXJhbXNDb3VudChtb2RlbE5hbWUpKSB7XHJcblx0XHR0aHJvdyBuZXcgRXJyb3IoJ3BhdGhQYXJhbXMgbGVuZ3RoIGRvZXMgbm90IG1hdGNoIGxlbmd0aCBvZiBwYXRoIGNvbXBvbmVudHMnKVxyXG5cdH1cclxuXHRjaGFuZ2VNb2RlbFN0YXR1cyhNT0RFTF9TVEFUVVMuQ1JFQVRJTkcpXHJcblx0ZGlzcGF0Y2hNb2RlbEZldGNoUmVxdWVzdCh7XHJcblx0XHRtb2RlbE5hbWUsXHJcblx0XHRndWlkLFxyXG5cdFx0bWV0aG9kOiAnUE9TVCcsXHJcblx0XHRib2R5LFxyXG5cdFx0cGF0aFBhcmFtcyxcclxuXHRcdGNvbnRlbnRUeXBlLFxyXG5cdFx0cXVlcnlQYXJhbXM6IHF1ZXJ5UGFyYW1zIHx8IGNvbmZpZ1F1ZXJ5UGFyYW1zXHJcblx0fSlcclxufVxyXG5cclxuLy8jZW5kcmVnaW9uIENyZWF0ZVxyXG5cclxuLy8jcmVnaW9uIFVwZGF0ZVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZUl0ZW1JbkNvbGxlY3Rpb24oY29uZmlnOiBDb2xsZWN0aW9uTWV0aG9kQ29uZmlndXJhdGlvbiwgcGFyYW1zOiBDb2xsZWN0aW9uVXBkYXRlUGFyYW1zKSB7XHJcblx0Y29uc3QgeyBpZCwgYm9keSwgY29udGVudFR5cGUsIG1ldGhvZCwgcXVlcnlQYXJhbXMgfSA9IHBhcmFtc1xyXG5cdGlmICghaWQpIHtcclxuXHRcdHRocm93IG5ldyBFcnJvcihgJ2lkJyBpcyByZXF1aXJlZGApXHJcblx0fVxyXG5cdGlmICghYm9keSkge1xyXG5cdFx0dGhyb3cgbmV3IEVycm9yKGAnYm9keScgaXMgcmVxdWlyZWRgKVxyXG5cdH1cclxuXHRjb25zdCB7IG1vZGVsTmFtZSwgcGF0aFBhcmFtczogY29uZmlnUGF0aFBhcmFtcywgcXVlcnlQYXJhbXM6IGNvbmZpZ1F1ZXJ5UGFyYW1zLCBjaGFuZ2VNb2RlbFN0YXR1cyB9ID0gY29uZmlnXHJcblx0Y29uc3QgcGF0aFBhcmFtcyA9IGNvbmNhdChbXSwgY29uZmlnUGF0aFBhcmFtcywgW2lkXSlcclxuXHRpZiAocGF0aFBhcmFtcy5sZW5ndGggIT09IGdldE1pblJlcXVpcmVkUGF0aFBhcmFtc0NvdW50KG1vZGVsTmFtZSkgKyAxKSB7XHJcblx0XHR0aHJvdyBuZXcgRXJyb3IoJ3BhdGhQYXJhbXMraWQgbGVuZ3RoIGRvZXMgbm90IG1hdGNoIGxlbmd0aCBvZiBwYXRoIGNvbXBvbmVudHMnKVxyXG5cdH1cclxuXHRjb25zdCBtID0gbWV0aG9kIHx8ICdQVVQnXHJcblx0Y2hhbmdlTW9kZWxTdGF0dXMoTU9ERUxfU1RBVFVTLlVQREFUSU5HLCBpZClcclxuXHRkaXNwYXRjaE1vZGVsRmV0Y2hSZXF1ZXN0KHtcclxuXHRcdG1vZGVsTmFtZSxcclxuXHRcdG1ldGhvZDogbSxcclxuXHRcdHBhdGhQYXJhbXMsXHJcblx0XHRxdWVyeVBhcmFtczogcXVlcnlQYXJhbXMgfHwgY29uZmlnUXVlcnlQYXJhbXMsXHJcblx0XHRib2R5LFxyXG5cdFx0Y29udGVudFR5cGVcclxuXHR9KVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlQ29sbGVjdGlvbkl0ZW0oXHJcblx0bW9kZWw6IE1vZGVsLFxyXG5cdGNvbmZpZzogQ29sbGVjdGlvbk1ldGhvZENvbmZpZ3VyYXRpb24sXHJcblx0cGFyYW1zOiBDb2xsZWN0aW9uSXRlbVVwZGF0ZVBhcmFtc1xyXG4pIHtcclxuXHRpZiAoIW1vZGVsLmlkKSB7XHJcblx0XHR0aHJvdyBuZXcgRXJyb3IoJ21vZGVsIGRvZXMgbm90IGV4aXN0JylcclxuXHR9XHJcblx0Y29uc3QgeyBib2R5LCBjb250ZW50VHlwZSwgbWV0aG9kLCBxdWVyeVBhcmFtcyB9ID0gcGFyYW1zXHJcblx0aWYgKCFib2R5KSB7XHJcblx0XHR0aHJvdyBuZXcgRXJyb3IoYCdib2R5JyBpcyByZXF1aXJlZGApXHJcblx0fVxyXG5cdGNvbnN0IHsgbW9kZWxOYW1lLCBwYXRoUGFyYW1zLCBxdWVyeVBhcmFtczogY29uZmlnUXVlcnlQYXJhbXMsIGNoYW5nZU1vZGVsU3RhdHVzIH0gPSBjb25maWdcclxuXHRpZiAocGF0aFBhcmFtcy5sZW5ndGggPCBnZXRNaW5SZXF1aXJlZFBhdGhQYXJhbXNDb3VudChtb2RlbE5hbWUpICsgMSkge1xyXG5cdFx0dGhyb3cgbmV3IEVycm9yKCdwYXRoUGFyYW1zIGxlbmd0aCBkb2VzIG5vdCBtYXRjaCBsZW5ndGggb2YgcGF0aCBjb21wb25lbnRzJylcclxuXHR9XHJcblx0Y29uc3QgbSA9IG1ldGhvZCB8fCAnUFVUJ1xyXG5cdGNoYW5nZU1vZGVsU3RhdHVzKE1PREVMX1NUQVRVUy5VUERBVElORylcclxuXHRkaXNwYXRjaE1vZGVsRmV0Y2hSZXF1ZXN0KHtcclxuXHRcdG1vZGVsTmFtZSxcclxuXHRcdG1ldGhvZDogbSxcclxuXHRcdHBhdGhQYXJhbXMsXHJcblx0XHRib2R5LFxyXG5cdFx0Y29udGVudFR5cGUsXHJcblx0XHRxdWVyeVBhcmFtczogcXVlcnlQYXJhbXMgfHwgY29uZmlnUXVlcnlQYXJhbXNcclxuXHR9KVxyXG59XHJcblxyXG4vLyNlbmRyZWdpb24gVXBkYXRlXHJcblxyXG4vLyNyZWdpb24gRGVsZXRlXHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZGVsZXRlSXRlbUZyb21Db2xsZWN0aW9uKGNvbmZpZzogQ29sbGVjdGlvbk1ldGhvZENvbmZpZ3VyYXRpb24sIHBhcmFtczogQ29sbGVjdGlvbkRlbGV0ZVBhcmFtcykge1xyXG5cdGNvbnN0IHsgaWQsIGJvZHksIHF1ZXJ5UGFyYW1zIH0gPSBwYXJhbXNcclxuXHRpZiAoIWlkKSB7XHJcblx0XHR0aHJvdyBuZXcgRXJyb3IoYCdpZCcgaXMgcmVxdWlyZWRgKVxyXG5cdH1cclxuXHRjb25zdCB7IG1vZGVsTmFtZSwgcGF0aFBhcmFtcywgcXVlcnlQYXJhbXM6IGNvbmZpZ1F1ZXJ5UGFyYW1zLCBjaGFuZ2VNb2RlbFN0YXR1cyB9ID0gY29uZmlnXHJcblx0Y29uc3QgcCA9IGNvbmNhdChbXSwgcGF0aFBhcmFtcywgW2lkXSlcclxuXHRpZiAocC5sZW5ndGggIT09IGdldE1pblJlcXVpcmVkUGF0aFBhcmFtc0NvdW50KG1vZGVsTmFtZSkgKyAxKSB7XHJcblx0XHR0aHJvdyBuZXcgRXJyb3IoJ3BhdGhQYXJhbXMraWQgbGVuZ3RoIGRvZXMgbm90IG1hdGNoIGxlbmd0aCBvZiBwYXRoIGNvbXBvbmVudHMnKVxyXG5cdH1cclxuXHRjaGFuZ2VNb2RlbFN0YXR1cyhNT0RFTF9TVEFUVVMuREVMRVRJTkcsIGlkKVxyXG5cdGRpc3BhdGNoTW9kZWxGZXRjaFJlcXVlc3Qoe1xyXG5cdFx0bW9kZWxOYW1lLFxyXG5cdFx0bWV0aG9kOiAnREVMRVRFJyxcclxuXHRcdHBhdGhQYXJhbXM6IHAsXHJcblx0XHRxdWVyeVBhcmFtczogcXVlcnlQYXJhbXMgfHwgY29uZmlnUXVlcnlQYXJhbXMsXHJcblx0XHRib2R5XHJcblx0fSlcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGRlbGV0ZUNvbGxlY3Rpb25JdGVtKFxyXG5cdG1vZGVsOiBNb2RlbCxcclxuXHRjb25maWc6IENvbGxlY3Rpb25NZXRob2RDb25maWd1cmF0aW9uLFxyXG5cdHBhcmFtczogQ29sbGVjdGlvbkl0ZW1EZWxldGVQYXJhbXMgPSB7fVxyXG4pIHtcclxuXHRpZiAoIW1vZGVsLmlkKSB7XHJcblx0XHR0aHJvdyBuZXcgRXJyb3IoJ21vZGVsIGRvZXMgbm90IGV4aXN0JylcclxuXHR9XHJcblx0Y29uc3QgeyBib2R5LCBxdWVyeVBhcmFtcyB9ID0gcGFyYW1zXHJcblx0Y29uc3QgeyBtb2RlbE5hbWUsIHBhdGhQYXJhbXMsIHF1ZXJ5UGFyYW1zOiBjb25maWdRdWVyeVBhcmFtcywgY2hhbmdlTW9kZWxTdGF0dXMgfSA9IGNvbmZpZ1xyXG5cdGlmIChwYXRoUGFyYW1zLmxlbmd0aCA8IGdldE1pblJlcXVpcmVkUGF0aFBhcmFtc0NvdW50KG1vZGVsTmFtZSkgKyAxKSB7XHJcblx0XHR0aHJvdyBuZXcgRXJyb3IoJ3BhdGhQYXJhbXMgbGVuZ3RoIGRvZXMgbm90IG1hdGNoIGxlbmd0aCBvZiBwYXRoIGNvbXBvbmVudHMnKVxyXG5cdH1cclxuXHRjaGFuZ2VNb2RlbFN0YXR1cyhNT0RFTF9TVEFUVVMuREVMRVRJTkcpXHJcblx0ZGlzcGF0Y2hNb2RlbEZldGNoUmVxdWVzdCh7XHJcblx0XHRtb2RlbE5hbWUsXHJcblx0XHRtZXRob2Q6ICdERUxFVEUnLFxyXG5cdFx0cGF0aFBhcmFtcyxcclxuXHRcdGJvZHksXHJcblx0XHRxdWVyeVBhcmFtczogcXVlcnlQYXJhbXMgfHwgY29uZmlnUXVlcnlQYXJhbXNcclxuXHR9KVxyXG59XHJcblxyXG4vLyNlbmRyZWdpb24gRGVsZXRlXHJcblxyXG4vLyNlbmRyZWdpb24gQ29sbGVjdGlvbi9JdGVtIENSVUQgTWV0aG9kc1xyXG5cclxuLy8jcmVnaW9uIEhlbHBlciBNZXRob2RzXHJcblxyXG4vKipcclxuICogQXV0b21hdGljYWxseSBjYWxsIGBsb2FkYCwgb3IgYGNoYW5nZU1vZGVsU3RhdHVzYCB0byBgUkVBRFlgLlxyXG4gKlxyXG4gKiBEb2VzIE5PVCBhdXRvbWF0aWNhbGx5IGxvYWQgaWY6XHJcbiAqICogcGF0aFBhcmFtcyBkb2VzIG5vdCBjb250YWluIGVub3VnaCBpdGVtcy5cclxuICogKiBtb2RlbCBpcyBhbHJlYWR5IGZldGNoaW5nLlxyXG4gKiAqIGF1dG8gbG9hZCBpcyBkaXNhYmxlZC5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBpbml0aWFsaXplQ29sbGVjdGlvbkl0ZW0oXHJcblx0bW9kZWw6IE1vZGVsLFxyXG5cdGxvYWQ6IChwYXJhbXM/OiBDb2xsZWN0aW9uSXRlbUxvYWRQYXJhbXMpID0+IHZvaWQsXHJcblx0Y29uZmlnOiBDb2xsZWN0aW9uTWV0aG9kQ29uZmlndXJhdGlvblxyXG4pIHtcclxuXHRjb25zdCB7IG1vZGVsTmFtZSwgcGF0aFBhcmFtcywgZGlzYWJsZUF1dG9Mb2FkLCBjaGFuZ2VNb2RlbFN0YXR1cyB9ID0gY29uZmlnXHJcblx0aWYgKFxyXG5cdFx0cGF0aFBhcmFtcy5sZW5ndGggPT09IGdldE1pblJlcXVpcmVkUGF0aFBhcmFtc0NvdW50KG1vZGVsTmFtZSkgKyAxICYmXHJcblx0XHQhZGlzYWJsZUF1dG9Mb2FkICYmXHJcblx0XHQoIW1vZGVsLl9tZXRhZGF0YSB8fCAhbW9kZWwuX21ldGFkYXRhLmlzRmV0Y2hpbmcpXHJcblx0KSB7XHJcblx0XHRsb2FkKClcclxuXHR9IGVsc2Uge1xyXG5cdFx0Y2hhbmdlTW9kZWxTdGF0dXMoTU9ERUxfU1RBVFVTLlJFQURZKVxyXG5cdH1cclxufVxyXG5cclxuLyoqXHJcbiAqIEF1dG9tYXRpY2FsbHkgY2FsbCBgbG9hZGAsIG9yIGBjaGFuZ2VNb2RlbFN0YXR1c2AgdG8gYFJFQURZYC5cclxuICpcclxuICogRG9lcyBOT1QgYXV0b21hdGljYWxseSBsb2FkIGlmOlxyXG4gKiAqIG1vZGVsIGlzIGFscmVhZHkgZmV0Y2hpbmcuXHJcbiAqICogYXV0byBsb2FkIGlzIGRpc2FibGVkLlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGluaXRpYWxpemVDb2xsZWN0aW9uKFxyXG5cdG1vZGVsOiBNb2RlbCxcclxuXHRsb2FkOiAocGFyYW1zPzogQ29sbGVjdGlvbkl0ZW1Mb2FkUGFyYW1zKSA9PiB2b2lkLFxyXG5cdGNvbmZpZzogQ29sbGVjdGlvbk1ldGhvZENvbmZpZ3VyYXRpb25cclxuKSB7XHJcblx0Y29uc3QgeyBkaXNhYmxlQXV0b0xvYWQsIGNoYW5nZU1vZGVsU3RhdHVzIH0gPSBjb25maWdcclxuXHRpZiAoIWRpc2FibGVBdXRvTG9hZCAmJiAoIW1vZGVsLl9tZXRhZGF0YSB8fCAhbW9kZWwuX21ldGFkYXRhLmlzRmV0Y2hpbmcpKSB7XHJcblx0XHRsb2FkKClcclxuXHR9IGVsc2UgaWYgKGRpc2FibGVBdXRvTG9hZCkge1xyXG5cdFx0Y2hhbmdlTW9kZWxTdGF0dXMoTU9ERUxfU1RBVFVTLlJFQURZKVxyXG5cdH1cclxufVxyXG5cclxuLyoqXHJcbiAqIFdoZW4gYHBhdGhQYXJhbXNgIG9yIGBxdWVyeVBhcmFtc2AgY2hhbmdlLCBjYWxsIGBsb2FkYFxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGhhbmRsZUNvbGxlY3Rpb25JdGVtUGFyYW1zQ2hhbmdlKFxyXG5cdG1vZGVsTmFtZTogc3RyaW5nLFxyXG5cdHByZXZNb2RlbE5hbWU6IHN0cmluZyxcclxuXHRwYXRoUGFyYW1zOiBBcnJheTxzdHJpbmcgfCBudW1iZXI+LFxyXG5cdHByZXZQYXRoUGFyYW1zOiBBcnJheTxzdHJpbmcgfCBudW1iZXI+IHwgdW5kZWZpbmVkLFxyXG5cdHF1ZXJ5UGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuPiB8IHVuZGVmaW5lZCxcclxuXHRwcmV2UXVlcnlQYXJhbXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4+IHwgdW5kZWZpbmVkLFxyXG5cdGxvYWQ6IChwYXJhbXM/OiBDb2xsZWN0aW9uSXRlbUxvYWRQYXJhbXMpID0+IHZvaWRcclxuKSB7XHJcblx0aWYgKFxyXG5cdFx0bW9kZWxOYW1lICE9PSBwcmV2TW9kZWxOYW1lIHx8XHJcblx0XHQocGF0aFBhcmFtcy5sZW5ndGggPT09IGdldE1pblJlcXVpcmVkUGF0aFBhcmFtc0NvdW50KG1vZGVsTmFtZSkgKyAxICYmICFpc0VxdWFsKHByZXZQYXRoUGFyYW1zLCBwYXRoUGFyYW1zKSkgfHxcclxuXHRcdCFpc0VxdWFsKHByZXZRdWVyeVBhcmFtcywgcXVlcnlQYXJhbXMpXHJcblx0KSB7XHJcblx0XHRsb2FkKHsgcGF0aFBhcmFtcywgcXVlcnlQYXJhbXMgfSlcclxuXHR9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBXaGVuIGBwYXRoUGFyYW1zYCBvciBgcXVlcnlQYXJhbXNgIGNoYW5nZSwgY2FsbCBgbG9hZGBcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBoYW5kbGVDb2xsZWN0aW9uUGFyYW1zQ2hhbmdlKFxyXG5cdG1vZGVsTmFtZTogc3RyaW5nLFxyXG5cdHByZXZNb2RlbE5hbWU6IHN0cmluZyxcclxuXHRwYXRoUGFyYW1zOiBBcnJheTxzdHJpbmcgfCBudW1iZXI+LFxyXG5cdHByZXZQYXRoUGFyYW1zOiBBcnJheTxzdHJpbmcgfCBudW1iZXI+IHwgdW5kZWZpbmVkLFxyXG5cdHF1ZXJ5UGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuPiB8IHVuZGVmaW5lZCxcclxuXHRwcmV2UXVlcnlQYXJhbXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4+IHwgdW5kZWZpbmVkLFxyXG5cdGxvYWQ6IChwYXJhbXM/OiBDb2xsZWN0aW9uTG9hZFBhcmFtcykgPT4gdm9pZFxyXG4pIHtcclxuXHRpZiAoXHJcblx0XHRtb2RlbE5hbWUgIT09IHByZXZNb2RlbE5hbWUgfHxcclxuXHRcdChwYXRoUGFyYW1zLmxlbmd0aCA+IDAgJiYgIWlzRXF1YWwocHJldlBhdGhQYXJhbXMsIHBhdGhQYXJhbXMpKSB8fFxyXG5cdFx0IWlzRXF1YWwocHJldlF1ZXJ5UGFyYW1zLCBxdWVyeVBhcmFtcylcclxuXHQpIHtcclxuXHRcdGxvYWQoeyBwYXRoUGFyYW1zLCBxdWVyeVBhcmFtcyB9KVxyXG5cdH1cclxufVxyXG5cclxuLyoqXHJcbiAqIERlbGV0ZSB0aGUgZ3VpZCBpbiB0aGUgbW9kZWxcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBjbGVhbnVwQ29sbGVjdGlvbkd1aWRLZXk8VE1vZGVsIGV4dGVuZHMgTW9kZWw+KFxyXG5cdG1vZGVsOiBNb2RlbENvbGxlY3Rpb248VE1vZGVsPixcclxuXHRjb25maWc6IENvbGxlY3Rpb25NZXRob2RDb25maWd1cmF0aW9uXHJcbikge1xyXG5cdGNvbnN0IHsgZ3VpZCwgbW9kZWxOYW1lLCBwYXRoUGFyYW1zIH0gPSBjb25maWdcclxuXHRpZiAoaW5jbHVkZXMoT2JqZWN0LmtleXMobW9kZWwpLCBndWlkKSkge1xyXG5cdFx0Y29uc3QgbW9kZWxOYW1lcyA9IG1vZGVsTmFtZS5zcGxpdCgnLicpXHJcblx0XHRjb25zdCB0ZW1wUGF0aFBhcmFtcyA9IHBhdGhQYXJhbXMuc2xpY2UoKVxyXG5cdFx0Ly8gc2hvdWxkIGluY2x1ZGUgdGhlIGd1aWQgYXQgdGhlIGVuZFxyXG5cdFx0dGVtcFBhdGhQYXJhbXMucHVzaChndWlkKVxyXG5cdFx0aWYgKG1vZGVsTmFtZXMubGVuZ3RoID09PSB0ZW1wUGF0aFBhcmFtcy5sZW5ndGgpIHtcclxuXHRcdFx0bGV0IHBhdGggPSAnJ1xyXG5cdFx0XHRtb2RlbE5hbWVzLmZvckVhY2goKG0sIGkpID0+IHtcclxuXHRcdFx0XHRpZiAoaSA9PT0gMCkge1xyXG5cdFx0XHRcdFx0cGF0aCArPSBgJHttfS4ke3RlbXBQYXRoUGFyYW1zW2ldfWBcclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0cGF0aCArPSBgLiR7bX0uJHt0ZW1wUGF0aFBhcmFtc1tpXX1gXHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9KVxyXG5cdFx0XHRkaXNwYXRjaE1vZGVsUmVtb3ZlS2V5QWN0aW9uKHtcclxuXHRcdFx0XHRtb2RlbFBhdGg6IHBhdGhcclxuXHRcdFx0fSlcclxuXHRcdH1cclxuXHR9XHJcbn1cclxuXHJcbi8vI2VuZHJlZ2lvbiBIZWxwZXIgTWV0aG9kc1xyXG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxJQUFBQSxPQUFBLEdBQUFDLE9BQUE7QUFDQSxJQUFBQyxXQUFBLEdBQUFDLHNCQUFBLENBQUFGLE9BQUE7QUFDQSxJQUFBRyxVQUFBLEdBQUFILE9BQUE7QUFDQSxJQUFBSSxjQUFBLEdBQUFKLE9BQUE7QUFvQkEsSUFBQUssTUFBQSxHQUFBTCxPQUFBO0FBRUE7O0FBRUEsTUFBTU0sYUFBYSxHQUFHLElBQUFDLG1CQUFVLEVBQy9CLENBQUNDLFVBQThDLEVBQUVDLGdCQUFvQyxFQUFFQyxTQUFpQixLQUN2R0YsVUFBVSxJQUFJLElBQUFHLHdDQUFpQyxFQUFDRixnQkFBZ0IsRUFBRUMsU0FBUyxDQUM3RSxDQUFDO0FBRU0sU0FBU0UsNkJBQTZCQSxDQUM1Q0MsTUFBc0MsRUFDSztFQUMzQyxNQUFNO0lBQUVDLElBQUk7SUFBRUosU0FBUztJQUFFRixVQUFVO0lBQUVDLGdCQUFnQjtJQUFFTTtFQUFNLENBQUMsR0FBR0YsTUFBTTtFQUN2RSxNQUFNRyxtQkFBbUIsR0FBRyxJQUFBQyxvQ0FBNkIsRUFBQ1AsU0FBUyxDQUFDO0VBQ3BFLE1BQU1RLENBQUMsR0FBR1osYUFBYSxDQUFDRSxVQUFVLEVBQUVDLGdCQUFnQixFQUFFQyxTQUFTLENBQUM7RUFDaEUsTUFBTVMsY0FBYyxHQUFHLElBQUFDLHdCQUFpQixFQUFDRixDQUFDLEVBQUVSLFNBQVMsQ0FBQztFQUV0RCxJQUFJVyxLQUFLLEdBQUcsQ0FBQyxDQUFXO0VBQ3hCO0VBQ0EsSUFBSUgsQ0FBQyxDQUFDSSxNQUFNLEtBQUtOLG1CQUFtQixFQUFFO0lBQ3JDLE1BQU1PLFVBQVUsR0FBSSxJQUFBQyxXQUFHLEVBQUNULEtBQUssQ0FBQ1UsTUFBTSxF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