studiokit-scaffolding-js 7.0.12-next.2.4 → 7.0.12-next.2.6
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.
- package/LICENSE +21 -21
- package/README.md +137 -137
- package/lib/components/ActionList.js +1 -1
- package/lib/components/AlertDialog.js +1 -1
- package/lib/components/AlertWithIcon.js +1 -1
- package/lib/components/ConnectedModal.js +3 -3
- package/lib/components/Dropdowns/GroupsDropdown.js +1 -1
- package/lib/components/Dropdowns/ManagedNavDropdown.js +4 -4
- package/lib/components/Dropdowns/UserDropdown.js +1 -1
- package/lib/components/Dropdowns/index.js +1 -1
- package/lib/components/EntityOwnerList.js +1 -1
- package/lib/components/Error.js +1 -1
- package/lib/components/ErrorBoundary.js +1 -1
- package/lib/components/ErrorMessage.js +1 -1
- package/lib/components/Forms/DateField.js +1 -1
- package/lib/components/Forms/TimeField.js +1 -1
- package/lib/components/Forms/index.js +1 -1
- package/lib/components/Groups/CreateEditCopySaveButtons.d.ts +2 -2
- package/lib/components/Groups/CreateEditCopySaveButtons.js +40 -48
- package/lib/components/Groups/ExternalGroups/Attach.js +1 -1
- package/lib/components/Groups/ExternalGroups/Table.js +1 -1
- package/lib/components/Groups/GroupCreateOrEditCommonProps.js +1 -1
- package/lib/components/Groups/RosterSyncInfo.js +1 -1
- package/lib/components/HOC/AccessibleAppComponent.js +6 -6
- package/lib/components/HOC/ActivityRequiredComponent.js +50 -50
- package/lib/components/HOC/AsyncComponent.js +1 -1
- package/lib/components/HOC/AuthenticatedComponent.js +1 -1
- package/lib/components/HOC/CollectionComponent.js +11 -11
- package/lib/components/HOC/CollectionFirstItemComponent.js +4 -4
- package/lib/components/HOC/CollectionItemComponent.js +11 -11
- package/lib/components/HOC/ConnectedModalComponent.js +15 -15
- package/lib/components/HOC/DataDependentComponent.js +1 -1
- package/lib/components/HOC/EntityComponent.js +12 -12
- package/lib/components/HOC/FullscreenModalComponent.js +24 -24
- package/lib/components/HOC/GroupActivityRequiredComponent.js +19 -19
- package/lib/components/HOC/GuidComponent.js +5 -5
- package/lib/components/HOC/ModelContextDependencyVerifyComponent.js +7 -7
- package/lib/components/HOC/ModelErrorRedirectComponent.js +12 -12
- package/lib/components/HOC/SearchPersistorComponent.js +43 -43
- package/lib/components/HOC/UnauthenticatedComponent.js +1 -1
- package/lib/components/HOC/UserComponent.js +1 -1
- package/lib/components/Icons/IconAlphaList.js +1 -1
- package/lib/components/Icons/IconExternalUser.js +1 -1
- package/lib/components/Icons/IconImpersonation.js +1 -1
- package/lib/components/Icons/IconStopImpersonating.js +1 -1
- package/lib/components/Icons/IconTable.js +1 -1
- package/lib/components/Icons/IconTableDeleteCol.js +1 -1
- package/lib/components/Icons/IconTableDeleteRow.js +1 -1
- package/lib/components/Icons/IconTableInsertCol.js +1 -1
- package/lib/components/Icons/IconTableInsertRow.js +1 -1
- package/lib/components/Impersonation/Button.js +1 -1
- package/lib/components/Impersonation/Link.js +1 -1
- package/lib/components/Impersonation/UserDetail.css +22 -22
- package/lib/components/Impersonation/UserDetail.js +3 -3
- package/lib/components/Loading.js +1 -1
- package/lib/components/LockDownBrowser/Check.js +1 -1
- package/lib/components/LockDownBrowser/ExitButton.js +1 -1
- package/lib/components/LockDownBrowser/Launch.js +1 -1
- package/lib/components/Lti/Confirm.js +1 -1
- package/lib/components/Lti/CreateNonLtiGroupAlertDialog.js +1 -1
- package/lib/components/Lti/Launch.js +1 -1
- package/lib/components/Lti/LaunchGroup.js +1 -1
- package/lib/components/ManageTable.js +1 -1
- package/lib/components/ManageTableNoDataComponent.js +1 -1
- package/lib/components/NewVersionAlert.js +1 -1
- package/lib/components/NotFound.js +1 -1
- package/lib/components/Notifications.js +1 -1
- package/lib/components/PaginationNextButton.js +1 -1
- package/lib/components/PaginationPreviousButton.js +1 -1
- package/lib/components/Quill/CustomToolbar.js +1 -1
- package/lib/components/Quill/Formats/Image.js +5 -5
- package/lib/components/Quill/Formats/List.js +3 -3
- package/lib/components/Quill/Formats/Video.js +3 -3
- package/lib/components/Quill/ImageDropModule.js +17 -17
- package/lib/components/Quill/ImageWarning.js +1 -1
- package/lib/components/Quill/ImageWithAltTextModal.js +1 -1
- package/lib/components/Quill/Specs/CustomImageSpec.js +7 -7
- package/lib/components/Quill/Specs/CustomVideoSpec.js +9 -9
- package/lib/components/Quill/TableModule/Blots/BaseTableBlot.js +8 -8
- package/lib/components/Quill/TableModule/Blots/TableBlot.js +1 -1
- package/lib/components/Quill/TableModule/Blots/TableBodyBlot.js +1 -1
- package/lib/components/Quill/TableModule/Blots/TableCellBlot.js +1 -1
- package/lib/components/Quill/TableModule/Blots/TableContainer.js +1 -1
- package/lib/components/Quill/TableModule/Blots/TableRowBlot.js +1 -1
- package/lib/components/Quill/TableModule/constants.js +1 -1
- package/lib/components/Quill/TableModule/index.css +171 -171
- package/lib/components/Quill/TableModule/index.js +1 -1
- package/lib/components/Quill/TableModule/utils.js +1 -1
- package/lib/components/Quill/accessibilityFix.js +14 -14
- package/lib/components/Quill/index.js +1 -1
- package/lib/components/RefreshIndicator/Bordered.js +1 -1
- package/lib/components/RefreshIndicator/Inline.js +1 -1
- package/lib/components/RefreshIndicator/index.js +1 -1
- package/lib/components/SearchControls.js +1 -1
- package/lib/components/SentryRoute.js +1 -1
- package/lib/components/Tables/RoleFilter.js +1 -1
- package/lib/components/Tables/TextFilter.js +1 -1
- package/lib/components/UserRoles/Add.js +1 -1
- package/lib/components/UserRoles/Context.js +4 -4
- package/lib/components/UserRoles/RoleCell.js +1 -1
- package/lib/components/UserRoles/Select.js +1 -1
- package/lib/components/UserRoles/Table.js +1 -1
- package/lib/components/UserRoles/index.js +3 -3
- package/lib/config/eslint/index.js +1 -1
- package/lib/config/eslint/lib/order.js +1 -1
- package/lib/config/eslint/lib/prettier.js +1 -1
- package/lib/config/eslint/lib/typescript.js +1 -1
- package/lib/config/eslint/react.js +1 -1
- package/lib/constants/baseActivity.js +1 -1
- package/lib/constants/baseRole.js +1 -1
- package/lib/constants/configuration.js +1 -1
- package/lib/constants/externalProviderType.js +1 -1
- package/lib/constants/fetchErrorData.js +1 -1
- package/lib/constants/index.js +1 -1
- package/lib/constants/lockDownBrowser.js +1 -1
- package/lib/constants/mockData.js +3 -3
- package/lib/constants/modelStatus.js +1 -1
- package/lib/constants/notificationType.js +1 -1
- package/lib/constants/operatingSystem.js +1 -1
- package/lib/constants/shard.js +1 -1
- package/lib/constants/table.js +1 -1
- package/lib/constants/tier.js +1 -1
- package/lib/constants/userRole.js +1 -1
- package/lib/css/base/_base.css +98 -98
- package/lib/css/base/_typography.css +130 -130
- package/lib/css/components/_alert.css +86 -86
- package/lib/css/components/_bootstrap-grid.css +28 -28
- package/lib/css/components/_buttons.css +397 -397
- package/lib/css/components/_forms.css +101 -101
- package/lib/css/components/_menu.css +56 -56
- package/lib/css/components/_modals.css +46 -46
- package/lib/css/components/_quill.css +315 -315
- package/lib/css/components/_tables.css +497 -497
- package/lib/css/components/_tags.css +12 -12
- package/lib/css/index-with-variables.css +15 -15
- package/lib/css/index.css +14 -14
- package/lib/css/utils/_border.css +463 -463
- package/lib/css/utils/_color.css +317 -317
- package/lib/css/utils/_display.css +305 -305
- package/lib/css/utils/_general.css +48 -48
- package/lib/css/utils/_icon.css +16 -16
- package/lib/css/utils/_text.css +25 -25
- package/lib/css/utils/_width.css +60 -60
- package/lib/css/variables.css +84 -84
- package/lib/endpointMappings.js +1 -1
- package/lib/hooks/useCollection.js +1 -1
- package/lib/hooks/useCollectionConfiguration.js +7 -7
- package/lib/hooks/useCollectionItem.js +1 -1
- package/lib/hooks/useGuid.js +3 -3
- package/lib/hooks/usePrevious.js +15 -15
- package/lib/index.js +1 -1
- package/lib/redux/actionCreator.js +1 -1
- package/lib/redux/actions/AuthAction.js +7 -7
- package/lib/redux/actions/ModalAction.js +1 -1
- package/lib/redux/actions/ModelAction.js +17 -17
- package/lib/redux/actions/NotificationAction.js +1 -1
- package/lib/redux/actions/SearchAction.js +1 -1
- package/lib/redux/actions/index.js +1 -1
- package/lib/redux/configureReducers.js +7 -7
- package/lib/redux/configureStore.js +1 -1
- package/lib/redux/helpers.js +1 -1
- package/lib/redux/reducers/authReducer.js +3 -3
- package/lib/redux/reducers/index.js +1 -1
- package/lib/redux/reducers/modalsReducer.js +1 -1
- package/lib/redux/reducers/modelsReducer.js +48 -48
- package/lib/redux/reducers/notificationsReducer.js +1 -1
- package/lib/redux/reducers/searchReducer.js +9 -9
- package/lib/redux/sagas/appInsightsSaga.js +1 -1
- package/lib/redux/sagas/authSaga.js +1 -1
- package/lib/redux/sagas/caliperSaga.js +16 -16
- package/lib/redux/sagas/clockOffsetSaga.js +9 -9
- package/lib/redux/sagas/configurationSaga.js +1 -1
- package/lib/redux/sagas/downtimeApiErrorSaga.js +1 -1
- package/lib/redux/sagas/errorSaga.js +1 -1
- package/lib/redux/sagas/googleAnalyticsSaga.js +1 -1
- package/lib/redux/sagas/identityProviderSaga.js +1 -1
- package/lib/redux/sagas/initialDataLoadSaga.js +1 -1
- package/lib/redux/sagas/lockDownBrowserErrorSaga.js +1 -1
- package/lib/redux/sagas/modelFetchSaga.js +49 -49
- package/lib/redux/sagas/noStoreSaga.js +1 -1
- package/lib/redux/sagas/postLoginDataSaga.js +6 -6
- package/lib/redux/sagas/postLoginRedirectSaga.js +4 -4
- package/lib/redux/sagas/rootSaga.js +1 -1
- package/lib/redux/sagas/sentrySaga.js +1 -1
- package/lib/redux/sagas/userIdSaga.js +1 -1
- package/lib/services/codeProviderService.js +1 -1
- package/lib/services/dateService.js +3 -3
- package/lib/services/documentService.js +4 -4
- package/lib/services/fetchService.js +25 -25
- package/lib/services/persistenceService.js +1 -1
- package/lib/services/ticketProviderService.js +1 -1
- package/lib/services/tokenPersistenceService.js +1 -1
- package/lib/services/windowService.js +1 -1
- package/lib/startup.js +18 -18
- package/lib/types/AppConfiguration.js +1 -1
- package/lib/types/Artifact.js +1 -1
- package/lib/types/BaseReduxState.js +1 -1
- package/lib/types/Client.js +1 -1
- package/lib/types/Collection.js +1 -1
- package/lib/types/Configuration.js +1 -1
- package/lib/types/DeepLinkingResponseRequest.js +1 -1
- package/lib/types/DeletableModel.js +1 -1
- package/lib/types/Event.js +1 -1
- package/lib/types/ExternalGroup.js +1 -1
- package/lib/types/ExternalProvider.js +1 -1
- package/lib/types/ExternalTerm.js +1 -1
- package/lib/types/Group.js +1 -1
- package/lib/types/IdentityProvider.js +1 -1
- package/lib/types/LtiLaunch.js +1 -1
- package/lib/types/NameOnlyEntity.js +1 -1
- package/lib/types/Notification.js +1 -1
- package/lib/types/OptionalRecord.js +1 -1
- package/lib/types/OwnerSchedule.js +1 -1
- package/lib/types/PropertyOfType.js +1 -1
- package/lib/types/Quill.js +1 -1
- package/lib/types/RoleDescription.js +1 -1
- package/lib/types/Search.js +1 -1
- package/lib/types/SimpleLocation.js +1 -1
- package/lib/types/UniTime.js +1 -1
- package/lib/types/User.js +1 -1
- package/lib/types/UserRole.js +1 -1
- package/lib/types/auth/AuthState.js +1 -1
- package/lib/types/auth/CasV1LoginRequestBody.js +1 -1
- package/lib/types/auth/ClientCredentials.js +1 -1
- package/lib/types/auth/CodeProviderService.js +1 -1
- package/lib/types/auth/LocalLoginRequestBody.js +1 -1
- package/lib/types/auth/TicketProviderService.js +1 -1
- package/lib/types/auth/TokenPersistenceService.js +1 -1
- package/lib/types/auth/index.js +1 -1
- package/lib/types/externals.d.js +1 -1
- package/lib/types/index.js +1 -1
- package/lib/types/net/EndpointConfig.js +1 -1
- package/lib/types/net/EndpointMapping.js +1 -1
- package/lib/types/net/EndpointMappings.js +1 -1
- package/lib/types/net/ErrorHandler.js +1 -1
- package/lib/types/net/FetchConfig.js +1 -1
- package/lib/types/net/FetchErrorData.js +1 -1
- package/lib/types/net/FetchResult.js +1 -1
- package/lib/types/net/HTTPMethod.js +1 -1
- package/lib/types/net/HTTPStatusCode.js +1 -1
- package/lib/types/net/Metadata.js +1 -1
- package/lib/types/net/Model.js +1 -1
- package/lib/types/net/ModelCollection.js +1 -1
- package/lib/types/net/ModelsState.js +1 -1
- package/lib/types/net/OAuthToken.js +1 -1
- package/lib/types/net/OAuthTokenOrNull.js +1 -1
- package/lib/types/net/TokenAccessFunction.js +1 -1
- package/lib/types/net/index.js +1 -1
- package/lib/utils/baseActivity.js +87 -87
- package/lib/utils/baseRole.js +1 -1
- package/lib/utils/collection.js +20 -20
- package/lib/utils/cookies.js +1 -1
- package/lib/utils/date.js +111 -111
- package/lib/utils/dom.js +42 -42
- package/lib/utils/domainIdentifier.js +1 -1
- package/lib/utils/entityUserRole.js +1 -1
- package/lib/utils/error.js +1 -1
- package/lib/utils/events.js +4 -4
- package/lib/utils/externalGroup.js +1 -1
- package/lib/utils/externalProviders.js +1 -1
- package/lib/utils/externalTerms.js +1 -1
- package/lib/utils/fetch.js +18 -11
- package/lib/utils/group.js +1 -1
- package/lib/utils/groupDates.js +1 -1
- package/lib/utils/groupRoles.js +1 -1
- package/lib/utils/lockDownBrowser.js +1 -1
- package/lib/utils/logger.js +1 -1
- package/lib/utils/lti.js +1 -1
- package/lib/utils/model.js +5 -5
- package/lib/utils/number.js +11 -11
- package/lib/utils/promise.js +1 -1
- package/lib/utils/quill.js +16 -16
- package/lib/utils/route.js +1 -1
- package/lib/utils/search.js +1 -1
- package/lib/utils/shard.js +1 -1
- package/lib/utils/sort.js +1 -1
- package/lib/utils/string.js +1 -1
- package/lib/utils/table.js +4 -4
- package/lib/utils/timezone.js +1 -1
- package/lib/utils/url.js +18 -18
- package/lib/utils/user.js +1 -1
- package/lib/utils/userAgent.js +1 -1
- package/lib/utils/userRole.js +16 -16
- package/package.json +225 -225
package/lib/utils/date.js
CHANGED
|
@@ -34,31 +34,31 @@ exports.setClockOffset = exports.isTimeInputSupported = void 0;
|
|
|
34
34
|
var _momentTimezone = _interopRequireDefault(require("moment-timezone"));
|
|
35
35
|
var _momentTimezoneUtils = _interopRequireDefault(require("moment-timezone/moment-timezone-utils"));
|
|
36
36
|
var _timezone = require("./timezone");
|
|
37
|
-
/**
|
|
38
|
-
* This value is used by time-sensitive functions in this module and other date/time utils. Any time
|
|
39
|
-
* a new Date object is constructed, it will use this value to adjust the time by this offset (to
|
|
40
|
-
* make it consistent with a known time)
|
|
37
|
+
/**
|
|
38
|
+
* This value is used by time-sensitive functions in this module and other date/time utils. Any time
|
|
39
|
+
* a new Date object is constructed, it will use this value to adjust the time by this offset (to
|
|
40
|
+
* make it consistent with a known time)
|
|
41
41
|
*/
|
|
42
42
|
let clockOffset = 0;
|
|
43
43
|
|
|
44
|
-
/**
|
|
45
|
-
* When a GroupAssessment comes in the door, it includes the current UTC datetime. This method is
|
|
46
|
-
* used to update the difference between the (accurate) server time and the browser time
|
|
44
|
+
/**
|
|
45
|
+
* When a GroupAssessment comes in the door, it includes the current UTC datetime. This method is
|
|
46
|
+
* used to update the difference between the (accurate) server time and the browser time
|
|
47
47
|
*/
|
|
48
48
|
const setClockOffset = function (offset) {
|
|
49
49
|
clockOffset = offset;
|
|
50
50
|
};
|
|
51
51
|
|
|
52
|
-
/**
|
|
53
|
-
* Get the current UTC time, calibrated to the API server's clock
|
|
52
|
+
/**
|
|
53
|
+
* Get the current UTC time, calibrated to the API server's clock
|
|
54
54
|
*/
|
|
55
55
|
exports.setClockOffset = setClockOffset;
|
|
56
56
|
const getServerNowUtc = function () {
|
|
57
57
|
return new Date(Date.now() + clockOffset);
|
|
58
58
|
};
|
|
59
59
|
|
|
60
|
-
/**
|
|
61
|
-
* Return the provided date, offset by the clockOffset
|
|
60
|
+
/**
|
|
61
|
+
* Return the provided date, offset by the clockOffset
|
|
62
62
|
*/
|
|
63
63
|
exports.getServerNowUtc = getServerNowUtc;
|
|
64
64
|
const getOffsetDate = date => {
|
|
@@ -109,13 +109,13 @@ function getEndOfMinute(dateTimeUtc) {
|
|
|
109
109
|
.toDate();
|
|
110
110
|
}
|
|
111
111
|
|
|
112
|
-
/**
|
|
113
|
-
* Is the current time, "now", **after or equal to** the given date.
|
|
114
|
-
*
|
|
115
|
-
* @param dateTimeUtc The date to compare the current time, "now", as an ISO date string.
|
|
116
|
-
* @param nowUtc Optional. The current time, "now", as an ISO date string.
|
|
117
|
-
*
|
|
118
|
-
* @returns Whether or not "now" is **after or equal to** `dateTimeUtc`
|
|
112
|
+
/**
|
|
113
|
+
* Is the current time, "now", **after or equal to** the given date.
|
|
114
|
+
*
|
|
115
|
+
* @param dateTimeUtc The date to compare the current time, "now", as an ISO date string.
|
|
116
|
+
* @param nowUtc Optional. The current time, "now", as an ISO date string.
|
|
117
|
+
*
|
|
118
|
+
* @returns Whether or not "now" is **after or equal to** `dateTimeUtc`
|
|
119
119
|
*/
|
|
120
120
|
function isNowEqualOrAfterDate(dateTimeUtc) {
|
|
121
121
|
let nowUtc = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : getServerNowUtc().toISOString();
|
|
@@ -127,13 +127,13 @@ function isNowEqualOrAfterDate(dateTimeUtc) {
|
|
|
127
127
|
return currentMoment.isSameOrAfter(adjustedDateTimeMoment);
|
|
128
128
|
}
|
|
129
129
|
|
|
130
|
-
/**
|
|
131
|
-
* Is the current time, "now", **before or equal to** the given date.
|
|
132
|
-
*
|
|
133
|
-
* @param dateTimeUtc The date to compare the current time, "now", as an ISO date string.
|
|
134
|
-
* @param nowUtc Optional. The current time, "now", as an ISO date string.
|
|
135
|
-
*
|
|
136
|
-
* @returns Whether or not "now" is **before or equal to** `dateTimeUtc`.
|
|
130
|
+
/**
|
|
131
|
+
* Is the current time, "now", **before or equal to** the given date.
|
|
132
|
+
*
|
|
133
|
+
* @param dateTimeUtc The date to compare the current time, "now", as an ISO date string.
|
|
134
|
+
* @param nowUtc Optional. The current time, "now", as an ISO date string.
|
|
135
|
+
*
|
|
136
|
+
* @returns Whether or not "now" is **before or equal to** `dateTimeUtc`.
|
|
137
137
|
*/
|
|
138
138
|
function isNowEqualOrBeforeDate(dateTimeUtc) {
|
|
139
139
|
let nowUtc = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : getServerNowUtc().toISOString();
|
|
@@ -145,13 +145,13 @@ function isNowEqualOrBeforeDate(dateTimeUtc) {
|
|
|
145
145
|
return currentMoment.isSameOrBefore(adjustedDateTimeMoment);
|
|
146
146
|
}
|
|
147
147
|
|
|
148
|
-
/**
|
|
149
|
-
* Is the current time, "now", **after** the given date.
|
|
150
|
-
*
|
|
151
|
-
* @param dateTimeUtc The date to compare the current time, "now", as an ISO date string.
|
|
152
|
-
* @param nowUtc Optional. The current time, "now", as an ISO date string.
|
|
153
|
-
*
|
|
154
|
-
* @returns Whether or not "now" is **after** `dateTimeUtc`.
|
|
148
|
+
/**
|
|
149
|
+
* Is the current time, "now", **after** the given date.
|
|
150
|
+
*
|
|
151
|
+
* @param dateTimeUtc The date to compare the current time, "now", as an ISO date string.
|
|
152
|
+
* @param nowUtc Optional. The current time, "now", as an ISO date string.
|
|
153
|
+
*
|
|
154
|
+
* @returns Whether or not "now" is **after** `dateTimeUtc`.
|
|
155
155
|
*/
|
|
156
156
|
function isNowAfterDate(dateTimeUtc) {
|
|
157
157
|
let nowUtc = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : getServerNowUtc().toISOString();
|
|
@@ -163,13 +163,13 @@ function isNowAfterDate(dateTimeUtc) {
|
|
|
163
163
|
return currentMoment > adjustedDateTimeMoment;
|
|
164
164
|
}
|
|
165
165
|
|
|
166
|
-
/**
|
|
167
|
-
* Is the current time, "now", **before** the given date.
|
|
168
|
-
*
|
|
169
|
-
* @param dateTimeUtc The date to compare the current time, "now", as an ISO date string.
|
|
170
|
-
* @param nowUtc Optional. The current time, "now", as an ISO date string.
|
|
171
|
-
*
|
|
172
|
-
* @returns Whether or not "now" is **before** `dateTimeUtc`.
|
|
166
|
+
/**
|
|
167
|
+
* Is the current time, "now", **before** the given date.
|
|
168
|
+
*
|
|
169
|
+
* @param dateTimeUtc The date to compare the current time, "now", as an ISO date string.
|
|
170
|
+
* @param nowUtc Optional. The current time, "now", as an ISO date string.
|
|
171
|
+
*
|
|
172
|
+
* @returns Whether or not "now" is **before** `dateTimeUtc`.
|
|
173
173
|
*/
|
|
174
174
|
function isNowBeforeDate(dateTimeUtc) {
|
|
175
175
|
let nowUtc = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : getServerNowUtc().toISOString();
|
|
@@ -181,66 +181,66 @@ function isNowBeforeDate(dateTimeUtc) {
|
|
|
181
181
|
return currentMoment < adjustedDateTimeMoment;
|
|
182
182
|
}
|
|
183
183
|
|
|
184
|
-
/**
|
|
185
|
-
* Returns a date and time string with full date, e.g. `March 5, 2018 @ 4:05 PM EDT`
|
|
186
|
-
* @param dateTimeUtc A UTC date time string
|
|
187
|
-
* @param withTimeZone (optional) Whether to include the time zone abbreviation. Defaults to `true`.
|
|
184
|
+
/**
|
|
185
|
+
* Returns a date and time string with full date, e.g. `March 5, 2018 @ 4:05 PM EDT`
|
|
186
|
+
* @param dateTimeUtc A UTC date time string
|
|
187
|
+
* @param withTimeZone (optional) Whether to include the time zone abbreviation. Defaults to `true`.
|
|
188
188
|
*/
|
|
189
189
|
function getFormattedFullDateAndTime(dateTimeUtc) {
|
|
190
190
|
let withTimeZone = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
|
|
191
191
|
return applyFormat(dateTimeUtc, `MMMM D, YYYY @ h:mm\u00a0A${withTimeZone ? ' z' : ''}`);
|
|
192
192
|
}
|
|
193
193
|
|
|
194
|
-
/**
|
|
195
|
-
* Returns a date and time string with day of week and American slash dates, e.g. `Mon, 3/5/2018 @ 4:05 PM EDT`
|
|
196
|
-
* @param dateTimeUtc A UTC date time string
|
|
197
|
-
* @param withTimeZone (optional) Whether to include the time zone abbreviation. Defaults to `true`.
|
|
194
|
+
/**
|
|
195
|
+
* Returns a date and time string with day of week and American slash dates, e.g. `Mon, 3/5/2018 @ 4:05 PM EDT`
|
|
196
|
+
* @param dateTimeUtc A UTC date time string
|
|
197
|
+
* @param withTimeZone (optional) Whether to include the time zone abbreviation. Defaults to `true`.
|
|
198
198
|
*/
|
|
199
199
|
function getFormattedFullDateWithWeek(dateTimeUtc) {
|
|
200
200
|
let withTimeZone = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
|
|
201
201
|
return applyFormat(dateTimeUtc, `ddd, M/D/YYYY @ h:mm\u00a0A${withTimeZone ? ' z' : ''}`);
|
|
202
202
|
}
|
|
203
203
|
|
|
204
|
-
/**
|
|
205
|
-
* Returns a date and time string with American slash dates, and no leading zeroes, e.g. `3/5/18 4:05 PM EDT`
|
|
206
|
-
* @param dateTimeUtc A UTC date time string
|
|
207
|
-
* @param withTimeZone (optional) Whether to include the time zone abbreviation. Defaults to `true`.
|
|
204
|
+
/**
|
|
205
|
+
* Returns a date and time string with American slash dates, and no leading zeroes, e.g. `3/5/18 4:05 PM EDT`
|
|
206
|
+
* @param dateTimeUtc A UTC date time string
|
|
207
|
+
* @param withTimeZone (optional) Whether to include the time zone abbreviation. Defaults to `true`.
|
|
208
208
|
*/
|
|
209
209
|
function getFormattedNumberedDateAndTime(dateTimeUtc) {
|
|
210
210
|
let withTimeZone = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
|
|
211
211
|
return applyFormat(dateTimeUtc, `M/D/YY h:mm\u00a0A${withTimeZone ? ' z' : ''}`);
|
|
212
212
|
}
|
|
213
213
|
|
|
214
|
-
/**
|
|
215
|
-
* Returns a date and time string with American slash dates, no leading zeroes, and no year, e.g. `3/5 4:05 PM EDT`
|
|
216
|
-
* @param dateTimeUtc A UTC date time string
|
|
217
|
-
* @param withTimeZone (optional) Whether to include the time zone abbreviation. Defaults to `true`.
|
|
214
|
+
/**
|
|
215
|
+
* Returns a date and time string with American slash dates, no leading zeroes, and no year, e.g. `3/5 4:05 PM EDT`
|
|
216
|
+
* @param dateTimeUtc A UTC date time string
|
|
217
|
+
* @param withTimeZone (optional) Whether to include the time zone abbreviation. Defaults to `true`.
|
|
218
218
|
*/
|
|
219
219
|
function getFormattedNumberedDateAndTimeWithoutYear(dateTimeUtc) {
|
|
220
220
|
let withTimeZone = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
|
|
221
221
|
return applyFormat(dateTimeUtc, `M/D h:mm\u00a0A${withTimeZone ? ' z' : ''}`);
|
|
222
222
|
}
|
|
223
223
|
|
|
224
|
-
/**
|
|
225
|
-
* Returns a date string with short month and full year, e.g. `Mar 5, 2018`
|
|
226
|
-
* @param dateTimeUtc A UTC date time string
|
|
224
|
+
/**
|
|
225
|
+
* Returns a date string with short month and full year, e.g. `Mar 5, 2018`
|
|
226
|
+
* @param dateTimeUtc A UTC date time string
|
|
227
227
|
*/
|
|
228
228
|
function getFormattedSimplifiedDate(dateTimeUtc) {
|
|
229
229
|
return applyFormat(dateTimeUtc, 'MMM D, YYYY');
|
|
230
230
|
}
|
|
231
231
|
|
|
232
|
-
/**
|
|
233
|
-
* Returns a date string with short month and no year, e.g. `Mar 5`
|
|
234
|
-
* @param dateTimeUtc A UTC date time string
|
|
232
|
+
/**
|
|
233
|
+
* Returns a date string with short month and no year, e.g. `Mar 5`
|
|
234
|
+
* @param dateTimeUtc A UTC date time string
|
|
235
235
|
*/
|
|
236
236
|
function getFormattedSimplifiedDateWithoutYear(dateTimeUtc) {
|
|
237
237
|
return applyFormat(dateTimeUtc, 'MMM D');
|
|
238
238
|
}
|
|
239
239
|
|
|
240
|
-
/**
|
|
241
|
-
* Returns a date string as either 'MMM D, YYYY' or 'MMM D' if the date's year is the same as the current year
|
|
242
|
-
* @param dateTimeUtc A UTC date time string
|
|
243
|
-
* @param nowUtc (optional) A UTC date time string of "now". Used for testing.
|
|
240
|
+
/**
|
|
241
|
+
* Returns a date string as either 'MMM D, YYYY' or 'MMM D' if the date's year is the same as the current year
|
|
242
|
+
* @param dateTimeUtc A UTC date time string
|
|
243
|
+
* @param nowUtc (optional) A UTC date time string of "now". Used for testing.
|
|
244
244
|
*/
|
|
245
245
|
function getFormattedSimplifiedDateWithYearIfNotCurrent(dateTimeUtc) {
|
|
246
246
|
let nowUtc = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : getServerNowUtc().toISOString();
|
|
@@ -249,53 +249,53 @@ function getFormattedSimplifiedDateWithYearIfNotCurrent(dateTimeUtc) {
|
|
|
249
249
|
return Math.abs(nowUtcMoment.year() - dateTimeMoment.year()) === 0 ? getFormattedSimplifiedDateWithoutYear(dateTimeUtc) : getFormattedSimplifiedDate(dateTimeUtc);
|
|
250
250
|
}
|
|
251
251
|
|
|
252
|
-
/**
|
|
253
|
-
* Returns a date string with American slash dates, no leading zeroes, and short year, e.g. `3/5/18`
|
|
254
|
-
* @param dateTimeUtc A UTC date time string
|
|
252
|
+
/**
|
|
253
|
+
* Returns a date string with American slash dates, no leading zeroes, and short year, e.g. `3/5/18`
|
|
254
|
+
* @param dateTimeUtc A UTC date time string
|
|
255
255
|
*/
|
|
256
256
|
function getFormattedNumberedDate(dateTimeUtc) {
|
|
257
257
|
return applyFormat(dateTimeUtc, 'M/D/YY');
|
|
258
258
|
}
|
|
259
259
|
|
|
260
|
-
/**
|
|
261
|
-
* Returns a date string with American slash dates, no leading zeroes, and full year, e.g. `3/5/2018`
|
|
262
|
-
* @param dateTimeUtc A UTC date time string
|
|
260
|
+
/**
|
|
261
|
+
* Returns a date string with American slash dates, no leading zeroes, and full year, e.g. `3/5/2018`
|
|
262
|
+
* @param dateTimeUtc A UTC date time string
|
|
263
263
|
*/
|
|
264
264
|
function getFormattedNumberedDateWithFullYear(dateTimeUtc) {
|
|
265
265
|
return applyFormat(dateTimeUtc, 'M/D/YYYY');
|
|
266
266
|
}
|
|
267
267
|
|
|
268
|
-
/**
|
|
269
|
-
* Returns a date string for use in HTML inputs, e.g. `2018-03-05`
|
|
270
|
-
* @param dateTimeUtc A UTC date time string
|
|
268
|
+
/**
|
|
269
|
+
* Returns a date string for use in HTML inputs, e.g. `2018-03-05`
|
|
270
|
+
* @param dateTimeUtc A UTC date time string
|
|
271
271
|
*/
|
|
272
272
|
function getFormattedNumberedDateForInput(dateTimeUtc) {
|
|
273
273
|
return applyFormat(dateTimeUtc, 'YYYY-MM-DD');
|
|
274
274
|
}
|
|
275
275
|
|
|
276
|
-
/**
|
|
277
|
-
* Returns a date string with American slash dates and no year and no leading zeroes, e.g. `3/5`
|
|
278
|
-
* @param dateTimeUtc A UTC date time string
|
|
276
|
+
/**
|
|
277
|
+
* Returns a date string with American slash dates and no year and no leading zeroes, e.g. `3/5`
|
|
278
|
+
* @param dateTimeUtc A UTC date time string
|
|
279
279
|
*/
|
|
280
280
|
function getFormattedNumberedDateWithoutYear(dateTimeUtc) {
|
|
281
281
|
return applyFormat(dateTimeUtc, 'M/D');
|
|
282
282
|
}
|
|
283
283
|
|
|
284
|
-
/**
|
|
285
|
-
* Returns a time string, e.g. `4:05 PM EDT`
|
|
286
|
-
* @param dateTimeUtc A UTC date time string
|
|
287
|
-
* @param withTimeZone (optional) Whether to include the time zone abbreviation. Defaults to `true`.
|
|
284
|
+
/**
|
|
285
|
+
* Returns a time string, e.g. `4:05 PM EDT`
|
|
286
|
+
* @param dateTimeUtc A UTC date time string
|
|
287
|
+
* @param withTimeZone (optional) Whether to include the time zone abbreviation. Defaults to `true`.
|
|
288
288
|
*/
|
|
289
289
|
function getFormattedNumberedTime(dateTimeUtc) {
|
|
290
290
|
let withTimeZone = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
|
|
291
291
|
return applyFormat(dateTimeUtc, `h:mm\u00a0A${withTimeZone ? ' z' : ''}`);
|
|
292
292
|
}
|
|
293
293
|
|
|
294
|
-
/**
|
|
295
|
-
* Returns a time string with possibly full time zone name, e.g. `4:05 PM EDT` or `4:05 PM CST (Asia/Taipei)`
|
|
296
|
-
* @param dateTimeUtc A UTC date time string
|
|
297
|
-
* @param showEasternZoneId (optional) Whether or not to include the timeZoneId in the result for EST/EDT. Defaults to `false`.
|
|
298
|
-
* @param timeZoneId (optional) A time zone Id. Defaults to the current time zone id, using `guessTimeZoneId()`.
|
|
294
|
+
/**
|
|
295
|
+
* Returns a time string with possibly full time zone name, e.g. `4:05 PM EDT` or `4:05 PM CST (Asia/Taipei)`
|
|
296
|
+
* @param dateTimeUtc A UTC date time string
|
|
297
|
+
* @param showEasternZoneId (optional) Whether or not to include the timeZoneId in the result for EST/EDT. Defaults to `false`.
|
|
298
|
+
* @param timeZoneId (optional) A time zone Id. Defaults to the current time zone id, using `guessTimeZoneId()`.
|
|
299
299
|
*/
|
|
300
300
|
function getFormattedNumberedTimeWithFullZone(dateTimeUtc) {
|
|
301
301
|
let showEasternZoneId = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
|
|
@@ -311,32 +311,32 @@ function getFormattedNumberedTimeWithFullZone(dateTimeUtc) {
|
|
|
311
311
|
`${time} ${timezoneAbbreviation} (${timeZoneId.replace('_', ' ')})`;
|
|
312
312
|
}
|
|
313
313
|
|
|
314
|
-
/**
|
|
315
|
-
* Returns a time string without time zone, e.g. `4:05 PM`
|
|
316
|
-
* @param dateTimeUtc A UTC date time string
|
|
314
|
+
/**
|
|
315
|
+
* Returns a time string without time zone, e.g. `4:05 PM`
|
|
316
|
+
* @param dateTimeUtc A UTC date time string
|
|
317
317
|
*/
|
|
318
318
|
function getFormattedNumberedTimeWithoutZone(dateTimeUtc) {
|
|
319
319
|
return applyFormat(dateTimeUtc, 'h:mm\u00a0A');
|
|
320
320
|
}
|
|
321
321
|
|
|
322
|
-
/**
|
|
323
|
-
* Returns a time string without time zone, in 24 hr time, e.g. `16:05`
|
|
324
|
-
* @param dateTimeUtc A UTC date time string
|
|
322
|
+
/**
|
|
323
|
+
* Returns a time string without time zone, in 24 hr time, e.g. `16:05`
|
|
324
|
+
* @param dateTimeUtc A UTC date time string
|
|
325
325
|
*/
|
|
326
326
|
function getFormattedNumberedTimeWithoutZoneOrMeridian(dateTimeUtc) {
|
|
327
327
|
return applyFormat(dateTimeUtc, 'HH:mm');
|
|
328
328
|
}
|
|
329
329
|
|
|
330
|
-
/**
|
|
331
|
-
* Returns a full formatted time zone string for the given `timeZoneId`.
|
|
332
|
-
*
|
|
333
|
-
* Combines all possible abbreviations for the zone and the timeZoneId, e.g. `EST/EDT`, `PST/PDT (America/Los Angeles)` or `CST (Asia/Taipei)`
|
|
334
|
-
*
|
|
335
|
-
* If abbreviations are not alpha characters, e.g. `-04`, then only the timeZoneId is returned.
|
|
336
|
-
*
|
|
337
|
-
* @param timeZoneId (optional) A time zone Id. Defaults to the current time zone id, using `guessTimeZoneId()`.
|
|
338
|
-
* @param showEasternZoneId (optional) Whether or not to include the timeZoneId in the result for EST/EDT. Defaults to `false`.
|
|
339
|
-
* @param nowUtc (optional) The current time, "now", as an ISO date string.
|
|
330
|
+
/**
|
|
331
|
+
* Returns a full formatted time zone string for the given `timeZoneId`.
|
|
332
|
+
*
|
|
333
|
+
* Combines all possible abbreviations for the zone and the timeZoneId, e.g. `EST/EDT`, `PST/PDT (America/Los Angeles)` or `CST (Asia/Taipei)`
|
|
334
|
+
*
|
|
335
|
+
* If abbreviations are not alpha characters, e.g. `-04`, then only the timeZoneId is returned.
|
|
336
|
+
*
|
|
337
|
+
* @param timeZoneId (optional) A time zone Id. Defaults to the current time zone id, using `guessTimeZoneId()`.
|
|
338
|
+
* @param showEasternZoneId (optional) Whether or not to include the timeZoneId in the result for EST/EDT. Defaults to `false`.
|
|
339
|
+
* @param nowUtc (optional) The current time, "now", as an ISO date string.
|
|
340
340
|
*/
|
|
341
341
|
function getFullFormattedTimeZone() {
|
|
342
342
|
let timeZoneId = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : (0, _timezone.guessTimeZoneId)();
|
|
@@ -365,19 +365,19 @@ function getFullFormattedTimeZone() {
|
|
|
365
365
|
`${abbreviationsString} (${readableZoneId})`;
|
|
366
366
|
}
|
|
367
367
|
|
|
368
|
-
/**
|
|
369
|
-
* Returns the basic time zone abbreviation for the given date, e.g. `EDT`.
|
|
370
|
-
*
|
|
371
|
-
* @param dateTimeUtc The date to format.
|
|
368
|
+
/**
|
|
369
|
+
* Returns the basic time zone abbreviation for the given date, e.g. `EDT`.
|
|
370
|
+
*
|
|
371
|
+
* @param dateTimeUtc The date to format.
|
|
372
372
|
*/
|
|
373
373
|
function getFormattedTimeZone(dateTimeUtc) {
|
|
374
374
|
return applyFormat(dateTimeUtc, 'z');
|
|
375
375
|
}
|
|
376
376
|
|
|
377
|
-
/**
|
|
378
|
-
* Formats a date using the given format. Parses the date as UTC, then converts to the current time zone, then formats.
|
|
379
|
-
* @param {*} dateTimeUtc The date to format. Any valid input for `moment.utc(...)`
|
|
380
|
-
* @param {*} format The format to use
|
|
377
|
+
/**
|
|
378
|
+
* Formats a date using the given format. Parses the date as UTC, then converts to the current time zone, then formats.
|
|
379
|
+
* @param {*} dateTimeUtc The date to format. Any valid input for `moment.utc(...)`
|
|
380
|
+
* @param {*} format The format to use
|
|
381
381
|
*/
|
|
382
382
|
function applyFormat(dateTimeUtc, format) {
|
|
383
383
|
let timeZoneId = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : (0, _timezone.guessTimeZoneId)();
|
|
@@ -398,4 +398,4 @@ const isTimeInputSupported = exports.isTimeInputSupported = isInputTypeSupported
|
|
|
398
398
|
function isDateTimeValid(dateTime) {
|
|
399
399
|
return !!dateTime && (0, _momentTimezone.default)(dateTime).isValid();
|
|
400
400
|
}
|
|
401
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbW9tZW50VGltZXpvbmUiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9tb21lbnRUaW1lem9uZVV0aWxzIiwiX3RpbWV6b25lIiwiY2xvY2tPZmZzZXQiLCJzZXRDbG9ja09mZnNldCIsIm9mZnNldCIsImV4cG9ydHMiLCJnZXRTZXJ2ZXJOb3dVdGMiLCJEYXRlIiwibm93IiwiZ2V0T2Zmc2V0RGF0ZSIsImRhdGUiLCJnZXRUaW1lIiwiZ2V0Wm9uZWRNb21lbnRGcm9tVXRjIiwiZGF0ZVRpbWVVdGMiLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJ1bmRlZmluZWQiLCJ0b0lTT1N0cmluZyIsInRpbWVab25lSWQiLCJndWVzc1RpbWVab25lSWQiLCJtb21lbnQiLCJ1dGMiLCJ0eiIsImdldFpvbmVkTW9tZW50RnJvbVV0Y0luRGVmYXVsdFpvbmUiLCJnZXREZWZhdWx0VGltZVpvbmVJZCIsImdldFpvbmVkTW9tZW50RnJvbUxvY2FsRGF0ZVRpbWUiLCJsb2NhbERhdGVUaW1lIiwibG9jYWxNb21lbnQiLCJ6b25lZE1vbWVudCIsInllYXIiLCJtb250aCIsImhvdXIiLCJtaW51dGUiLCJzZWNvbmQiLCJtaWxsaXNlY29uZCIsImdldExvY2FsTW9tZW50RnJvbVV0YyIsImdldExvY2FsRGF0ZVRpbWVGcm9tVXRjIiwidG9EYXRlIiwiZ2V0RGF0ZU1pbnVzVGltZSIsImRhdGVUaW1lIiwiZ2V0RnVsbFllYXIiLCJnZXRNb250aCIsImdldERhdGUiLCJnZXRFbmRPZkRheSIsInN0YXJ0T2YiLCJhZGQiLCJzdWJ0cmFjdCIsImdldEVuZE9mTWludXRlIiwiaXNOb3dFcXVhbE9yQWZ0ZXJEYXRlIiwibm93VXRjIiwiYWRqdXN0ZWREYXRlVGltZU1vbWVudCIsImN1cnJlbnRNb21lbnQiLCJpc1NhbWVPckFmdGVyIiwiaXNOb3dFcXVhbE9yQmVmb3JlRGF0ZSIsImlzU2FtZU9yQmVmb3JlIiwiaXNOb3dBZnRlckRhdGUiLCJpc05vd0JlZm9yZURhdGUiLCJnZXRGb3JtYXR0ZWRGdWxsRGF0ZUFuZFRpbWUiLCJ3aXRoVGltZVpvbmUiLCJhcHBseUZvcm1hdCIsImdldEZvcm1hdHRlZEZ1bGxEYXRlV2l0aFdlZWsiLCJnZXRGb3JtYXR0ZWROdW1iZXJlZERhdGVBbmRUaW1lIiwiZ2V0Rm9ybWF0dGVkTnVtYmVyZWREYXRlQW5kVGltZVdpdGhvdXRZZWFyIiwiZ2V0Rm9ybWF0dGVkU2ltcGxpZmllZERhdGUiLCJnZXRGb3JtYXR0ZWRTaW1wbGlmaWVkRGF0ZVdpdGhvdXRZZWFyIiwiZ2V0Rm9ybWF0dGVkU2ltcGxpZmllZERhdGVXaXRoWWVhcklmTm90Q3VycmVudCIsIm5vd1V0Y01vbWVudCIsImRhdGVUaW1lTW9tZW50IiwiTWF0aCIsImFicyIsImdldEZvcm1hdHRlZE51bWJlcmVkRGF0ZSIsImdldEZvcm1hdHRlZE51bWJlcmVkRGF0ZVdpdGhGdWxsWWVhciIsImdldEZvcm1hdHRlZE51bWJlcmVkRGF0ZUZvcklucHV0IiwiZ2V0Rm9ybWF0dGVkTnVtYmVyZWREYXRlV2l0aG91dFllYXIiLCJnZXRGb3JtYXR0ZWROdW1iZXJlZFRpbWUiLCJnZXRGb3JtYXR0ZWROdW1iZXJlZFRpbWVXaXRoRnVsbFpvbmUiLCJzaG93RWFzdGVyblpvbmVJZCIsInRpbWUiLCJ0aW1lem9uZUFiYnJldmlhdGlvbiIsInpvbmVBYmJyIiwicmVwbGFjZSIsImdldEZvcm1hdHRlZE51bWJlcmVkVGltZVdpdGhvdXRab25lIiwiZ2V0Rm9ybWF0dGVkTnVtYmVyZWRUaW1lV2l0aG91dFpvbmVPck1lcmlkaWFuIiwiZ2V0RnVsbEZvcm1hdHRlZFRpbWVab25lIiwiem9uZSIsImZpbHRlcmVkWm9uZSIsIm1vbWVudFV0aWxzIiwiZmlsdGVyWWVhcnMiLCJhYmJyZXZpYXRpb25zIiwiYWJicnMiLCJmaWx0ZXIiLCJhYmJyIiwidGVzdCIsInJlZHVjZSIsInVuaXF1ZUFiYnJzIiwiaW5jbHVkZXMiLCJwdXNoIiwiYWJicmV2aWF0aW9uc1N0cmluZyIsImpvaW4iLCJyZWFkYWJsZVpvbmVJZCIsImdldEZvcm1hdHRlZFRpbWVab25lIiwiZm9ybWF0IiwiaXNJbnB1dFR5cGVTdXBwb3J0ZWQiLCJ0eXBlIiwiZG9jdW1lbnQiLCJjcmVhdGVFbGVtZW50IiwiaXNTdXBwb3J0ZWQiLCJpc0RhdGVJbnB1dFN1cHBvcnRlZCIsImlzVGltZUlucHV0U3VwcG9ydGVkIiwiaXNEYXRlVGltZVZhbGlkIiwiaXNWYWxpZCJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9kYXRlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBtb21lbnQgZnJvbSAnbW9tZW50LXRpbWV6b25lJ1xyXG5pbXBvcnQgbW9tZW50VXRpbHMgZnJvbSAnbW9tZW50LXRpbWV6b25lL21vbWVudC10aW1lem9uZS11dGlscydcclxuaW1wb3J0IHsgZ2V0RGVmYXVsdFRpbWVab25lSWQsIGd1ZXNzVGltZVpvbmVJZCB9IGZyb20gJy4vdGltZXpvbmUnXHJcblxyXG4vKipcclxuICogVGhpcyB2YWx1ZSBpcyB1c2VkIGJ5IHRpbWUtc2Vuc2l0aXZlIGZ1bmN0aW9ucyBpbiB0aGlzIG1vZHVsZSBhbmQgb3RoZXIgZGF0ZS90aW1lIHV0aWxzLiBBbnkgdGltZVxyXG4gKiBhIG5ldyBEYXRlIG9iamVjdCBpcyBjb25zdHJ1Y3RlZCwgaXQgd2lsbCB1c2UgdGhpcyB2YWx1ZSB0byBhZGp1c3QgdGhlIHRpbWUgYnkgdGhpcyBvZmZzZXQgKHRvXHJcbiAqIG1ha2UgaXQgY29uc2lzdGVudCB3aXRoIGEga25vd24gdGltZSlcclxuICovXHJcbmxldCBjbG9ja09mZnNldCA9IDBcclxuXHJcbi8qKlxyXG4gKiBXaGVuIGEgR3JvdXBBc3Nlc3NtZW50IGNvbWVzIGluIHRoZSBkb29yLCBpdCBpbmNsdWRlcyB0aGUgY3VycmVudCBVVEMgZGF0ZXRpbWUuIFRoaXMgbWV0aG9kIGlzXHJcbiAqIHVzZWQgdG8gdXBkYXRlIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIChhY2N1cmF0ZSkgc2VydmVyIHRpbWUgYW5kIHRoZSBicm93c2VyIHRpbWVcclxuICovXHJcbmV4cG9ydCBjb25zdCBzZXRDbG9ja09mZnNldCA9IGZ1bmN0aW9uIChvZmZzZXQ6IG51bWJlcikge1xyXG5cdGNsb2NrT2Zmc2V0ID0gb2Zmc2V0XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBHZXQgdGhlIGN1cnJlbnQgVVRDIHRpbWUsIGNhbGlicmF0ZWQgdG8gdGhlIEFQSSBzZXJ2ZXIncyBjbG9ja1xyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGdldFNlcnZlck5vd1V0YyA9IGZ1bmN0aW9uICgpIHtcclxuXHRyZXR1cm4gbmV3IERhdGUoRGF0ZS5ub3coKSArIGNsb2NrT2Zmc2V0KVxyXG59XHJcblxyXG4vKipcclxuICogUmV0dXJuIHRoZSBwcm92aWRlZCBkYXRlLCBvZmZzZXQgYnkgdGhlIGNsb2NrT2Zmc2V0XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgZ2V0T2Zmc2V0RGF0ZSA9IChkYXRlOiBEYXRlKSA9PiB7XHJcblx0cmV0dXJuIG5ldyBEYXRlKGRhdGUuZ2V0VGltZSgpICsgY2xvY2tPZmZzZXQpXHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBnZXRab25lZE1vbWVudEZyb21VdGMgPSAoXHJcblx0ZGF0ZVRpbWVVdGMgPSBnZXRTZXJ2ZXJOb3dVdGMoKS50b0lTT1N0cmluZygpLFxyXG5cdHRpbWVab25lSWQgPSBndWVzc1RpbWVab25lSWQoKVxyXG4pID0+IHtcclxuXHRyZXR1cm4gbW9tZW50LnV0YyhkYXRlVGltZVV0YykudHoodGltZVpvbmVJZClcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IGdldFpvbmVkTW9tZW50RnJvbVV0Y0luRGVmYXVsdFpvbmUgPSAoZGF0ZVRpbWVVdGMgPSBnZXRTZXJ2ZXJOb3dVdGMoKS50b0lTT1N0cmluZygpKSA9PiB7XHJcblx0Y29uc3QgdGltZVpvbmVJZCA9IGdldERlZmF1bHRUaW1lWm9uZUlkKClcclxuXHRyZXR1cm4gZ2V0Wm9uZWRNb21lbnRGcm9tVXRjKGRhdGVUaW1lVXRjLCB0aW1lWm9uZUlkKVxyXG59XHJcblxyXG5leHBvcnQgY29uc3QgZ2V0Wm9uZWRNb21lbnRGcm9tTG9jYWxEYXRlVGltZSA9IChsb2NhbERhdGVUaW1lOiBEYXRlIHwgc3RyaW5nLCB0aW1lWm9uZUlkID0gZ3Vlc3NUaW1lWm9uZUlkKCkpID0+IHtcclxuXHRjb25zdCBsb2NhbE1vbWVudCA9IG1vbWVudChsb2NhbERhdGVUaW1lKVxyXG5cdGNvbnN0IHpvbmVkTW9tZW50ID0gbW9tZW50LnR6KFxyXG5cdFx0W1xyXG5cdFx0XHRsb2NhbE1vbWVudC55ZWFyKCksXHJcblx0XHRcdGxvY2FsTW9tZW50Lm1vbnRoKCksXHJcblx0XHRcdGxvY2FsTW9tZW50LmRhdGUoKSxcclxuXHRcdFx0bG9jYWxNb21lbnQuaG91cigpLFxyXG5cdFx0XHRsb2NhbE1vbWVudC5taW51dGUoKSxcclxuXHRcdFx0bG9jYWxNb21lbnQuc2Vjb25kKCksXHJcblx0XHRcdGxvY2FsTW9tZW50Lm1pbGxpc2Vjb25kKClcclxuXHRcdF0sXHJcblx0XHR0aW1lWm9uZUlkXHJcblx0KVxyXG5cdHJldHVybiB6b25lZE1vbWVudFxyXG59XHJcblxyXG5leHBvcnQgY29uc3QgZ2V0TG9jYWxNb21lbnRGcm9tVXRjID0gKFxyXG5cdGRhdGVUaW1lVXRjID0gZ2V0U2VydmVyTm93VXRjKCkudG9JU09TdHJpbmcoKSxcclxuXHR0aW1lWm9uZUlkID0gZ3Vlc3NUaW1lWm9uZUlkKClcclxuKSA9PiB7XHJcblx0Y29uc3Qgem9uZWRNb21lbnQgPSBnZXRab25lZE1vbWVudEZyb21VdGMoZGF0ZVRpbWVVdGMsIHRpbWVab25lSWQpXHJcblx0Y29uc3QgbG9jYWxNb21lbnQgPSBtb21lbnQoW1xyXG5cdFx0em9uZWRNb21lbnQueWVhcigpLFxyXG5cdFx0em9uZWRNb21lbnQubW9udGgoKSxcclxuXHRcdHpvbmVkTW9tZW50LmRhdGUoKSxcclxuXHRcdHpvbmVkTW9tZW50LmhvdXIoKSxcclxuXHRcdHpvbmVkTW9tZW50Lm1pbnV0ZSgpLFxyXG5cdFx0em9uZWRNb21lbnQuc2Vjb25kKCksXHJcblx0XHR6b25lZE1vbWVudC5taWxsaXNlY29uZCgpXHJcblx0XSlcclxuXHRyZXR1cm4gbG9jYWxNb21lbnRcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IGdldExvY2FsRGF0ZVRpbWVGcm9tVXRjID0gKGRhdGVUaW1lVXRjOiBzdHJpbmcpID0+IHtcclxuXHRyZXR1cm4gZ2V0TG9jYWxNb21lbnRGcm9tVXRjKGRhdGVUaW1lVXRjKS50b0RhdGUoKVxyXG59XHJcblxyXG5leHBvcnQgY29uc3QgZ2V0RGF0ZU1pbnVzVGltZSA9IChkYXRlVGltZTogRGF0ZSkgPT4ge1xyXG5cdHJldHVybiBuZXcgRGF0ZShkYXRlVGltZS5nZXRGdWxsWWVhcigpLCBkYXRlVGltZS5nZXRNb250aCgpLCBkYXRlVGltZS5nZXREYXRlKCkpXHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRFbmRPZkRheShkYXRlVGltZVV0Yzogc3RyaW5nKSB7XHJcblx0cmV0dXJuIG1vbWVudChkYXRlVGltZVV0YylcclxuXHRcdC5zdGFydE9mKCdkYXknKVxyXG5cdFx0LmFkZCgxLCAnZGF5cycpXHJcblx0XHQuc3VidHJhY3QoMywgJ21pbGxpc2Vjb25kcycpIC8vIG11c3QgYmUgbWludXMgMyBmb3IgU1FMIGRhdGVcclxuXHRcdC50b0RhdGUoKVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0RW5kT2ZNaW51dGUoZGF0ZVRpbWVVdGM6IHN0cmluZykge1xyXG5cdHJldHVybiBtb21lbnQoZGF0ZVRpbWVVdGMpXHJcblx0XHQuc3RhcnRPZignbWludXRlJylcclxuXHRcdC5hZGQoMSwgJ21pbnV0ZScpXHJcblx0XHQuc3VidHJhY3QoMywgJ21pbGxpc2Vjb25kcycpIC8vIG11c3QgYmUgbWludXMgMyBmb3IgU1FMIGRhdGVcclxuXHRcdC50b0RhdGUoKVxyXG59XHJcblxyXG4vKipcclxuICogSXMgdGhlIGN1cnJlbnQgdGltZSwgXCJub3dcIiwgKiphZnRlciBvciBlcXVhbCB0byoqIHRoZSBnaXZlbiBkYXRlLlxyXG4gKlxyXG4gKiBAcGFyYW0gZGF0ZVRpbWVVdGMgVGhlIGRhdGUgdG8gY29tcGFyZSB0aGUgY3VycmVudCB0aW1lLCBcIm5vd1wiLCBhcyBhbiBJU08gZGF0ZSBzdHJpbmcuXHJcbiAqIEBwYXJhbSBub3dVdGMgT3B0aW9uYWwuIFRoZSBjdXJyZW50IHRpbWUsIFwibm93XCIsIGFzIGFuIElTTyBkYXRlIHN0cmluZy5cclxuICpcclxuICogQHJldHVybnMgV2hldGhlciBvciBub3QgXCJub3dcIiBpcyAqKmFmdGVyIG9yIGVxdWFsIHRvKiogYGRhdGVUaW1lVXRjYFxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGlzTm93RXF1YWxPckFmdGVyRGF0ZShkYXRlVGltZVV0Yz86IHN0cmluZywgbm93VXRjID0gZ2V0U2VydmVyTm93VXRjKCkudG9JU09TdHJpbmcoKSkge1xyXG5cdGlmICghZGF0ZVRpbWVVdGMpIHtcclxuXHRcdHJldHVybiBmYWxzZVxyXG5cdH1cclxuXHRjb25zdCBhZGp1c3RlZERhdGVUaW1lTW9tZW50ID0gZ2V0TG9jYWxNb21lbnRGcm9tVXRjKGRhdGVUaW1lVXRjKVxyXG5cdGNvbnN0IGN1cnJlbnRNb21lbnQgPSBnZXRMb2NhbE1vbWVudEZyb21VdGMobm93VXRjKVxyXG5cdHJldHVybiBjdXJyZW50TW9tZW50LmlzU2FtZU9yQWZ0ZXIoYWRqdXN0ZWREYXRlVGltZU1vbWVudClcclxufVxyXG5cclxuLyoqXHJcbiAqIElzIHRoZSBjdXJyZW50IHRpbWUsIFwibm93XCIsICoqYmVmb3JlIG9yIGVxdWFsIHRvKiogdGhlIGdpdmVuIGRhdGUuXHJcbiAqXHJcbiAqIEBwYXJhbSBkYXRlVGltZVV0YyBUaGUgZGF0ZSB0byBjb21wYXJlIHRoZSBjdXJyZW50IHRpbWUsIFwibm93XCIsIGFzIGFuIElTTyBkYXRlIHN0cmluZy5cclxuICogQHBhcmFtIG5vd1V0YyBPcHRpb25hbC4gVGhlIGN1cnJlbnQgdGltZSwgXCJub3dcIiwgYXMgYW4gSVNPIGRhdGUgc3RyaW5nLlxyXG4gKlxyXG4gKiBAcmV0dXJucyBXaGV0aGVyIG9yIG5vdCBcIm5vd1wiIGlzICoqYmVmb3JlIG9yIGVxdWFsIHRvKiogYGRhdGVUaW1lVXRjYC5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBpc05vd0VxdWFsT3JCZWZvcmVEYXRlKGRhdGVUaW1lVXRjPzogc3RyaW5nLCBub3dVdGMgPSBnZXRTZXJ2ZXJOb3dVdGMoKS50b0lTT1N0cmluZygpKSB7XHJcblx0aWYgKCFkYXRlVGltZVV0Yykge1xyXG5cdFx0cmV0dXJuIGZhbHNlXHJcblx0fVxyXG5cdGNvbnN0IGFkanVzdGVkRGF0ZVRpbWVNb21lbnQgPSBnZXRMb2NhbE1vbWVudEZyb21VdGMoZGF0ZVRpbWVVdGMpXHJcblx0Y29uc3QgY3VycmVudE1vbWVudCA9IGdldExvY2FsTW9tZW50RnJvbVV0Yyhub3dVdGMpXHJcblx0cmV0dXJuIGN1cnJlbnRNb21lbnQuaXNTYW1lT3JCZWZvcmUoYWRqdXN0ZWREYXRlVGltZU1vbWVudClcclxufVxyXG5cclxuLyoqXHJcbiAqIElzIHRoZSBjdXJyZW50IHRpbWUsIFwibm93XCIsICoqYWZ0ZXIqKiB0aGUgZ2l2ZW4gZGF0ZS5cclxuICpcclxuICogQHBhcmFtIGRhdGVUaW1lVXRjIFRoZSBkYXRlIHRvIGNvbXBhcmUgdGhlIGN1cnJlbnQgdGltZSwgXCJub3dcIiwgYXMgYW4gSVNPIGRhdGUgc3RyaW5nLlxyXG4gKiBAcGFyYW0gbm93VXRjIE9wdGlvbmFsLiBUaGUgY3VycmVudCB0aW1lLCBcIm5vd1wiLCBhcyBhbiBJU08gZGF0ZSBzdHJpbmcuXHJcbiAqXHJcbiAqIEByZXR1cm5zIFdoZXRoZXIgb3Igbm90IFwibm93XCIgaXMgKiphZnRlcioqIGBkYXRlVGltZVV0Y2AuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gaXNOb3dBZnRlckRhdGUoZGF0ZVRpbWVVdGM/OiBzdHJpbmcsIG5vd1V0YyA9IGdldFNlcnZlck5vd1V0YygpLnRvSVNPU3RyaW5nKCkpIHtcclxuXHRpZiAoIWRhdGVUaW1lVXRjKSB7XHJcblx0XHRyZXR1cm4gZmFsc2VcclxuXHR9XHJcblx0Y29uc3QgYWRqdXN0ZWREYXRlVGltZU1vbWVudCA9IGdldExvY2FsTW9tZW50RnJvbVV0YyhkYXRlVGltZVV0YylcclxuXHRjb25zdCBjdXJyZW50TW9tZW50ID0gZ2V0TG9jYWxNb21lbnRGcm9tVXRjKG5vd1V0YylcclxuXHRyZXR1cm4gY3VycmVudE1vbWVudCA+IGFkanVzdGVkRGF0ZVRpbWVNb21lbnRcclxufVxyXG5cclxuLyoqXHJcbiAqIElzIHRoZSBjdXJyZW50IHRpbWUsIFwibm93XCIsICoqYmVmb3JlKiogdGhlIGdpdmVuIGRhdGUuXHJcbiAqXHJcbiAqIEBwYXJhbSBkYXRlVGltZVV0YyBUaGUgZGF0ZSB0byBjb21wYXJlIHRoZSBjdXJyZW50IHRpbWUsIFwibm93XCIsIGFzIGFuIElTTyBkYXRlIHN0cmluZy5cclxuICogQHBhcmFtIG5vd1V0YyBPcHRpb25hbC4gVGhlIGN1cnJlbnQgdGltZSwgXCJub3dcIiwgYXMgYW4gSVNPIGRhdGUgc3RyaW5nLlxyXG4gKlxyXG4gKiBAcmV0dXJucyBXaGV0aGVyIG9yIG5vdCBcIm5vd1wiIGlzICoqYmVmb3JlKiogYGRhdGVUaW1lVXRjYC5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBpc05vd0JlZm9yZURhdGUoZGF0ZVRpbWVVdGM/OiBzdHJpbmcsIG5vd1V0YyA9IGdldFNlcnZlck5vd1V0YygpLnRvSVNPU3RyaW5nKCkpIHtcclxuXHRpZiAoIWRhdGVUaW1lVXRjKSB7XHJcblx0XHRyZXR1cm4gZmFsc2VcclxuXHR9XHJcblx0Y29uc3QgYWRqdXN0ZWREYXRlVGltZU1vbWVudCA9IGdldExvY2FsTW9tZW50RnJvbVV0YyhkYXRlVGltZVV0YylcclxuXHRjb25zdCBjdXJyZW50TW9tZW50ID0gZ2V0TG9jYWxNb21lbnRGcm9tVXRjKG5vd1V0YylcclxuXHRyZXR1cm4gY3VycmVudE1vbWVudCA8IGFkanVzdGVkRGF0ZVRpbWVNb21lbnRcclxufVxyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgYSBkYXRlIGFuZCB0aW1lIHN0cmluZyB3aXRoIGZ1bGwgZGF0ZSwgZS5nLiBgTWFyY2ggNSwgMjAxOCBAIDQ6MDUgUE0gRURUYFxyXG4gKiBAcGFyYW0gZGF0ZVRpbWVVdGMgQSBVVEMgZGF0ZSB0aW1lIHN0cmluZ1xyXG4gKiBAcGFyYW0gd2l0aFRpbWVab25lIChvcHRpb25hbCkgV2hldGhlciB0byBpbmNsdWRlIHRoZSB0aW1lIHpvbmUgYWJicmV2aWF0aW9uLiBEZWZhdWx0cyB0byBgdHJ1ZWAuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZ2V0Rm9ybWF0dGVkRnVsbERhdGVBbmRUaW1lKGRhdGVUaW1lVXRjOiBzdHJpbmcsIHdpdGhUaW1lWm9uZSA9IHRydWUpIHtcclxuXHRyZXR1cm4gYXBwbHlGb3JtYXQoZGF0ZVRpbWVVdGMsIGBNTU1NIEQsIFlZWVkgQCBoOm1tXFx1MDBhMEEke3dpdGhUaW1lWm9uZSA/ICcgeicgOiAnJ31gKVxyXG59XHJcblxyXG4vKipcclxuICogUmV0dXJucyBhIGRhdGUgYW5kIHRpbWUgc3RyaW5nIHdpdGggZGF5IG9mIHdlZWsgYW5kIEFtZXJpY2FuIHNsYXNoIGRhdGVzLCBlLmcuIGBNb24sIDMvNS8yMDE4IEAgNDowNSBQTSBFRFRgXHJcbiAqIEBwYXJhbSBkYXRlVGltZVV0YyBBIFVUQyBkYXRlIHRpbWUgc3RyaW5nXHJcbiAqIEBwYXJhbSB3aXRoVGltZVpvbmUgKG9wdGlvbmFsKSBXaGV0aGVyIHRvIGluY2x1ZGUgdGhlIHRpbWUgem9uZSBhYmJyZXZpYXRpb24uIERlZmF1bHRzIHRvIGB0cnVlYC5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRGb3JtYXR0ZWRGdWxsRGF0ZVdpdGhXZWVrKGRhdGVUaW1lVXRjOiBzdHJpbmcsIHdpdGhUaW1lWm9uZSA9IHRydWUpIHtcclxuXHRyZXR1cm4gYXBwbHlGb3JtYXQoZGF0ZVRpbWVVdGMsIGBkZGQsIE0vRC9ZWVlZIEAgaDptbVxcdTAwYTBBJHt3aXRoVGltZVpvbmUgPyAnIHonIDogJyd9YClcclxufVxyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgYSBkYXRlIGFuZCB0aW1lIHN0cmluZyB3aXRoIEFtZXJpY2FuIHNsYXNoIGRhdGVzLCBhbmQgbm8gbGVhZGluZyB6ZXJvZXMsIGUuZy4gYDMvNS8xOCA0OjA1IFBNIEVEVGBcclxuICogQHBhcmFtIGRhdGVUaW1lVXRjIEEgVVRDIGRhdGUgdGltZSBzdHJpbmdcclxuICogQHBhcmFtIHdpdGhUaW1lWm9uZSAob3B0aW9uYWwpIFdoZXRoZXIgdG8gaW5jbHVkZSB0aGUgdGltZSB6b25lIGFiYnJldmlhdGlvbi4gRGVmYXVsdHMgdG8gYHRydWVgLlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGdldEZvcm1hdHRlZE51bWJlcmVkRGF0ZUFuZFRpbWUoZGF0ZVRpbWVVdGM6IHN0cmluZywgd2l0aFRpbWVab25lID0gdHJ1ZSkge1xyXG5cdHJldHVybiBhcHBseUZvcm1hdChkYXRlVGltZVV0YywgYE0vRC9ZWSBoOm1tXFx1MDBhMEEke3dpdGhUaW1lWm9uZSA/ICcgeicgOiAnJ31gKVxyXG59XHJcblxyXG4vKipcclxuICogUmV0dXJucyBhIGRhdGUgYW5kIHRpbWUgc3RyaW5nIHdpdGggQW1lcmljYW4gc2xhc2ggZGF0ZXMsIG5vIGxlYWRpbmcgemVyb2VzLCBhbmQgbm8geWVhciwgZS5nLiBgMy81IDQ6MDUgUE0gRURUYFxyXG4gKiBAcGFyYW0gZGF0ZVRpbWVVdGMgQSBVVEMgZGF0ZSB0aW1lIHN0cmluZ1xyXG4gKiBAcGFyYW0gd2l0aFRpbWVab25lIChvcHRpb25hbCkgV2hldGhlciB0byBpbmNsdWRlIHRoZSB0aW1lIHpvbmUgYWJicmV2aWF0aW9uLiBEZWZhdWx0cyB0byBgdHJ1ZWAuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZ2V0Rm9ybWF0dGVkTnVtYmVyZWREYXRlQW5kVGltZVdpdGhvdXRZZWFyKGRhdGVUaW1lVXRjOiBzdHJpbmcsIHdpdGhUaW1lWm9uZSA9IHRydWUpIHtcclxuXHRyZXR1cm4gYXBwbHlGb3JtYXQoZGF0ZVRpbWVVdGMsIGBNL0QgaDptbVxcdTAwYTBBJHt3aXRoVGltZVpvbmUgPyAnIHonIDogJyd9YClcclxufVxyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgYSBkYXRlIHN0cmluZyB3aXRoIHNob3J0IG1vbnRoIGFuZCBmdWxsIHllYXIsIGUuZy4gYE1hciA1LCAyMDE4YFxyXG4gKiBAcGFyYW0gZGF0ZVRpbWVVdGMgQSBVVEMgZGF0ZSB0aW1lIHN0cmluZ1xyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGdldEZvcm1hdHRlZFNpbXBsaWZpZWREYXRlKGRhdGVUaW1lVXRjOiBzdHJpbmcpIHtcclxuXHRyZXR1cm4gYXBwbHlGb3JtYXQoZGF0ZVRpbWVVdGMsICdNTU0gRCwgWVlZWScpXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5zIGEgZGF0ZSBzdHJpbmcgd2l0aCBzaG9ydCBtb250aCBhbmQgbm8geWVhciwgZS5nLiBgTWFyIDVgXHJcbiAqIEBwYXJhbSBkYXRlVGltZVV0YyBBIFVUQyBkYXRlIHRpbWUgc3RyaW5nXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZ2V0Rm9ybWF0dGVkU2ltcGxpZmllZERhdGVXaXRob3V0WWVhcihkYXRlVGltZVV0Yzogc3RyaW5nKSB7XHJcblx0cmV0dXJuIGFwcGx5Rm9ybWF0KGRhdGVUaW1lVXRjLCAnTU1NIEQnKVxyXG59XHJcblxyXG4vKipcclxuICogUmV0dXJucyBhIGRhdGUgc3RyaW5nIGFzIGVpdGhlciAnTU1NIEQsIFlZWVknIG9yICdNTU0gRCcgaWYgdGhlIGRhdGUncyB5ZWFyIGlzIHRoZSBzYW1lIGFzIHRoZSBjdXJyZW50IHllYXJcclxuICogQHBhcmFtIGRhdGVUaW1lVXRjIEEgVVRDIGRhdGUgdGltZSBzdHJpbmdcclxuICogQHBhcmFtIG5vd1V0YyAob3B0aW9uYWwpIEEgVVRDIGRhdGUgdGltZSBzdHJpbmcgb2YgXCJub3dcIi4gVXNlZCBmb3IgdGVzdGluZy5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRGb3JtYXR0ZWRTaW1wbGlmaWVkRGF0ZVdpdGhZZWFySWZOb3RDdXJyZW50KFxyXG5cdGRhdGVUaW1lVXRjOiBzdHJpbmcsXHJcblx0bm93VXRjID0gZ2V0U2VydmVyTm93VXRjKCkudG9JU09TdHJpbmcoKVxyXG4pIHtcclxuXHRjb25zdCBub3dVdGNNb21lbnQgPSBtb21lbnQobm93VXRjKVxyXG5cdGNvbnN0IGRhdGVUaW1lTW9tZW50ID0gbW9tZW50KGRhdGVUaW1lVXRjKVxyXG5cdHJldHVybiBNYXRoLmFicyhub3dVdGNNb21lbnQueWVhcigpIC0gZGF0ZVRpbWVNb21lbnQueWVhcigpKSA9PT0gMFxyXG5cdFx0PyBnZXRGb3JtYXR0ZWRTaW1wbGlmaWVkRGF0ZVdpdGhvdXRZZWFyKGRhdGVUaW1lVXRjKVxyXG5cdFx0OiBnZXRGb3JtYXR0ZWRTaW1wbGlmaWVkRGF0ZShkYXRlVGltZVV0YylcclxufVxyXG5cclxuLyoqXHJcbiAqIFJldHVybnMgYSBkYXRlIHN0cmluZyB3aXRoIEFtZXJpY2FuIHNsYXNoIGRhdGVzLCBubyBsZWFkaW5nIHplcm9lcywgYW5kIHNob3J0IHllYXIsIGUuZy4gYDMvNS8xOGBcclxuICogQHBhcmFtIGRhdGVUaW1lVXRjIEEgVVRDIGRhdGUgdGltZSBzdHJpbmdcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRGb3JtYXR0ZWROdW1iZXJlZERhdGUoZGF0ZVRpbWVVdGM6IHN0cmluZykge1xyXG5cdHJldHVybiBhcHBseUZvcm1hdChkYXRlVGltZVV0YywgJ00vRC9ZWScpXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5zIGEgZGF0ZSBzdHJpbmcgd2l0aCBBbWVyaWNhbiBzbGFzaCBkYXRlcywgbm8gbGVhZGluZyB6ZXJvZXMsIGFuZCBmdWxsIHllYXIsIGUuZy4gYDMvNS8yMDE4YFxyXG4gKiBAcGFyYW0gZGF0ZVRpbWVVdGMgQSBVVEMgZGF0ZSB0aW1lIHN0cmluZ1xyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGdldEZvcm1hdHRlZE51bWJlcmVkRGF0ZVdpdGhGdWxsWWVhcihkYXRlVGltZVV0Yzogc3RyaW5nKSB7XHJcblx0cmV0dXJuIGFwcGx5Rm9ybWF0KGRhdGVUaW1lVXRjLCAnTS9EL1lZWVknKVxyXG59XHJcblxyXG4vKipcclxuICogUmV0dXJucyBhIGRhdGUgc3RyaW5nIGZvciB1c2UgaW4gSFRNTCBpbnB1dHMsIGUuZy4gYDIwMTgtMDMtMDVgXHJcbiAqIEBwYXJhbSBkYXRlVGltZVV0YyBBIFVUQyBkYXRlIHRpbWUgc3RyaW5nXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZ2V0Rm9ybWF0dGVkTnVtYmVyZWREYXRlRm9ySW5wdXQoZGF0ZVRpbWVVdGM6IHN0cmluZykge1xyXG5cdHJldHVybiBhcHBseUZvcm1hdChkYXRlVGltZVV0YywgJ1lZWVktTU0tREQnKVxyXG59XHJcblxyXG4vKipcclxuICogUmV0dXJucyBhIGRhdGUgc3RyaW5nIHdpdGggQW1lcmljYW4gc2xhc2ggZGF0ZXMgYW5kIG5vIHllYXIgYW5kIG5vIGxlYWRpbmcgemVyb2VzLCBlLmcuIGAzLzVgXHJcbiAqIEBwYXJhbSBkYXRlVGltZVV0YyBBIFVUQyBkYXRlIHRpbWUgc3RyaW5nXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZ2V0Rm9ybWF0dGVkTnVtYmVyZWREYXRlV2l0aG91dFllYXIoZGF0ZVRpbWVVdGM6IHN0cmluZykge1xyXG5cdHJldHVybiBhcHBseUZvcm1hdChkYXRlVGltZVV0YywgJ00vRCcpXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5zIGEgdGltZSBzdHJpbmcsIGUuZy4gYDQ6MDUgUE0gRURUYFxyXG4gKiBAcGFyYW0gZGF0ZVRpbWVVdGMgQSBVVEMgZGF0ZSB0aW1lIHN0cmluZ1xyXG4gKiBAcGFyYW0gd2l0aFRpbWVab25lIChvcHRpb25hbCkgV2hldGhlciB0byBpbmNsdWRlIHRoZSB0aW1lIHpvbmUgYWJicmV2aWF0aW9uLiBEZWZhdWx0cyB0byBgdHJ1ZWAuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZ2V0Rm9ybWF0dGVkTnVtYmVyZWRUaW1lKGRhdGVUaW1lVXRjOiBzdHJpbmcsIHdpdGhUaW1lWm9uZSA9IHRydWUpIHtcclxuXHRyZXR1cm4gYXBwbHlGb3JtYXQoZGF0ZVRpbWVVdGMsIGBoOm1tXFx1MDBhMEEke3dpdGhUaW1lWm9uZSA/ICcgeicgOiAnJ31gKVxyXG59XHJcblxyXG4vKipcclxuICogUmV0dXJucyBhIHRpbWUgc3RyaW5nIHdpdGggcG9zc2libHkgZnVsbCB0aW1lIHpvbmUgbmFtZSwgZS5nLiBgNDowNSBQTSBFRFRgIG9yIGA0OjA1IFBNIENTVCAoQXNpYS9UYWlwZWkpYFxyXG4gKiBAcGFyYW0gZGF0ZVRpbWVVdGMgQSBVVEMgZGF0ZSB0aW1lIHN0cmluZ1xyXG4gKiBAcGFyYW0gc2hvd0Vhc3Rlcm5ab25lSWQgKG9wdGlvbmFsKSBXaGV0aGVyIG9yIG5vdCB0byBpbmNsdWRlIHRoZSB0aW1lWm9uZUlkIGluIHRoZSByZXN1bHQgZm9yIEVTVC9FRFQuIERlZmF1bHRzIHRvIGBmYWxzZWAuXHJcbiAqIEBwYXJhbSB0aW1lWm9uZUlkIChvcHRpb25hbCkgQSB0aW1lIHpvbmUgSWQuIERlZmF1bHRzIHRvIHRoZSBjdXJyZW50IHRpbWUgem9uZSBpZCwgdXNpbmcgYGd1ZXNzVGltZVpvbmVJZCgpYC5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRGb3JtYXR0ZWROdW1iZXJlZFRpbWVXaXRoRnVsbFpvbmUoXHJcblx0ZGF0ZVRpbWVVdGM6IHN0cmluZyxcclxuXHRzaG93RWFzdGVyblpvbmVJZCA9IGZhbHNlLFxyXG5cdHRpbWVab25lSWQgPSBndWVzc1RpbWVab25lSWQoKVxyXG4pIHtcclxuXHRjb25zdCB6b25lZE1vbWVudCA9IGdldFpvbmVkTW9tZW50RnJvbVV0YyhkYXRlVGltZVV0YywgdGltZVpvbmVJZClcclxuXHRjb25zdCB0aW1lID0gYXBwbHlGb3JtYXQoZGF0ZVRpbWVVdGMsICdoOm1tXFx1MDBhMEEnLCB0aW1lWm9uZUlkKVxyXG5cdGNvbnN0IHRpbWV6b25lQWJicmV2aWF0aW9uID0gem9uZWRNb21lbnQuem9uZUFiYnIoKVxyXG5cdHJldHVybiAodGltZXpvbmVBYmJyZXZpYXRpb24gPT09ICdFRFQnIHx8IHRpbWV6b25lQWJicmV2aWF0aW9uID09PSAnRVNUJykgJiYgIXNob3dFYXN0ZXJuWm9uZUlkXHJcblx0XHQ/IC8vIERvbid0IHNob3cgdGhlIGZ1bGwgem9uZSBuYW1lIGlmIGluIEVEVCBvciBFU1QsIHVubGVzcyB0b2xkIHRvXHJcblx0XHRcdGAke3RpbWV9ICR7dGltZXpvbmVBYmJyZXZpYXRpb259YFxyXG5cdFx0OiAvLyBJZiBub3QgRURUIG9yIEVTVCwgc2hvdyB0aGUgem9uZSBuYW1lLCByZXBsYWNpbmcgdW5kZXJzY29yZXMgd2l0aCBzcGFjZXNcclxuXHRcdFx0Ly8gRXg6IFwiQXNpYS9UYWlwZWlcIlxyXG5cdFx0XHRgJHt0aW1lfSAke3RpbWV6b25lQWJicmV2aWF0aW9ufSAoJHt0aW1lWm9uZUlkLnJlcGxhY2UoJ18nLCAnICcpfSlgXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5zIGEgdGltZSBzdHJpbmcgd2l0aG91dCB0aW1lIHpvbmUsIGUuZy4gYDQ6MDUgUE1gXHJcbiAqIEBwYXJhbSBkYXRlVGltZVV0YyBBIFVUQyBkYXRlIHRpbWUgc3RyaW5nXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZ2V0Rm9ybWF0dGVkTnVtYmVyZWRUaW1lV2l0aG91dFpvbmUoZGF0ZVRpbWVVdGM6IHN0cmluZykge1xyXG5cdHJldHVybiBhcHBseUZvcm1hdChkYXRlVGltZVV0YywgJ2g6bW1cXHUwMGEwQScpXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5zIGEgdGltZSBzdHJpbmcgd2l0aG91dCB0aW1lIHpvbmUsIGluIDI0IGhyIHRpbWUsIGUuZy4gYDE2OjA1YFxyXG4gKiBAcGFyYW0gZGF0ZVRpbWVVdGMgQSBVVEMgZGF0ZSB0aW1lIHN0cmluZ1xyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGdldEZvcm1hdHRlZE51bWJlcmVkVGltZVdpdGhvdXRab25lT3JNZXJpZGlhbihkYXRlVGltZVV0Yzogc3RyaW5nKSB7XHJcblx0cmV0dXJuIGFwcGx5Rm9ybWF0KGRhdGVUaW1lVXRjLCAnSEg6bW0nKVxyXG59XHJcblxyXG4vKipcclxuICogUmV0dXJucyBhIGZ1bGwgZm9ybWF0dGVkIHRpbWUgem9uZSBzdHJpbmcgZm9yIHRoZSBnaXZlbiBgdGltZVpvbmVJZGAuXHJcbiAqXHJcbiAqIENvbWJpbmVzIGFsbCBwb3NzaWJsZSBhYmJyZXZpYXRpb25zIGZvciB0aGUgem9uZSBhbmQgdGhlIHRpbWVab25lSWQsIGUuZy4gYEVTVC9FRFRgLCBgUFNUL1BEVCAoQW1lcmljYS9Mb3MgQW5nZWxlcylgIG9yIGBDU1QgKEFzaWEvVGFpcGVpKWBcclxuICpcclxuICogSWYgYWJicmV2aWF0aW9ucyBhcmUgbm90IGFscGhhIGNoYXJhY3RlcnMsIGUuZy4gYC0wNGAsIHRoZW4gb25seSB0aGUgdGltZVpvbmVJZCBpcyByZXR1cm5lZC5cclxuICpcclxuICogQHBhcmFtIHRpbWVab25lSWQgKG9wdGlvbmFsKSBBIHRpbWUgem9uZSBJZC4gRGVmYXVsdHMgdG8gdGhlIGN1cnJlbnQgdGltZSB6b25lIGlkLCB1c2luZyBgZ3Vlc3NUaW1lWm9uZUlkKClgLlxyXG4gKiBAcGFyYW0gc2hvd0Vhc3Rlcm5ab25lSWQgKG9wdGlvbmFsKSBXaGV0aGVyIG9yIG5vdCB0byBpbmNsdWRlIHRoZSB0aW1lWm9uZUlkIGluIHRoZSByZXN1bHQgZm9yIEVTVC9FRFQuIERlZmF1bHRzIHRvIGBmYWxzZWAuXHJcbiAqIEBwYXJhbSBub3dVdGMgKG9wdGlvbmFsKSBUaGUgY3VycmVudCB0aW1lLCBcIm5vd1wiLCBhcyBhbiBJU08gZGF0ZSBzdHJpbmcuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZ2V0RnVsbEZvcm1hdHRlZFRpbWVab25lKFxyXG5cdHRpbWVab25lSWQgPSBndWVzc1RpbWVab25lSWQoKSxcclxuXHRzaG93RWFzdGVyblpvbmVJZCA9IGZhbHNlLFxyXG5cdG5vd1V0YyA9IGdldFNlcnZlck5vd1V0YygpLnRvSVNPU3RyaW5nKClcclxuKSB7XHJcblx0Y29uc3Qgem9uZSA9IG1vbWVudC50ei56b25lKHRpbWVab25lSWQpXHJcblx0aWYgKCF6b25lKSByZXR1cm4gJydcclxuXHJcblx0Y29uc3Qgem9uZWRNb21lbnQgPSBnZXRab25lZE1vbWVudEZyb21VdGMobm93VXRjLCB0aW1lWm9uZUlkKVxyXG5cdC8vIGZpbHRlciB0aGUgem9uZSBkYXRhIGRvd24gdG8ganVzdCByZWNlbnQgeWVhcnMsIGluc3RlYWQgb2YgdGhlIGRlZmF1bHQgb2YgMTkwMCB0byAyMDM4XHJcblx0Y29uc3QgZmlsdGVyZWRab25lID0gbW9tZW50VXRpbHMudHouZmlsdGVyWWVhcnMoem9uZSwgem9uZWRNb21lbnQueWVhcigpIC0gMSwgem9uZWRNb21lbnQueWVhcigpICsgMSlcclxuXHQvLyBmaW5kIGFsbCB1bmlxdWUgYWJicmV2aWF0aW9ucyBmb3IgdGhlIHpvbmUsIGNvbWJpbmVkIGludG8gYSBzdHJpbmdcclxuXHRjb25zdCBhYmJyZXZpYXRpb25zID0gZmlsdGVyZWRab25lLmFiYnJzXHJcblx0XHQvLyBmaWx0ZXIgb3V0IG5vbi1hbHBoYSBhYmJyZXZpYXRpb25zXHJcblx0XHQuZmlsdGVyKGFiYnIgPT4gL1thLXpBLVpdKy9nLnRlc3QoYWJicikpXHJcblx0XHQucmVkdWNlKCh1bmlxdWVBYmJyczogc3RyaW5nW10sIGFiYnIpID0+IHtcclxuXHRcdFx0aWYgKCF1bmlxdWVBYmJycy5pbmNsdWRlcyhhYmJyKSkge1xyXG5cdFx0XHRcdHVuaXF1ZUFiYnJzLnB1c2goYWJicilcclxuXHRcdFx0fVxyXG5cdFx0XHRyZXR1cm4gdW5pcXVlQWJicnNcclxuXHRcdH0sIFtdKVxyXG5cdGNvbnN0IGFiYnJldmlhdGlvbnNTdHJpbmcgPSBhYmJyZXZpYXRpb25zLmxlbmd0aCA+IDAgPyBhYmJyZXZpYXRpb25zLmpvaW4oJy8nKSA6IG51bGxcclxuXHRjb25zdCByZWFkYWJsZVpvbmVJZCA9IHRpbWVab25lSWQucmVwbGFjZSgnXycsICcgJylcclxuXHRyZXR1cm4gIWFiYnJldmlhdGlvbnNTdHJpbmdcclxuXHRcdD8gcmVhZGFibGVab25lSWRcclxuXHRcdDogYWJicmV2aWF0aW9uc1N0cmluZyA9PT0gJ0VTVC9FRFQnICYmICFzaG93RWFzdGVyblpvbmVJZFxyXG5cdFx0XHQ/IC8vIERvbid0IHNob3cgdGhlIHpvbmVJZCBpZiBpbiBFYXN0ZXJuLCB1bmxlc3MgdG9sZCB0b1xyXG5cdFx0XHRcdGFiYnJldmlhdGlvbnNTdHJpbmdcclxuXHRcdFx0OiAvLyBTaG93IHRoZSBjb21iaW5lZCBhYmJyZXZpYXRpb25zIHBsdXMgdGhlIGZyaWVuZGx5IHpvbmVJZFxyXG5cdFx0XHRcdGAke2FiYnJldmlhdGlvbnNTdHJpbmd9ICgke3JlYWRhYmxlWm9uZUlkfSlgXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBSZXR1cm5zIHRoZSBiYXNpYyB0aW1lIHpvbmUgYWJicmV2aWF0aW9uIGZvciB0aGUgZ2l2ZW4gZGF0ZSwgZS5nLiBgRURUYC5cclxuICpcclxuICogQHBhcmFtIGRhdGVUaW1lVXRjIFRoZSBkYXRlIHRvIGZvcm1hdC5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRGb3JtYXR0ZWRUaW1lWm9uZShkYXRlVGltZVV0Yzogc3RyaW5nKSB7XHJcblx0cmV0dXJuIGFwcGx5Rm9ybWF0KGRhdGVUaW1lVXRjLCAneicpXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBGb3JtYXRzIGEgZGF0ZSB1c2luZyB0aGUgZ2l2ZW4gZm9ybWF0LiBQYXJzZXMgdGhlIGRhdGUgYXMgVVRDLCB0aGVuIGNvbnZlcnRzIHRvIHRoZSBjdXJyZW50IHRpbWUgem9uZSwgdGhlbiBmb3JtYXRzLlxyXG4gKiBAcGFyYW0geyp9IGRhdGVUaW1lVXRjIFRoZSBkYXRlIHRvIGZvcm1hdC4gQW55IHZhbGlkIGlucHV0IGZvciBgbW9tZW50LnV0YyguLi4pYFxyXG4gKiBAcGFyYW0geyp9IGZvcm1hdCBUaGUgZm9ybWF0IHRvIHVzZVxyXG4gKi9cclxuZnVuY3Rpb24gYXBwbHlGb3JtYXQoZGF0ZVRpbWVVdGM6IHN0cmluZywgZm9ybWF0OiBzdHJpbmcsIHRpbWVab25lSWQgPSBndWVzc1RpbWVab25lSWQoKSkge1xyXG5cdHJldHVybiBnZXRab25lZE1vbWVudEZyb21VdGMoZGF0ZVRpbWVVdGMsIHRpbWVab25lSWQpLmZvcm1hdChmb3JtYXQpXHJcbn1cclxuXHJcbmNvbnN0IGlzSW5wdXRUeXBlU3VwcG9ydGVkID0gKHR5cGU6IHN0cmluZykgPT4ge1xyXG5cdHRyeSB7XHJcblx0XHRjb25zdCB0ZXN0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKVxyXG5cdFx0dGVzdC50eXBlID0gdHlwZVxyXG5cdFx0Y29uc3QgaXNTdXBwb3J0ZWQgPSB0ZXN0LnR5cGUgPT09IHR5cGVcclxuXHRcdHJldHVybiBpc1N1cHBvcnRlZFxyXG5cdH0gY2F0Y2gge1xyXG5cdFx0cmV0dXJuIGZhbHNlXHJcblx0fVxyXG59XHJcblxyXG5leHBvcnQgY29uc3QgaXNEYXRlSW5wdXRTdXBwb3J0ZWQgPSBpc0lucHV0VHlwZVN1cHBvcnRlZCgnZGF0ZScpXHJcblxyXG5leHBvcnQgY29uc3QgaXNUaW1lSW5wdXRTdXBwb3J0ZWQgPSBpc0lucHV0VHlwZVN1cHBvcnRlZCgndGltZScpXHJcblxyXG5leHBvcnQgZnVuY3Rpb24gaXNEYXRlVGltZVZhbGlkKGRhdGVUaW1lOiBzdHJpbmcgfCBEYXRlKSB7XHJcblx0cmV0dXJuICEhZGF0ZVRpbWUgJiYgbW9tZW50KGRhdGVUaW1lKS5pc1ZhbGlkKClcclxufVxyXG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLElBQUFBLGVBQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLG9CQUFBLEdBQUFGLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBRSxTQUFBLEdBQUFGLE9BQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSUcsV0FBVyxHQUFHLENBQUM7O0FBRW5CO0FBQ0E7QUFDQTtBQUNBO0FBQ08sTUFBTUMsY0FBYyxHQUFHLFNBQUFBLENBQVVDLE1BQWMsRUFBRTtFQUN2REYsV0FBVyxHQUFHRSxNQUFNO0FBQ3JCLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBRkFDLE9BQUEsQ0FBQUYsY0FBQSxHQUFBQSxjQUFBO0FBR08sTUFBTUcsZUFBZSxHQUFHLFNBQUFBLENBQUEsRUFBWTtFQUMxQyxPQUFPLElBQUlDLElBQUksQ0FBQ0EsSUFBSSxDQUFDQyxHQUFHLENBQUMsQ0FBQyxHQUFHTixXQUFXLENBQUM7QUFDMUMsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFGQUcsT0FBQSxDQUFBQyxlQUFBLEdBQUFBLGVBQUE7QUFHTyxNQUFNRyxhQUFhLEdBQUlDLElBQVUsSUFBSztFQUM1QyxPQUFPLElBQUlILElBQUksQ0FBQ0csSUFBSSxDQUFDQyxPQUFPLENBQUMsQ0FBQyxHQUFHVCxXQUFXLENBQUM7QUFDOUMsQ0FBQztBQUFBRyxPQUFBLENBQUFJLGFBQUEsR0FBQUEsYUFBQTtBQUVNLE1BQU1HLHFCQUFxQixHQUFHLFNBQUFBLENBQUEsRUFHaEM7RUFBQSxJQUZKQyxXQUFXLEdBQUFDLFNBQUEsQ0FBQUMsTUFBQSxRQUFBRCxTQUFBLFFBQUFFLFNBQUEsR0FBQUYsU0FBQSxNQUFHUixlQUFlLENBQUMsQ0FBQyxDQUFDVyxXQUFXLENBQUMsQ0FBQztFQUFBLElBQzdDQyxVQUFVLEdBQUFKLFNBQUEsQ0FBQUMsTUFBQSxRQUFBRCxTQUFBLFFBQUFFLFNBQUEsR0FBQUYsU0FBQSxNQUFHLElBQUFLLHlCQUFlLEVBQUMsQ0FBQztFQUU5QixPQUFPQyx1QkFBTSxDQUFDQyxHQUFHLENBQUNSLFdBQVcsQ0FBQyxDQUFDUyxFQUFFLENBQUNKLFVBQVUsQ0FBQztBQUM5QyxDQUFDO0FBQUFiLE9BQUEsQ0FBQU8scUJBQUEsR0FBQUEscUJBQUE7QUFFTSxNQUFNVyxrQ0FBa0MsR0FBRyxTQUFBQSxDQUFBLEVBQW1EO0VBQUEsSUFBbERWLFdBQVcsR0FBQUMsU0FBQSxDQUFBQyxNQUFBLFFBQUFELFNBQUEsUUFBQUUsU0FBQSxHQUFBRixTQUFBLE1BQUdSLGVBQWUsQ0FBQyxDQUFDLENBQUNXLFdBQVcsQ0FBQyxDQUFDO0VBQy9GLE1BQU1DLFVBQVUsR0FBRyxJQUFBTSw4QkFBb0IsRUFBQyxDQUFDO0VBQ3pDLE9BQU9aLHFCQUFxQixDQUFDQyxXQUFXLEVBQUVLLFVBQVUsQ0FBQztBQUN0RCxDQUFDO0FBQUFiLE9BQUEsQ0FBQWtCLGtDQUFBLEdBQUFBLGtDQUFBO0FBRU0sTUFBTUUsK0JBQStCLEdBQUcsU0FBQUEsQ0FBQ0MsYUFBNEIsRUFBcUM7RUFBQSxJQUFuQ1IsVUFBVSxHQUFBSixTQUFBLENBQUFDLE1BQUEsUUFBQUQsU0FBQSxRQUFBRSxTQUFBLEdBQUFGLFNBQUEsTUFBRyxJQUFBSyx5QkFBZSxFQUFDLENBQUM7RUFDM0csTUFBTVEsV0FBVyxHQUFHLElBQUFQLHVCQUFNLEVBQUNNLGFBQWEsQ0FBQztFQUN6QyxNQUFNRSxXQUFXLEdBQUdSLHVCQUFNLENBQUNFLEVBQUUsQ0FDNUIsQ0FDQ0ssV0FBVyxDQUFDRSxJQUFJLENBQUMsQ0FBQyxFQUNsQkYsV0FBVyxDQUFDRyxLQUFLLENBQUMsQ0FBQyxFQUNuQkgsV0FBVyxDQUFDakIsSUFBSSxDQUFDLENBQUMsRUFDbEJpQixXQUFXLENBQUNJLElBQUksQ0FBQyxDQUFDLEVBQ2xCSixXQUFXLENBQUNLLE1BQU0sQ0FBQyxDQUFDLEVBQ3BCTCxXQUFXLENBQUNNLE1BQU0sQ0FBQyxDQUFDLEVBQ3BCTixXQUFXLENBQUNPLFdBQVcsQ0FBQyxDQUFDLENBQ3pCLEVBQ0RoQixVQUNELENBQUM7RUFDRCxPQUFPVSxXQUFXO0FBQ25CLENBQUM7QUFBQXZCLE9BQUEsQ0FBQW9CLCtCQUFBLEdBQUFBLCtCQUFBO0FBRU0sTUFBTVUscUJBQXFCLEdBQUcsU0FBQUEsQ0FBQSxFQUdoQztFQUFBLElBRkp0QixXQUFXLEdBQUFDLFNBQUEsQ0FBQUMsTUFBQSxRQUFBRCxTQUFBLFFBQUFFLFNBQUEsR0FBQUYsU0FBQSxNQUFHUixlQUFlLENBQUMsQ0FBQyxDQUFDVyxXQUFXLENBQUMsQ0FBQztFQUFBLElBQzdDQyxVQUFVLEdBQUFKLFNBQUEsQ0FBQUMsTUFBQSxRQUFBRCxTQUFBLFFBQUFFLFNBQUEsR0FBQUYsU0FBQSxNQUFHLElBQUFLLHlCQUFlLEVBQUMsQ0FBQztFQUU5QixNQUFNUyxXQUFXLEdBQUdoQixxQkFBcUIsQ0FBQ0MsV0FBVyxFQUFFSyxVQUFVLENBQUM7RUFDbEUsTUFBTVMsV0FBVyxHQUFHLElBQUFQLHVCQUFNLEVBQUMsQ0FDMUJRLFdBQVcsQ0FBQ0MsSUFBSSxDQUFDLENBQUMsRUFDbEJELFdBQVcsQ0FBQ0UsS0FBSyxDQUFDLENBQUMsRUFDbkJGLFdBQVcsQ0FBQ2xCLElBQUksQ0FBQyxDQUFDLEVBQ2xCa0IsV0FBVyxDQUFDRyxJQUFJLENBQUMsQ0FBQyxFQUNsQkgsV0FBVyxDQUFDSSxNQUFNLENBQUMsQ0FBQyxFQUNwQkosV0FBVyxDQUFDSyxNQUFNLENBQUMsQ0FBQyxFQUNwQkwsV0FBVyxDQUFDTSxXQUFXLENBQUMsQ0FBQyxDQUN6QixDQUFDO0VBQ0YsT0FBT1AsV0FBVztBQUNuQixDQUFDO0FBQUF0QixPQUFBLENBQUE4QixxQkFBQSxHQUFBQSxxQkFBQTtBQUVNLE1BQU1DLHVCQUF1QixHQUFJdkIsV0FBbUIsSUFBSztFQUMvRCxPQUFPc0IscUJBQXFCLENBQUN0QixXQUFXLENBQUMsQ0FBQ3dCLE1BQU0sQ0FBQyxDQUFDO0FBQ25ELENBQUM7QUFBQWhDLE9BQUEsQ0FBQStCLHVCQUFBLEdBQUFBLHVCQUFBO0FBRU0sTUFBTUUsZ0JBQWdCLEdBQUlDLFFBQWMsSUFBSztFQUNuRCxPQUFPLElBQUloQyxJQUFJLENBQUNnQyxRQUFRLENBQUNDLFdBQVcsQ0FBQyxDQUFDLEVBQUVELFFBQVEsQ0FBQ0UsUUFBUSxDQUFDLENBQUMsRUFBRUYsUUFBUSxDQUFDRyxPQUFPLENBQUMsQ0FBQyxDQUFDO0FBQ2pGLENBQUM7QUFBQXJDLE9BQUEsQ0FBQWlDLGdCQUFBLEdBQUFBLGdCQUFBO0FBRU0sU0FBU0ssV0FBV0EsQ0FBQzlCLFdBQW1CLEVBQUU7RUFDaEQsT0FBTyxJQUFBTyx1QkFBTSxFQUFDUCxXQUFXLENBQUMsQ0FDeEIrQixPQUFPLENBQUMsS0FBSyxDQUFDLENBQ2RDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQ2RDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsY0FBYyxDQUFDLENBQUM7RUFBQSxDQUM1QlQsTUFBTSxDQUFDLENBQUM7QUFDWDtBQUVPLFNBQVNVLGNBQWNBLENBQUNsQyxXQUFtQixFQUFFO0VBQ25ELE9BQU8sSUFBQU8sdUJBQU0sRUFBQ1AsV0FBVyxDQUFDLENBQ3hCK0IsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUNqQkMsR0FBRyxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FDaEJDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsY0FBYyxDQUFDLENBQUM7RUFBQSxDQUM1QlQsTUFBTSxDQUFDLENBQUM7QUFDWDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU1cscUJBQXFCQSxDQUFDbkMsV0FBb0IsRUFBNEM7RUFBQSxJQUExQ29DLE1BQU0sR0FBQW5DLFNBQUEsQ0FBQUMsTUFBQSxRQUFBRCxTQUFBLFFBQUFFLFNBQUEsR0FBQUYsU0FBQSxNQUFHUixlQUFlLENBQUMsQ0FBQyxDQUFDVyxXQUFXLENBQUMsQ0FBQztFQUNuRyxJQUFJLENBQUNKLFdBQVcsRUFBRTtJQUNqQixPQUFPLEtBQUs7RUFDYjtFQUNBLE1BQU1xQyxzQkFBc0IsR0FBR2YscUJBQXFCLENBQUN0QixXQUFXLENBQUM7RUFDakUsTUFBTXNDLGFBQWEsR0FBR2hCLHFCQUFxQixDQUFDYyxNQUFNLENBQUM7RUFDbkQsT0FBT0UsYUFBYSxDQUFDQyxhQUFhLENBQUNGLHNCQUFzQixDQUFDO0FBQzNEOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTRyxzQkFBc0JBLENBQUN4QyxXQUFvQixFQUE0QztFQUFBLElBQTFDb0MsTUFBTSxHQUFBbkMsU0FBQSxDQUFBQyxNQUFBLFFBQUFELFNBQUEsUUFBQUUsU0FBQSxHQUFBRixTQUFBLE1BQUdSLGVBQWUsQ0FBQyxDQUFDLENBQUNXLFdBQVcsQ0FBQyxDQUFDO0VBQ3BHLElBQUksQ0FBQ0osV0FBVyxFQUFFO0lBQ2pCLE9BQU8sS0FBSztFQUNiO0VBQ0EsTUFBTXFDLHNCQUFzQixHQUFHZixxQkFBcUIsQ0FBQ3RCLFdBQVcsQ0FBQztFQUNqRSxNQUFNc0MsYUFBYSxHQUFHaEIscUJBQXFCLENBQUNjLE1BQU0sQ0FBQztFQUNuRCxPQUFPRSxhQUFhLENBQUNHLGNBQWMsQ0FBQ0osc0JBQXNCLENBQUM7QUFDNUQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNLLGNBQWNBLENBQUMxQyxXQUFvQixFQUE0QztFQUFBLElBQTFDb0MsTUFBTSxHQUFBbkMsU0FBQSxDQUFBQyxNQUFBLFFBQUFELFNBQUEsUUFBQUUsU0FBQSxHQUFBRixTQUFBLE1BQUdSLGVBQWUsQ0FBQyxDQUFDLENBQUNXLFdBQVcsQ0FBQyxDQUFDO0VBQzVGLElBQUksQ0FBQ0osV0FBVyxFQUFFO0lBQ2pCLE9BQU8sS0FBSztFQUNiO0VBQ0EsTUFBTXFDLHNCQUFzQixHQUFHZixxQkFBcUIsQ0FBQ3RCLFdBQVcsQ0FBQztFQUNqRSxNQUFNc0MsYUFBYSxHQUFHaEIscUJBQXFCLENBQUNjLE1BQU0sQ0FBQztFQUNuRCxPQUFPRSxhQUFhLEdBQUdELHNCQUFzQjtBQUM5Qzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU00sZUFBZUEsQ0FBQzNDLFdBQW9CLEVBQTRDO0VBQUEsSUFBMUNvQyxNQUFNLEdBQUFuQyxTQUFBLENBQUFDLE1BQUEsUUFBQUQsU0FBQSxRQUFBRSxTQUFBLEdBQUFGLFNBQUEsTUFBR1IsZUFBZSxDQUFDLENBQUMsQ0FBQ1csV0FBVyxDQUFDLENBQUM7RUFDN0YsSUFBSSxDQUFDSixXQUFXLEVBQUU7SUFDakIsT0FBTyxLQUFLO0VBQ2I7RUFDQSxNQUFNcUMsc0JBQXNCLEdBQUdmLHFCQUFxQixDQUFDdEIsV0FBVyxDQUFDO0VBQ2pFLE1BQU1zQyxhQUFhLEdBQUdoQixxQkFBcUIsQ0FBQ2MsTUFBTSxDQUFDO0VBQ25ELE9BQU9FLGFBQWEsR0FBR0Qsc0JBQXNCO0FBQzlDOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTTywyQkFBMkJBLENBQUM1QyxXQUFtQixFQUF1QjtFQUFBLElBQXJCNkMsWUFBWSxHQUFBNUMsU0FBQSxDQUFBQyxNQUFBLFFBQUFELFNBQUEsUUFBQUUsU0FBQSxHQUFBRixTQUFBLE1BQUcsSUFBSTtFQUNuRixPQUFPNkMsV0FBVyxDQUFDOUMsV0FBVyxFQUFFLDZCQUE2QjZDLFlBQVksR0FBRyxJQUFJLEdBQUcsRUFBRSxFQUFFLENBQUM7QUFDekY7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNFLDRCQUE0QkEsQ0FBQy9DLFdBQW1CLEVBQXVCO0VBQUEsSUFBckI2QyxZQUFZLEdBQUE1QyxTQUFBLENBQUFDLE1BQUEsUUFBQUQsU0FBQSxRQUFBRSxTQUFBLEdBQUFGLFNBQUEsTUFBRyxJQUFJO0VBQ3BGLE9BQU82QyxXQUFXLENBQUM5QyxXQUFXLEVBQUUsOEJBQThCNkMsWUFBWSxHQUFHLElBQUksR0FBRyxFQUFFLEVBQUUsQ0FBQztBQUMxRjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0csK0JBQStCQSxDQUFDaEQsV0FBbUIsRUFBdUI7RUFBQSxJQUFyQjZDLFlBQVksR0FBQTVDLFNBQUEsQ0FBQUMsTUFBQSxRQUFBRCxTQUFBLFFBQUFFLFNBQUEsR0FBQUYsU0FBQSxNQUFHLElBQUk7RUFDdkYsT0FBTzZDLFdBQVcsQ0FBQzlDLFdBQVcsRUFBRSxxQkFBcUI2QyxZQUFZLEdBQUcsSUFBSSxHQUFHLEVBQUUsRUFBRSxDQUFDO0FBQ2pGOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTSSwwQ0FBMENBLENBQUNqRCxXQUFtQixFQUF1QjtFQUFBLElBQXJCNkMsWUFBWSxHQUFBNUMsU0FBQSxDQUFBQyxNQUFBLFFBQUFELFNBQUEsUUFBQUUsU0FBQSxHQUFBRixTQUFBLE1BQUcsSUFBSTtFQUNsRyxPQUFPNkMsV0FBVyxDQUFDOUMsV0FBVyxFQUFFLGtCQUFrQjZDLFlBQVksR0FBRyxJQUFJLEdBQUcsRUFBRSxFQUFFLENBQUM7QUFDOUU7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTSywwQkFBMEJBLENBQUNsRCxXQUFtQixFQUFFO0VBQy9ELE9BQU84QyxXQUFXLENBQUM5QyxXQUFXLEVBQUUsYUFBYSxDQUFDO0FBQy9DOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU21ELHFDQUFxQ0EsQ0FBQ25ELFdBQW1CLEVBQUU7RUFDMUUsT0FBTzhDLFdBQVcsQ0FBQzlDLFdBQVcsRUFBRSxPQUFPLENBQUM7QUFDekM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNvRCw4Q0FBOENBLENBQzdEcEQsV0FBbUIsRUFFbEI7RUFBQSxJQUREb0MsTUFBTSxHQUFBbkMsU0FBQSxDQUFBQyxNQUFBLFFBQUFELFNBQUEsUUFBQUUsU0FBQSxHQUFBRixTQUFBLE1BQUdSLGVBQWUsQ0FBQyxDQUFDLENBQUNXLFdBQVcsQ0FBQyxDQUFDO0VBRXhDLE1BQU1pRCxZQUFZLEdBQUcsSUFBQTlDLHVCQUFNLEVBQUM2QixNQUFNLENBQUM7RUFDbkMsTUFBTWtCLGNBQWMsR0FBRyxJQUFBL0MsdUJBQU0sRUFBQ1AsV0FBVyxDQUFDO0VBQzFDLE9BQU91RCxJQUFJLENBQUNDLEdBQUcsQ0FBQ0gsWUFBWSxDQUFDckMsSUFBSSxDQUFDLENBQUMsR0FBR3NDLGNBQWMsQ0FBQ3RDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQy9EbUMscUNBQXFDLENBQUNuRCxXQUFXLENBQUMsR0FDbERrRCwwQkFBMEIsQ0FBQ2xELFdBQVcsQ0FBQztBQUMzQzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVN5RCx3QkFBd0JBLENBQUN6RCxXQUFtQixFQUFFO0VBQzdELE9BQU84QyxXQUFXLENBQUM5QyxXQUFXLEVBQUUsUUFBUSxDQUFDO0FBQzFDOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUzBELG9DQUFvQ0EsQ0FBQzFELFdBQW1CLEVBQUU7RUFDekUsT0FBTzhDLFdBQVcsQ0FBQzlDLFdBQVcsRUFBRSxVQUFVLENBQUM7QUFDNUM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTMkQsZ0NBQWdDQSxDQUFDM0QsV0FBbUIsRUFBRTtFQUNyRSxPQUFPOEMsV0FBVyxDQUFDOUMsV0FBVyxFQUFFLFlBQVksQ0FBQztBQUM5Qzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVM0RCxtQ0FBbUNBLENBQUM1RCxXQUFtQixFQUFFO0VBQ3hFLE9BQU84QyxXQUFXLENBQUM5QyxXQUFXLEVBQUUsS0FBSyxDQUFDO0FBQ3ZDOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTNkQsd0JBQXdCQSxDQUFDN0QsV0FBbUIsRUFBdUI7RUFBQSxJQUFyQjZDLFlBQVksR0FBQTVDLFNBQUEsQ0FBQUMsTUFBQSxRQUFBRCxTQUFBLFFBQUFFLFNBQUEsR0FBQUYsU0FBQSxNQUFHLElBQUk7RUFDaEYsT0FBTzZDLFdBQVcsQ0FBQzlDLFdBQVcsRUFBRSxjQUFjNkMsWUFBWSxHQUFHLElBQUksR0FBRyxFQUFFLEVBQUUsQ0FBQztBQUMxRTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTaUIsb0NBQW9DQSxDQUNuRDlELFdBQW1CLEVBR2xCO0VBQUEsSUFGRCtELGlCQUFpQixHQUFBOUQsU0FBQSxDQUFBQyxNQUFBLFFBQUFELFNBQUEsUUFBQUUsU0FBQSxHQUFBRixTQUFBLE1BQUcsS0FBSztFQUFBLElBQ3pCSSxVQUFVLEdBQUFKLFNBQUEsQ0FBQUMsTUFBQSxRQUFBRCxTQUFBLFFBQUFFLFNBQUEsR0FBQUYsU0FBQSxNQUFHLElBQUFLLHlCQUFlLEVBQUMsQ0FBQztFQUU5QixNQUFNUyxXQUFXLEdBQUdoQixxQkFBcUIsQ0FBQ0MsV0FBVyxFQUFFSyxVQUFVLENBQUM7RUFDbEUsTUFBTTJELElBQUksR0FBR2xCLFdBQVcsQ0FBQzlDLFdBQVcsRUFBRSxhQUFhLEVBQUVLLFVBQVUsQ0FBQztFQUNoRSxNQUFNNEQsb0JBQW9CLEdBQUdsRCxXQUFXLENBQUNtRCxRQUFRLENBQUMsQ0FBQztFQUNuRCxPQUFPLENBQUNELG9CQUFvQixLQUFLLEtBQUssSUFBSUEsb0JBQW9CLEtBQUssS0FBSyxLQUFLLENBQUNGLGlCQUFpQjtFQUM1RjtFQUNELEdBQUdDLElBQUksSUFBSUMsb0JBQW9CLEVBQUU7RUFDaEM7RUFDRDtFQUNBLEdBQUdELElBQUksSUFBSUMsb0JBQW9CLEtBQUs1RCxVQUFVLENBQUM4RCxPQUFPLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHO0FBQ3RFOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0MsbUNBQW1DQSxDQUFDcEUsV0FBbUIsRUFBRTtFQUN4RSxPQUFPOEMsV0FBVyxDQUFDOUMsV0FBVyxFQUFFLGFBQWEsQ0FBQztBQUMvQzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLFNBQVNxRSw2Q0FBNkNBLENBQUNyRSxXQUFtQixFQUFFO0VBQ2xGLE9BQU84QyxXQUFXLENBQUM5QyxXQUFXLEVBQUUsT0FBTyxDQUFDO0FBQ3pDOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTc0Usd0JBQXdCQSxDQUFBLEVBSXRDO0VBQUEsSUFIRGpFLFVBQVUsR0FBQUosU0FBQSxDQUFBQyxNQUFBLFFBQUFELFNBQUEsUUFBQUUsU0FBQSxHQUFBRixTQUFBLE1BQUcsSUFBQUsseUJBQWUsRUFBQyxDQUFDO0VBQUEsSUFDOUJ5RCxpQkFBaUIsR0FBQTlELFNBQUEsQ0FBQUMsTUFBQSxRQUFBRCxTQUFBLFFBQUFFLFNBQUEsR0FBQUYsU0FBQSxNQUFHLEtBQUs7RUFBQSxJQUN6Qm1DLE1BQU0sR0FBQW5DLFNBQUEsQ0FBQUMsTUFBQSxRQUFBRCxTQUFBLFFBQUFFLFNBQUEsR0FBQUYsU0FBQSxNQUFHUixlQUFlLENBQUMsQ0FBQyxDQUFDVyxXQUFXLENBQUMsQ0FBQztFQUV4QyxNQUFNbUUsSUFBSSxHQUFHaEUsdUJBQU0sQ0FBQ0UsRUFBRSxDQUFDOEQsSUFBSSxDQUFDbEUsVUFBVSxDQUFDO0VBQ3ZDLElBQUksQ0FBQ2tFLElBQUksRUFBRSxPQUFPLEVBQUU7RUFFcEIsTUFBTXhELFdBQVcsR0FBR2hCLHFCQUFxQixDQUFDcUMsTUFBTSxFQUFFL0IsVUFBVSxDQUFDO0VBQzdEO0VBQ0EsTUFBTW1FLFlBQVksR0FBR0MsNEJBQVcsQ0FBQ2hFLEVBQUUsQ0FBQ2lFLFdBQVcsQ0FBQ0gsSUFBSSxFQUFFeEQsV0FBVyxDQUFDQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRUQsV0FBVyxDQUFDQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUNyRztFQUNBLE1BQU0yRCxhQUFhLEdBQUdILFlBQVksQ0FBQ0k7RUFDbEM7RUFBQSxDQUNDQyxNQUFNLENBQUNDLElBQUksSUFBSSxZQUFZLENBQUNDLElBQUksQ0FBQ0QsSUFBSSxDQUFDLENBQUMsQ0FDdkNFLE1BQU0sQ0FBQyxDQUFDQyxXQUFxQixFQUFFSCxJQUFJLEtBQUs7SUFDeEMsSUFBSSxDQUFDRyxXQUFXLENBQUNDLFFBQVEsQ0FBQ0osSUFBSSxDQUFDLEVBQUU7TUFDaENHLFdBQVcsQ0FBQ0UsSUFBSSxDQUFDTCxJQUFJLENBQUM7SUFDdkI7SUFDQSxPQUFPRyxXQUFXO0VBQ25CLENBQUMsRUFBRSxFQUFFLENBQUM7RUFDUCxNQUFNRyxtQkFBbUIsR0FBR1QsYUFBYSxDQUFDekUsTUFBTSxHQUFHLENBQUMsR0FBR3lFLGFBQWEsQ0FBQ1UsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUk7RUFDckYsTUFBTUMsY0FBYyxHQUFHakYsVUFBVSxDQUFDOEQsT0FBTyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUM7RUFDbkQsT0FBTyxDQUFDaUIsbUJBQW1CLEdBQ3hCRSxjQUFjLEdBQ2RGLG1CQUFtQixLQUFLLFNBQVMsSUFBSSxDQUFDckIsaUJBQWlCO0VBQ3REO0VBQ0RxQixtQkFBbUI7RUFDbEI7RUFDRCxHQUFHQSxtQkFBbUIsS0FBS0UsY0FBYyxHQUFHO0FBQ2hEOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxTQUFTQyxvQkFBb0JBLENBQUN2RixXQUFtQixFQUFFO0VBQ3pELE9BQU84QyxXQUFXLENBQUM5QyxXQUFXLEVBQUUsR0FBRyxDQUFDO0FBQ3JDOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTOEMsV0FBV0EsQ0FBQzlDLFdBQW1CLEVBQUV3RixNQUFjLEVBQWtDO0VBQUEsSUFBaENuRixVQUFVLEdBQUFKLFNBQUEsQ0FBQUMsTUFBQSxRQUFBRCxTQUFBLFFBQUFFLFNBQUEsR0FBQUYsU0FBQSxNQUFHLElBQUFLLHlCQUFlLEVBQUMsQ0FBQztFQUN2RixPQUFPUCxxQkFBcUIsQ0FBQ0MsV0FBVyxFQUFFSyxVQUFVLENBQUMsQ0FBQ21GLE1BQU0sQ0FBQ0EsTUFBTSxDQUFDO0FBQ3JFO0FBRUEsTUFBTUMsb0JBQW9CLEdBQUlDLElBQVksSUFBSztFQUM5QyxJQUFJO0lBQ0gsTUFBTVgsSUFBSSxHQUFHWSxRQUFRLENBQUNDLGFBQWEsQ0FBQyxPQUFPLENBQUM7SUFDNUNiLElBQUksQ0FBQ1csSUFBSSxHQUFHQSxJQUFJO0lBQ2hCLE1BQU1HLFdBQVcsR0FBR2QsSUFBSSxDQUFDVyxJQUFJLEtBQUtBLElBQUk7SUFDdEMsT0FBT0csV0FBVztFQUNuQixDQUFDLENBQUMsTUFBTTtJQUNQLE9BQU8sS0FBSztFQUNiO0FBQ0QsQ0FBQztBQUVNLE1BQU1DLG9CQUFvQixHQUFBdEcsT0FBQSxDQUFBc0csb0JBQUEsR0FBR0wsb0JBQW9CLENBQUMsTUFBTSxDQUFDO0FBRXpELE1BQU1NLG9CQUFvQixHQUFBdkcsT0FBQSxDQUFBdUcsb0JBQUEsR0FBR04sb0JBQW9CLENBQUMsTUFBTSxDQUFDO0FBRXpELFNBQVNPLGVBQWVBLENBQUN0RSxRQUF1QixFQUFFO0VBQ3hELE9BQU8sQ0FBQyxDQUFDQSxRQUFRLElBQUksSUFBQW5CLHVCQUFNLEVBQUNtQixRQUFRLENBQUMsQ0FBQ3VFLE9BQU8sQ0FBQyxDQUFDO0FBQ2hEIiwiaWdub3JlTGlzdCI6W119
|
|
401
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbW9tZW50VGltZXpvbmUiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9tb21lbnRUaW1lem9uZVV0aWxzIiwiX3RpbWV6b25lIiwiY2xvY2tPZmZzZXQiLCJzZXRDbG9ja09mZnNldCIsIm9mZnNldCIsImV4cG9ydHMiLCJnZXRTZXJ2ZXJOb3dVdGMiLCJEYXRlIiwibm93IiwiZ2V0T2Zmc2V0RGF0ZSIsImRhdGUiLCJnZXRUaW1lIiwiZ2V0Wm9uZWRNb21lbnRGcm9tVXRjIiwiZGF0ZVRpbWVVdGMiLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJ1bmRlZmluZWQiLCJ0b0lTT1N0cmluZyIsInRpbWVab25lSWQiLCJndWVzc1RpbWVab25lSWQiLCJtb21lbnQiLCJ1dGMiLCJ0eiIsImdldFpvbmVkTW9tZW50RnJvbVV0Y0luRGVmYXVsdFpvbmUiLCJnZXREZWZhdWx0VGltZVpvbmVJZCIsImdldFpvbmVkTW9tZW50RnJvbUxvY2FsRGF0ZVRpbWUiLCJsb2NhbERhdGVUaW1lIiwibG9jYWxNb21lbnQiLCJ6b25lZE1vbWVudCIsInllYXIiLCJtb250aCIsImhvdXIiLCJtaW51dGUiLCJzZWNvbmQiLCJtaWxsaXNlY29uZCIsImdldExvY2FsTW9tZW50RnJvbVV0YyIsImdldExvY2FsRGF0ZVRpbWVGcm9tVXRjIiwidG9EYXRlIiwiZ2V0RGF0ZU1pbnVzVGltZSIsImRhdGVUaW1lIiwiZ2V0RnVsbFllYXIiLCJnZXRNb250aCIsImdldERhdGUiLCJnZXRFbmRPZkRheSIsInN0YXJ0T2YiLCJhZGQiLCJzdWJ0cmFjdCIsImdldEVuZE9mTWludXRlIiwiaXNOb3dFcXVhbE9yQWZ0ZXJEYXRlIiwibm93VXRjIiwiYWRqdXN0ZWREYXRlVGltZU1vbWVudCIsImN1cnJlbnRNb21lbnQiLCJpc1NhbWVPckFmdGVyIiwiaXNOb3dFcXVhbE9yQmVmb3JlRGF0ZSIsImlzU2FtZU9yQmVmb3JlIiwiaXNOb3dBZnRlckRhdGUiLCJpc05vd0JlZm9yZURhdGUiLCJnZXRGb3JtYXR0ZWRGdWxsRGF0ZUFuZFRpbWUiLCJ3aXRoVGltZVpvbmUiLCJhcHBseUZvcm1hdCIsImdldEZvcm1hdHRlZEZ1bGxEYXRlV2l0aFdlZWsiLCJnZXRGb3JtYXR0ZWROdW1iZXJlZERhdGVBbmRUaW1lIiwiZ2V0Rm9ybWF0dGVkTnVtYmVyZWREYXRlQW5kVGltZVdpdGhvdXRZZWFyIiwiZ2V0Rm9ybWF0dGVkU2ltcGxpZmllZERhdGUiLCJnZXRGb3JtYXR0ZWRTaW1wbGlmaWVkRGF0ZVdpdGhvdXRZZWFyIiwiZ2V0Rm9ybWF0dGVkU2ltcGxpZmllZERhdGVXaXRoWWVhcklmTm90Q3VycmVudCIsIm5vd1V0Y01vbWVudCIsImRhdGVUaW1lTW9tZW50IiwiTWF0aCIsImFicyIsImdldEZvcm1hdHRlZE51bWJlcmVkRGF0ZSIsImdldEZvcm1hdHRlZE51bWJlcmVkRGF0ZVdpdGhGdWxsWWVhciIsImdldEZvcm1hdHRlZE51bWJlcmVkRGF0ZUZvcklucHV0IiwiZ2V0Rm9ybWF0dGVkTnVtYmVyZWREYXRlV2l0aG91dFllYXIiLCJnZXRGb3JtYXR0ZWROdW1iZXJlZFRpbWUiLCJnZXRGb3JtYXR0ZWROdW1iZXJlZFRpbWVXaXRoRnVsbFpvbmUiLCJzaG93RWFzdGVyblpvbmVJZCIsInRpbWUiLCJ0aW1lem9uZUFiYnJldmlhdGlvbiIsInpvbmVBYmJyIiwicmVwbGFjZSIsImdldEZvcm1hdHRlZE51bWJlcmVkVGltZVdpdGhvdXRab25lIiwiZ2V0Rm9ybWF0dGVkTnVtYmVyZWRUaW1lV2l0aG91dFpvbmVPck1lcmlkaWFuIiwiZ2V0RnVsbEZvcm1hdHRlZFRpbWVab25lIiwiem9uZSIsImZpbHRlcmVkWm9uZSIsIm1vbWVudFV0aWxzIiwiZmlsdGVyWWVhcnMiLCJhYmJyZXZpYXRpb25zIiwiYWJicnMiLCJmaWx0ZXIiLCJhYmJyIiwidGVzdCIsInJlZHVjZSIsInVuaXF1ZUFiYnJzIiwiaW5jbHVkZXMiLCJwdXNoIiwiYWJicmV2aWF0aW9uc1N0cmluZyIsImpvaW4iLCJyZWFkYWJsZVpvbmVJZCIsImdldEZvcm1hdHRlZFRpbWVab25lIiwiZm9ybWF0IiwiaXNJbnB1dFR5cGVTdXBwb3J0ZWQiLCJ0eXBlIiwiZG9jdW1lbnQiLCJjcmVhdGVFbGVtZW50IiwiaXNTdXBwb3J0ZWQiLCJpc0RhdGVJbnB1dFN1cHBvcnRlZCIsImlzVGltZUlucHV0U3VwcG9ydGVkIiwiaXNEYXRlVGltZVZhbGlkIiwiaXNWYWxpZCJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9kYXRlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBtb21lbnQgZnJvbSAnbW9tZW50LXRpbWV6b25lJ1xuaW1wb3J0IG1vbWVudFV0aWxzIGZyb20gJ21vbWVudC10aW1lem9uZS9tb21lbnQtdGltZXpvbmUtdXRpbHMnXG5pbXBvcnQgeyBnZXREZWZhdWx0VGltZVpvbmVJZCwgZ3Vlc3NUaW1lWm9uZUlkIH0gZnJvbSAnLi90aW1lem9uZSdcblxuLyoqXG4gKiBUaGlzIHZhbHVlIGlzIHVzZWQgYnkgdGltZS1zZW5zaXRpdmUgZnVuY3Rpb25zIGluIHRoaXMgbW9kdWxlIGFuZCBvdGhlciBkYXRlL3RpbWUgdXRpbHMuIEFueSB0aW1lXG4gKiBhIG5ldyBEYXRlIG9iamVjdCBpcyBjb25zdHJ1Y3RlZCwgaXQgd2lsbCB1c2UgdGhpcyB2YWx1ZSB0byBhZGp1c3QgdGhlIHRpbWUgYnkgdGhpcyBvZmZzZXQgKHRvXG4gKiBtYWtlIGl0IGNvbnNpc3RlbnQgd2l0aCBhIGtub3duIHRpbWUpXG4gKi9cbmxldCBjbG9ja09mZnNldCA9IDBcblxuLyoqXG4gKiBXaGVuIGEgR3JvdXBBc3Nlc3NtZW50IGNvbWVzIGluIHRoZSBkb29yLCBpdCBpbmNsdWRlcyB0aGUgY3VycmVudCBVVEMgZGF0ZXRpbWUuIFRoaXMgbWV0aG9kIGlzXG4gKiB1c2VkIHRvIHVwZGF0ZSB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSAoYWNjdXJhdGUpIHNlcnZlciB0aW1lIGFuZCB0aGUgYnJvd3NlciB0aW1lXG4gKi9cbmV4cG9ydCBjb25zdCBzZXRDbG9ja09mZnNldCA9IGZ1bmN0aW9uIChvZmZzZXQ6IG51bWJlcikge1xuXHRjbG9ja09mZnNldCA9IG9mZnNldFxufVxuXG4vKipcbiAqIEdldCB0aGUgY3VycmVudCBVVEMgdGltZSwgY2FsaWJyYXRlZCB0byB0aGUgQVBJIHNlcnZlcidzIGNsb2NrXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRTZXJ2ZXJOb3dVdGMgPSBmdW5jdGlvbiAoKSB7XG5cdHJldHVybiBuZXcgRGF0ZShEYXRlLm5vdygpICsgY2xvY2tPZmZzZXQpXG59XG5cbi8qKlxuICogUmV0dXJuIHRoZSBwcm92aWRlZCBkYXRlLCBvZmZzZXQgYnkgdGhlIGNsb2NrT2Zmc2V0XG4gKi9cbmV4cG9ydCBjb25zdCBnZXRPZmZzZXREYXRlID0gKGRhdGU6IERhdGUpID0+IHtcblx0cmV0dXJuIG5ldyBEYXRlKGRhdGUuZ2V0VGltZSgpICsgY2xvY2tPZmZzZXQpXG59XG5cbmV4cG9ydCBjb25zdCBnZXRab25lZE1vbWVudEZyb21VdGMgPSAoXG5cdGRhdGVUaW1lVXRjID0gZ2V0U2VydmVyTm93VXRjKCkudG9JU09TdHJpbmcoKSxcblx0dGltZVpvbmVJZCA9IGd1ZXNzVGltZVpvbmVJZCgpXG4pID0+IHtcblx0cmV0dXJuIG1vbWVudC51dGMoZGF0ZVRpbWVVdGMpLnR6KHRpbWVab25lSWQpXG59XG5cbmV4cG9ydCBjb25zdCBnZXRab25lZE1vbWVudEZyb21VdGNJbkRlZmF1bHRab25lID0gKGRhdGVUaW1lVXRjID0gZ2V0U2VydmVyTm93VXRjKCkudG9JU09TdHJpbmcoKSkgPT4ge1xuXHRjb25zdCB0aW1lWm9uZUlkID0gZ2V0RGVmYXVsdFRpbWVab25lSWQoKVxuXHRyZXR1cm4gZ2V0Wm9uZWRNb21lbnRGcm9tVXRjKGRhdGVUaW1lVXRjLCB0aW1lWm9uZUlkKVxufVxuXG5leHBvcnQgY29uc3QgZ2V0Wm9uZWRNb21lbnRGcm9tTG9jYWxEYXRlVGltZSA9IChsb2NhbERhdGVUaW1lOiBEYXRlIHwgc3RyaW5nLCB0aW1lWm9uZUlkID0gZ3Vlc3NUaW1lWm9uZUlkKCkpID0+IHtcblx0Y29uc3QgbG9jYWxNb21lbnQgPSBtb21lbnQobG9jYWxEYXRlVGltZSlcblx0Y29uc3Qgem9uZWRNb21lbnQgPSBtb21lbnQudHooXG5cdFx0W1xuXHRcdFx0bG9jYWxNb21lbnQueWVhcigpLFxuXHRcdFx0bG9jYWxNb21lbnQubW9udGgoKSxcblx0XHRcdGxvY2FsTW9tZW50LmRhdGUoKSxcblx0XHRcdGxvY2FsTW9tZW50LmhvdXIoKSxcblx0XHRcdGxvY2FsTW9tZW50Lm1pbnV0ZSgpLFxuXHRcdFx0bG9jYWxNb21lbnQuc2Vjb25kKCksXG5cdFx0XHRsb2NhbE1vbWVudC5taWxsaXNlY29uZCgpXG5cdFx0XSxcblx0XHR0aW1lWm9uZUlkXG5cdClcblx0cmV0dXJuIHpvbmVkTW9tZW50XG59XG5cbmV4cG9ydCBjb25zdCBnZXRMb2NhbE1vbWVudEZyb21VdGMgPSAoXG5cdGRhdGVUaW1lVXRjID0gZ2V0U2VydmVyTm93VXRjKCkudG9JU09TdHJpbmcoKSxcblx0dGltZVpvbmVJZCA9IGd1ZXNzVGltZVpvbmVJZCgpXG4pID0+IHtcblx0Y29uc3Qgem9uZWRNb21lbnQgPSBnZXRab25lZE1vbWVudEZyb21VdGMoZGF0ZVRpbWVVdGMsIHRpbWVab25lSWQpXG5cdGNvbnN0IGxvY2FsTW9tZW50ID0gbW9tZW50KFtcblx0XHR6b25lZE1vbWVudC55ZWFyKCksXG5cdFx0em9uZWRNb21lbnQubW9udGgoKSxcblx0XHR6b25lZE1vbWVudC5kYXRlKCksXG5cdFx0em9uZWRNb21lbnQuaG91cigpLFxuXHRcdHpvbmVkTW9tZW50Lm1pbnV0ZSgpLFxuXHRcdHpvbmVkTW9tZW50LnNlY29uZCgpLFxuXHRcdHpvbmVkTW9tZW50Lm1pbGxpc2Vjb25kKClcblx0XSlcblx0cmV0dXJuIGxvY2FsTW9tZW50XG59XG5cbmV4cG9ydCBjb25zdCBnZXRMb2NhbERhdGVUaW1lRnJvbVV0YyA9IChkYXRlVGltZVV0Yzogc3RyaW5nKSA9PiB7XG5cdHJldHVybiBnZXRMb2NhbE1vbWVudEZyb21VdGMoZGF0ZVRpbWVVdGMpLnRvRGF0ZSgpXG59XG5cbmV4cG9ydCBjb25zdCBnZXREYXRlTWludXNUaW1lID0gKGRhdGVUaW1lOiBEYXRlKSA9PiB7XG5cdHJldHVybiBuZXcgRGF0ZShkYXRlVGltZS5nZXRGdWxsWWVhcigpLCBkYXRlVGltZS5nZXRNb250aCgpLCBkYXRlVGltZS5nZXREYXRlKCkpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRFbmRPZkRheShkYXRlVGltZVV0Yzogc3RyaW5nKSB7XG5cdHJldHVybiBtb21lbnQoZGF0ZVRpbWVVdGMpXG5cdFx0LnN0YXJ0T2YoJ2RheScpXG5cdFx0LmFkZCgxLCAnZGF5cycpXG5cdFx0LnN1YnRyYWN0KDMsICdtaWxsaXNlY29uZHMnKSAvLyBtdXN0IGJlIG1pbnVzIDMgZm9yIFNRTCBkYXRlXG5cdFx0LnRvRGF0ZSgpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRFbmRPZk1pbnV0ZShkYXRlVGltZVV0Yzogc3RyaW5nKSB7XG5cdHJldHVybiBtb21lbnQoZGF0ZVRpbWVVdGMpXG5cdFx0LnN0YXJ0T2YoJ21pbnV0ZScpXG5cdFx0LmFkZCgxLCAnbWludXRlJylcblx0XHQuc3VidHJhY3QoMywgJ21pbGxpc2Vjb25kcycpIC8vIG11c3QgYmUgbWludXMgMyBmb3IgU1FMIGRhdGVcblx0XHQudG9EYXRlKClcbn1cblxuLyoqXG4gKiBJcyB0aGUgY3VycmVudCB0aW1lLCBcIm5vd1wiLCAqKmFmdGVyIG9yIGVxdWFsIHRvKiogdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQHBhcmFtIGRhdGVUaW1lVXRjIFRoZSBkYXRlIHRvIGNvbXBhcmUgdGhlIGN1cnJlbnQgdGltZSwgXCJub3dcIiwgYXMgYW4gSVNPIGRhdGUgc3RyaW5nLlxuICogQHBhcmFtIG5vd1V0YyBPcHRpb25hbC4gVGhlIGN1cnJlbnQgdGltZSwgXCJub3dcIiwgYXMgYW4gSVNPIGRhdGUgc3RyaW5nLlxuICpcbiAqIEByZXR1cm5zIFdoZXRoZXIgb3Igbm90IFwibm93XCIgaXMgKiphZnRlciBvciBlcXVhbCB0byoqIGBkYXRlVGltZVV0Y2BcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzTm93RXF1YWxPckFmdGVyRGF0ZShkYXRlVGltZVV0Yz86IHN0cmluZywgbm93VXRjID0gZ2V0U2VydmVyTm93VXRjKCkudG9JU09TdHJpbmcoKSkge1xuXHRpZiAoIWRhdGVUaW1lVXRjKSB7XG5cdFx0cmV0dXJuIGZhbHNlXG5cdH1cblx0Y29uc3QgYWRqdXN0ZWREYXRlVGltZU1vbWVudCA9IGdldExvY2FsTW9tZW50RnJvbVV0YyhkYXRlVGltZVV0Yylcblx0Y29uc3QgY3VycmVudE1vbWVudCA9IGdldExvY2FsTW9tZW50RnJvbVV0Yyhub3dVdGMpXG5cdHJldHVybiBjdXJyZW50TW9tZW50LmlzU2FtZU9yQWZ0ZXIoYWRqdXN0ZWREYXRlVGltZU1vbWVudClcbn1cblxuLyoqXG4gKiBJcyB0aGUgY3VycmVudCB0aW1lLCBcIm5vd1wiLCAqKmJlZm9yZSBvciBlcXVhbCB0byoqIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBwYXJhbSBkYXRlVGltZVV0YyBUaGUgZGF0ZSB0byBjb21wYXJlIHRoZSBjdXJyZW50IHRpbWUsIFwibm93XCIsIGFzIGFuIElTTyBkYXRlIHN0cmluZy5cbiAqIEBwYXJhbSBub3dVdGMgT3B0aW9uYWwuIFRoZSBjdXJyZW50IHRpbWUsIFwibm93XCIsIGFzIGFuIElTTyBkYXRlIHN0cmluZy5cbiAqXG4gKiBAcmV0dXJucyBXaGV0aGVyIG9yIG5vdCBcIm5vd1wiIGlzICoqYmVmb3JlIG9yIGVxdWFsIHRvKiogYGRhdGVUaW1lVXRjYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzTm93RXF1YWxPckJlZm9yZURhdGUoZGF0ZVRpbWVVdGM/OiBzdHJpbmcsIG5vd1V0YyA9IGdldFNlcnZlck5vd1V0YygpLnRvSVNPU3RyaW5nKCkpIHtcblx0aWYgKCFkYXRlVGltZVV0Yykge1xuXHRcdHJldHVybiBmYWxzZVxuXHR9XG5cdGNvbnN0IGFkanVzdGVkRGF0ZVRpbWVNb21lbnQgPSBnZXRMb2NhbE1vbWVudEZyb21VdGMoZGF0ZVRpbWVVdGMpXG5cdGNvbnN0IGN1cnJlbnRNb21lbnQgPSBnZXRMb2NhbE1vbWVudEZyb21VdGMobm93VXRjKVxuXHRyZXR1cm4gY3VycmVudE1vbWVudC5pc1NhbWVPckJlZm9yZShhZGp1c3RlZERhdGVUaW1lTW9tZW50KVxufVxuXG4vKipcbiAqIElzIHRoZSBjdXJyZW50IHRpbWUsIFwibm93XCIsICoqYWZ0ZXIqKiB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAcGFyYW0gZGF0ZVRpbWVVdGMgVGhlIGRhdGUgdG8gY29tcGFyZSB0aGUgY3VycmVudCB0aW1lLCBcIm5vd1wiLCBhcyBhbiBJU08gZGF0ZSBzdHJpbmcuXG4gKiBAcGFyYW0gbm93VXRjIE9wdGlvbmFsLiBUaGUgY3VycmVudCB0aW1lLCBcIm5vd1wiLCBhcyBhbiBJU08gZGF0ZSBzdHJpbmcuXG4gKlxuICogQHJldHVybnMgV2hldGhlciBvciBub3QgXCJub3dcIiBpcyAqKmFmdGVyKiogYGRhdGVUaW1lVXRjYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzTm93QWZ0ZXJEYXRlKGRhdGVUaW1lVXRjPzogc3RyaW5nLCBub3dVdGMgPSBnZXRTZXJ2ZXJOb3dVdGMoKS50b0lTT1N0cmluZygpKSB7XG5cdGlmICghZGF0ZVRpbWVVdGMpIHtcblx0XHRyZXR1cm4gZmFsc2Vcblx0fVxuXHRjb25zdCBhZGp1c3RlZERhdGVUaW1lTW9tZW50ID0gZ2V0TG9jYWxNb21lbnRGcm9tVXRjKGRhdGVUaW1lVXRjKVxuXHRjb25zdCBjdXJyZW50TW9tZW50ID0gZ2V0TG9jYWxNb21lbnRGcm9tVXRjKG5vd1V0Yylcblx0cmV0dXJuIGN1cnJlbnRNb21lbnQgPiBhZGp1c3RlZERhdGVUaW1lTW9tZW50XG59XG5cbi8qKlxuICogSXMgdGhlIGN1cnJlbnQgdGltZSwgXCJub3dcIiwgKipiZWZvcmUqKiB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAcGFyYW0gZGF0ZVRpbWVVdGMgVGhlIGRhdGUgdG8gY29tcGFyZSB0aGUgY3VycmVudCB0aW1lLCBcIm5vd1wiLCBhcyBhbiBJU08gZGF0ZSBzdHJpbmcuXG4gKiBAcGFyYW0gbm93VXRjIE9wdGlvbmFsLiBUaGUgY3VycmVudCB0aW1lLCBcIm5vd1wiLCBhcyBhbiBJU08gZGF0ZSBzdHJpbmcuXG4gKlxuICogQHJldHVybnMgV2hldGhlciBvciBub3QgXCJub3dcIiBpcyAqKmJlZm9yZSoqIGBkYXRlVGltZVV0Y2AuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc05vd0JlZm9yZURhdGUoZGF0ZVRpbWVVdGM/OiBzdHJpbmcsIG5vd1V0YyA9IGdldFNlcnZlck5vd1V0YygpLnRvSVNPU3RyaW5nKCkpIHtcblx0aWYgKCFkYXRlVGltZVV0Yykge1xuXHRcdHJldHVybiBmYWxzZVxuXHR9XG5cdGNvbnN0IGFkanVzdGVkRGF0ZVRpbWVNb21lbnQgPSBnZXRMb2NhbE1vbWVudEZyb21VdGMoZGF0ZVRpbWVVdGMpXG5cdGNvbnN0IGN1cnJlbnRNb21lbnQgPSBnZXRMb2NhbE1vbWVudEZyb21VdGMobm93VXRjKVxuXHRyZXR1cm4gY3VycmVudE1vbWVudCA8IGFkanVzdGVkRGF0ZVRpbWVNb21lbnRcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgZGF0ZSBhbmQgdGltZSBzdHJpbmcgd2l0aCBmdWxsIGRhdGUsIGUuZy4gYE1hcmNoIDUsIDIwMTggQCA0OjA1IFBNIEVEVGBcbiAqIEBwYXJhbSBkYXRlVGltZVV0YyBBIFVUQyBkYXRlIHRpbWUgc3RyaW5nXG4gKiBAcGFyYW0gd2l0aFRpbWVab25lIChvcHRpb25hbCkgV2hldGhlciB0byBpbmNsdWRlIHRoZSB0aW1lIHpvbmUgYWJicmV2aWF0aW9uLiBEZWZhdWx0cyB0byBgdHJ1ZWAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRGb3JtYXR0ZWRGdWxsRGF0ZUFuZFRpbWUoZGF0ZVRpbWVVdGM6IHN0cmluZywgd2l0aFRpbWVab25lID0gdHJ1ZSkge1xuXHRyZXR1cm4gYXBwbHlGb3JtYXQoZGF0ZVRpbWVVdGMsIGBNTU1NIEQsIFlZWVkgQCBoOm1tXFx1MDBhMEEke3dpdGhUaW1lWm9uZSA/ICcgeicgOiAnJ31gKVxufVxuXG4vKipcbiAqIFJldHVybnMgYSBkYXRlIGFuZCB0aW1lIHN0cmluZyB3aXRoIGRheSBvZiB3ZWVrIGFuZCBBbWVyaWNhbiBzbGFzaCBkYXRlcywgZS5nLiBgTW9uLCAzLzUvMjAxOCBAIDQ6MDUgUE0gRURUYFxuICogQHBhcmFtIGRhdGVUaW1lVXRjIEEgVVRDIGRhdGUgdGltZSBzdHJpbmdcbiAqIEBwYXJhbSB3aXRoVGltZVpvbmUgKG9wdGlvbmFsKSBXaGV0aGVyIHRvIGluY2x1ZGUgdGhlIHRpbWUgem9uZSBhYmJyZXZpYXRpb24uIERlZmF1bHRzIHRvIGB0cnVlYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEZvcm1hdHRlZEZ1bGxEYXRlV2l0aFdlZWsoZGF0ZVRpbWVVdGM6IHN0cmluZywgd2l0aFRpbWVab25lID0gdHJ1ZSkge1xuXHRyZXR1cm4gYXBwbHlGb3JtYXQoZGF0ZVRpbWVVdGMsIGBkZGQsIE0vRC9ZWVlZIEAgaDptbVxcdTAwYTBBJHt3aXRoVGltZVpvbmUgPyAnIHonIDogJyd9YClcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgZGF0ZSBhbmQgdGltZSBzdHJpbmcgd2l0aCBBbWVyaWNhbiBzbGFzaCBkYXRlcywgYW5kIG5vIGxlYWRpbmcgemVyb2VzLCBlLmcuIGAzLzUvMTggNDowNSBQTSBFRFRgXG4gKiBAcGFyYW0gZGF0ZVRpbWVVdGMgQSBVVEMgZGF0ZSB0aW1lIHN0cmluZ1xuICogQHBhcmFtIHdpdGhUaW1lWm9uZSAob3B0aW9uYWwpIFdoZXRoZXIgdG8gaW5jbHVkZSB0aGUgdGltZSB6b25lIGFiYnJldmlhdGlvbi4gRGVmYXVsdHMgdG8gYHRydWVgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Rm9ybWF0dGVkTnVtYmVyZWREYXRlQW5kVGltZShkYXRlVGltZVV0Yzogc3RyaW5nLCB3aXRoVGltZVpvbmUgPSB0cnVlKSB7XG5cdHJldHVybiBhcHBseUZvcm1hdChkYXRlVGltZVV0YywgYE0vRC9ZWSBoOm1tXFx1MDBhMEEke3dpdGhUaW1lWm9uZSA/ICcgeicgOiAnJ31gKVxufVxuXG4vKipcbiAqIFJldHVybnMgYSBkYXRlIGFuZCB0aW1lIHN0cmluZyB3aXRoIEFtZXJpY2FuIHNsYXNoIGRhdGVzLCBubyBsZWFkaW5nIHplcm9lcywgYW5kIG5vIHllYXIsIGUuZy4gYDMvNSA0OjA1IFBNIEVEVGBcbiAqIEBwYXJhbSBkYXRlVGltZVV0YyBBIFVUQyBkYXRlIHRpbWUgc3RyaW5nXG4gKiBAcGFyYW0gd2l0aFRpbWVab25lIChvcHRpb25hbCkgV2hldGhlciB0byBpbmNsdWRlIHRoZSB0aW1lIHpvbmUgYWJicmV2aWF0aW9uLiBEZWZhdWx0cyB0byBgdHJ1ZWAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRGb3JtYXR0ZWROdW1iZXJlZERhdGVBbmRUaW1lV2l0aG91dFllYXIoZGF0ZVRpbWVVdGM6IHN0cmluZywgd2l0aFRpbWVab25lID0gdHJ1ZSkge1xuXHRyZXR1cm4gYXBwbHlGb3JtYXQoZGF0ZVRpbWVVdGMsIGBNL0QgaDptbVxcdTAwYTBBJHt3aXRoVGltZVpvbmUgPyAnIHonIDogJyd9YClcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgZGF0ZSBzdHJpbmcgd2l0aCBzaG9ydCBtb250aCBhbmQgZnVsbCB5ZWFyLCBlLmcuIGBNYXIgNSwgMjAxOGBcbiAqIEBwYXJhbSBkYXRlVGltZVV0YyBBIFVUQyBkYXRlIHRpbWUgc3RyaW5nXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRGb3JtYXR0ZWRTaW1wbGlmaWVkRGF0ZShkYXRlVGltZVV0Yzogc3RyaW5nKSB7XG5cdHJldHVybiBhcHBseUZvcm1hdChkYXRlVGltZVV0YywgJ01NTSBELCBZWVlZJylcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgZGF0ZSBzdHJpbmcgd2l0aCBzaG9ydCBtb250aCBhbmQgbm8geWVhciwgZS5nLiBgTWFyIDVgXG4gKiBAcGFyYW0gZGF0ZVRpbWVVdGMgQSBVVEMgZGF0ZSB0aW1lIHN0cmluZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Rm9ybWF0dGVkU2ltcGxpZmllZERhdGVXaXRob3V0WWVhcihkYXRlVGltZVV0Yzogc3RyaW5nKSB7XG5cdHJldHVybiBhcHBseUZvcm1hdChkYXRlVGltZVV0YywgJ01NTSBEJylcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgZGF0ZSBzdHJpbmcgYXMgZWl0aGVyICdNTU0gRCwgWVlZWScgb3IgJ01NTSBEJyBpZiB0aGUgZGF0ZSdzIHllYXIgaXMgdGhlIHNhbWUgYXMgdGhlIGN1cnJlbnQgeWVhclxuICogQHBhcmFtIGRhdGVUaW1lVXRjIEEgVVRDIGRhdGUgdGltZSBzdHJpbmdcbiAqIEBwYXJhbSBub3dVdGMgKG9wdGlvbmFsKSBBIFVUQyBkYXRlIHRpbWUgc3RyaW5nIG9mIFwibm93XCIuIFVzZWQgZm9yIHRlc3RpbmcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRGb3JtYXR0ZWRTaW1wbGlmaWVkRGF0ZVdpdGhZZWFySWZOb3RDdXJyZW50KFxuXHRkYXRlVGltZVV0Yzogc3RyaW5nLFxuXHRub3dVdGMgPSBnZXRTZXJ2ZXJOb3dVdGMoKS50b0lTT1N0cmluZygpXG4pIHtcblx0Y29uc3Qgbm93VXRjTW9tZW50ID0gbW9tZW50KG5vd1V0Yylcblx0Y29uc3QgZGF0ZVRpbWVNb21lbnQgPSBtb21lbnQoZGF0ZVRpbWVVdGMpXG5cdHJldHVybiBNYXRoLmFicyhub3dVdGNNb21lbnQueWVhcigpIC0gZGF0ZVRpbWVNb21lbnQueWVhcigpKSA9PT0gMFxuXHRcdD8gZ2V0Rm9ybWF0dGVkU2ltcGxpZmllZERhdGVXaXRob3V0WWVhcihkYXRlVGltZVV0Yylcblx0XHQ6IGdldEZvcm1hdHRlZFNpbXBsaWZpZWREYXRlKGRhdGVUaW1lVXRjKVxufVxuXG4vKipcbiAqIFJldHVybnMgYSBkYXRlIHN0cmluZyB3aXRoIEFtZXJpY2FuIHNsYXNoIGRhdGVzLCBubyBsZWFkaW5nIHplcm9lcywgYW5kIHNob3J0IHllYXIsIGUuZy4gYDMvNS8xOGBcbiAqIEBwYXJhbSBkYXRlVGltZVV0YyBBIFVUQyBkYXRlIHRpbWUgc3RyaW5nXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRGb3JtYXR0ZWROdW1iZXJlZERhdGUoZGF0ZVRpbWVVdGM6IHN0cmluZykge1xuXHRyZXR1cm4gYXBwbHlGb3JtYXQoZGF0ZVRpbWVVdGMsICdNL0QvWVknKVxufVxuXG4vKipcbiAqIFJldHVybnMgYSBkYXRlIHN0cmluZyB3aXRoIEFtZXJpY2FuIHNsYXNoIGRhdGVzLCBubyBsZWFkaW5nIHplcm9lcywgYW5kIGZ1bGwgeWVhciwgZS5nLiBgMy81LzIwMThgXG4gKiBAcGFyYW0gZGF0ZVRpbWVVdGMgQSBVVEMgZGF0ZSB0aW1lIHN0cmluZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Rm9ybWF0dGVkTnVtYmVyZWREYXRlV2l0aEZ1bGxZZWFyKGRhdGVUaW1lVXRjOiBzdHJpbmcpIHtcblx0cmV0dXJuIGFwcGx5Rm9ybWF0KGRhdGVUaW1lVXRjLCAnTS9EL1lZWVknKVxufVxuXG4vKipcbiAqIFJldHVybnMgYSBkYXRlIHN0cmluZyBmb3IgdXNlIGluIEhUTUwgaW5wdXRzLCBlLmcuIGAyMDE4LTAzLTA1YFxuICogQHBhcmFtIGRhdGVUaW1lVXRjIEEgVVRDIGRhdGUgdGltZSBzdHJpbmdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEZvcm1hdHRlZE51bWJlcmVkRGF0ZUZvcklucHV0KGRhdGVUaW1lVXRjOiBzdHJpbmcpIHtcblx0cmV0dXJuIGFwcGx5Rm9ybWF0KGRhdGVUaW1lVXRjLCAnWVlZWS1NTS1ERCcpXG59XG5cbi8qKlxuICogUmV0dXJucyBhIGRhdGUgc3RyaW5nIHdpdGggQW1lcmljYW4gc2xhc2ggZGF0ZXMgYW5kIG5vIHllYXIgYW5kIG5vIGxlYWRpbmcgemVyb2VzLCBlLmcuIGAzLzVgXG4gKiBAcGFyYW0gZGF0ZVRpbWVVdGMgQSBVVEMgZGF0ZSB0aW1lIHN0cmluZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Rm9ybWF0dGVkTnVtYmVyZWREYXRlV2l0aG91dFllYXIoZGF0ZVRpbWVVdGM6IHN0cmluZykge1xuXHRyZXR1cm4gYXBwbHlGb3JtYXQoZGF0ZVRpbWVVdGMsICdNL0QnKVxufVxuXG4vKipcbiAqIFJldHVybnMgYSB0aW1lIHN0cmluZywgZS5nLiBgNDowNSBQTSBFRFRgXG4gKiBAcGFyYW0gZGF0ZVRpbWVVdGMgQSBVVEMgZGF0ZSB0aW1lIHN0cmluZ1xuICogQHBhcmFtIHdpdGhUaW1lWm9uZSAob3B0aW9uYWwpIFdoZXRoZXIgdG8gaW5jbHVkZSB0aGUgdGltZSB6b25lIGFiYnJldmlhdGlvbi4gRGVmYXVsdHMgdG8gYHRydWVgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Rm9ybWF0dGVkTnVtYmVyZWRUaW1lKGRhdGVUaW1lVXRjOiBzdHJpbmcsIHdpdGhUaW1lWm9uZSA9IHRydWUpIHtcblx0cmV0dXJuIGFwcGx5Rm9ybWF0KGRhdGVUaW1lVXRjLCBgaDptbVxcdTAwYTBBJHt3aXRoVGltZVpvbmUgPyAnIHonIDogJyd9YClcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgdGltZSBzdHJpbmcgd2l0aCBwb3NzaWJseSBmdWxsIHRpbWUgem9uZSBuYW1lLCBlLmcuIGA0OjA1IFBNIEVEVGAgb3IgYDQ6MDUgUE0gQ1NUIChBc2lhL1RhaXBlaSlgXG4gKiBAcGFyYW0gZGF0ZVRpbWVVdGMgQSBVVEMgZGF0ZSB0aW1lIHN0cmluZ1xuICogQHBhcmFtIHNob3dFYXN0ZXJuWm9uZUlkIChvcHRpb25hbCkgV2hldGhlciBvciBub3QgdG8gaW5jbHVkZSB0aGUgdGltZVpvbmVJZCBpbiB0aGUgcmVzdWx0IGZvciBFU1QvRURULiBEZWZhdWx0cyB0byBgZmFsc2VgLlxuICogQHBhcmFtIHRpbWVab25lSWQgKG9wdGlvbmFsKSBBIHRpbWUgem9uZSBJZC4gRGVmYXVsdHMgdG8gdGhlIGN1cnJlbnQgdGltZSB6b25lIGlkLCB1c2luZyBgZ3Vlc3NUaW1lWm9uZUlkKClgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Rm9ybWF0dGVkTnVtYmVyZWRUaW1lV2l0aEZ1bGxab25lKFxuXHRkYXRlVGltZVV0Yzogc3RyaW5nLFxuXHRzaG93RWFzdGVyblpvbmVJZCA9IGZhbHNlLFxuXHR0aW1lWm9uZUlkID0gZ3Vlc3NUaW1lWm9uZUlkKClcbikge1xuXHRjb25zdCB6b25lZE1vbWVudCA9IGdldFpvbmVkTW9tZW50RnJvbVV0YyhkYXRlVGltZVV0YywgdGltZVpvbmVJZClcblx0Y29uc3QgdGltZSA9IGFwcGx5Rm9ybWF0KGRhdGVUaW1lVXRjLCAnaDptbVxcdTAwYTBBJywgdGltZVpvbmVJZClcblx0Y29uc3QgdGltZXpvbmVBYmJyZXZpYXRpb24gPSB6b25lZE1vbWVudC56b25lQWJicigpXG5cdHJldHVybiAodGltZXpvbmVBYmJyZXZpYXRpb24gPT09ICdFRFQnIHx8IHRpbWV6b25lQWJicmV2aWF0aW9uID09PSAnRVNUJykgJiYgIXNob3dFYXN0ZXJuWm9uZUlkXG5cdFx0PyAvLyBEb24ndCBzaG93IHRoZSBmdWxsIHpvbmUgbmFtZSBpZiBpbiBFRFQgb3IgRVNULCB1bmxlc3MgdG9sZCB0b1xuXHRcdFx0YCR7dGltZX0gJHt0aW1lem9uZUFiYnJldmlhdGlvbn1gXG5cdFx0OiAvLyBJZiBub3QgRURUIG9yIEVTVCwgc2hvdyB0aGUgem9uZSBuYW1lLCByZXBsYWNpbmcgdW5kZXJzY29yZXMgd2l0aCBzcGFjZXNcblx0XHRcdC8vIEV4OiBcIkFzaWEvVGFpcGVpXCJcblx0XHRcdGAke3RpbWV9ICR7dGltZXpvbmVBYmJyZXZpYXRpb259ICgke3RpbWVab25lSWQucmVwbGFjZSgnXycsICcgJyl9KWBcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgdGltZSBzdHJpbmcgd2l0aG91dCB0aW1lIHpvbmUsIGUuZy4gYDQ6MDUgUE1gXG4gKiBAcGFyYW0gZGF0ZVRpbWVVdGMgQSBVVEMgZGF0ZSB0aW1lIHN0cmluZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Rm9ybWF0dGVkTnVtYmVyZWRUaW1lV2l0aG91dFpvbmUoZGF0ZVRpbWVVdGM6IHN0cmluZykge1xuXHRyZXR1cm4gYXBwbHlGb3JtYXQoZGF0ZVRpbWVVdGMsICdoOm1tXFx1MDBhMEEnKVxufVxuXG4vKipcbiAqIFJldHVybnMgYSB0aW1lIHN0cmluZyB3aXRob3V0IHRpbWUgem9uZSwgaW4gMjQgaHIgdGltZSwgZS5nLiBgMTY6MDVgXG4gKiBAcGFyYW0gZGF0ZVRpbWVVdGMgQSBVVEMgZGF0ZSB0aW1lIHN0cmluZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Rm9ybWF0dGVkTnVtYmVyZWRUaW1lV2l0aG91dFpvbmVPck1lcmlkaWFuKGRhdGVUaW1lVXRjOiBzdHJpbmcpIHtcblx0cmV0dXJuIGFwcGx5Rm9ybWF0KGRhdGVUaW1lVXRjLCAnSEg6bW0nKVxufVxuXG4vKipcbiAqIFJldHVybnMgYSBmdWxsIGZvcm1hdHRlZCB0aW1lIHpvbmUgc3RyaW5nIGZvciB0aGUgZ2l2ZW4gYHRpbWVab25lSWRgLlxuICpcbiAqIENvbWJpbmVzIGFsbCBwb3NzaWJsZSBhYmJyZXZpYXRpb25zIGZvciB0aGUgem9uZSBhbmQgdGhlIHRpbWVab25lSWQsIGUuZy4gYEVTVC9FRFRgLCBgUFNUL1BEVCAoQW1lcmljYS9Mb3MgQW5nZWxlcylgIG9yIGBDU1QgKEFzaWEvVGFpcGVpKWBcbiAqXG4gKiBJZiBhYmJyZXZpYXRpb25zIGFyZSBub3QgYWxwaGEgY2hhcmFjdGVycywgZS5nLiBgLTA0YCwgdGhlbiBvbmx5IHRoZSB0aW1lWm9uZUlkIGlzIHJldHVybmVkLlxuICpcbiAqIEBwYXJhbSB0aW1lWm9uZUlkIChvcHRpb25hbCkgQSB0aW1lIHpvbmUgSWQuIERlZmF1bHRzIHRvIHRoZSBjdXJyZW50IHRpbWUgem9uZSBpZCwgdXNpbmcgYGd1ZXNzVGltZVpvbmVJZCgpYC5cbiAqIEBwYXJhbSBzaG93RWFzdGVyblpvbmVJZCAob3B0aW9uYWwpIFdoZXRoZXIgb3Igbm90IHRvIGluY2x1ZGUgdGhlIHRpbWVab25lSWQgaW4gdGhlIHJlc3VsdCBmb3IgRVNUL0VEVC4gRGVmYXVsdHMgdG8gYGZhbHNlYC5cbiAqIEBwYXJhbSBub3dVdGMgKG9wdGlvbmFsKSBUaGUgY3VycmVudCB0aW1lLCBcIm5vd1wiLCBhcyBhbiBJU08gZGF0ZSBzdHJpbmcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRGdWxsRm9ybWF0dGVkVGltZVpvbmUoXG5cdHRpbWVab25lSWQgPSBndWVzc1RpbWVab25lSWQoKSxcblx0c2hvd0Vhc3Rlcm5ab25lSWQgPSBmYWxzZSxcblx0bm93VXRjID0gZ2V0U2VydmVyTm93VXRjKCkudG9JU09TdHJpbmcoKVxuKSB7XG5cdGNvbnN0IHpvbmUgPSBtb21lbnQudHouem9uZSh0aW1lWm9uZUlkKVxuXHRpZiAoIXpvbmUpIHJldHVybiAnJ1xuXG5cdGNvbnN0IHpvbmVkTW9tZW50ID0gZ2V0Wm9uZWRNb21lbnRGcm9tVXRjKG5vd1V0YywgdGltZVpvbmVJZClcblx0Ly8gZmlsdGVyIHRoZSB6b25lIGRhdGEgZG93biB0byBqdXN0IHJlY2VudCB5ZWFycywgaW5zdGVhZCBvZiB0aGUgZGVmYXVsdCBvZiAxOTAwIHRvIDIwMzhcblx0Y29uc3QgZmlsdGVyZWRab25lID0gbW9tZW50VXRpbHMudHouZmlsdGVyWWVhcnMoem9uZSwgem9uZWRNb21lbnQueWVhcigpIC0gMSwgem9uZWRNb21lbnQueWVhcigpICsgMSlcblx0Ly8gZmluZCBhbGwgdW5pcXVlIGFiYnJldmlhdGlvbnMgZm9yIHRoZSB6b25lLCBjb21iaW5lZCBpbnRvIGEgc3RyaW5nXG5cdGNvbnN0IGFiYnJldmlhdGlvbnMgPSBmaWx0ZXJlZFpvbmUuYWJicnNcblx0XHQvLyBmaWx0ZXIgb3V0IG5vbi1hbHBoYSBhYmJyZXZpYXRpb25zXG5cdFx0LmZpbHRlcihhYmJyID0+IC9bYS16QS1aXSsvZy50ZXN0KGFiYnIpKVxuXHRcdC5yZWR1Y2UoKHVuaXF1ZUFiYnJzOiBzdHJpbmdbXSwgYWJicikgPT4ge1xuXHRcdFx0aWYgKCF1bmlxdWVBYmJycy5pbmNsdWRlcyhhYmJyKSkge1xuXHRcdFx0XHR1bmlxdWVBYmJycy5wdXNoKGFiYnIpXG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdW5pcXVlQWJicnNcblx0XHR9LCBbXSlcblx0Y29uc3QgYWJicmV2aWF0aW9uc1N0cmluZyA9IGFiYnJldmlhdGlvbnMubGVuZ3RoID4gMCA/IGFiYnJldmlhdGlvbnMuam9pbignLycpIDogbnVsbFxuXHRjb25zdCByZWFkYWJsZVpvbmVJZCA9IHRpbWVab25lSWQucmVwbGFjZSgnXycsICcgJylcblx0cmV0dXJuICFhYmJyZXZpYXRpb25zU3RyaW5nXG5cdFx0PyByZWFkYWJsZVpvbmVJZFxuXHRcdDogYWJicmV2aWF0aW9uc1N0cmluZyA9PT0gJ0VTVC9FRFQnICYmICFzaG93RWFzdGVyblpvbmVJZFxuXHRcdFx0PyAvLyBEb24ndCBzaG93IHRoZSB6b25lSWQgaWYgaW4gRWFzdGVybiwgdW5sZXNzIHRvbGQgdG9cblx0XHRcdFx0YWJicmV2aWF0aW9uc1N0cmluZ1xuXHRcdFx0OiAvLyBTaG93IHRoZSBjb21iaW5lZCBhYmJyZXZpYXRpb25zIHBsdXMgdGhlIGZyaWVuZGx5IHpvbmVJZFxuXHRcdFx0XHRgJHthYmJyZXZpYXRpb25zU3RyaW5nfSAoJHtyZWFkYWJsZVpvbmVJZH0pYFxufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIGJhc2ljIHRpbWUgem9uZSBhYmJyZXZpYXRpb24gZm9yIHRoZSBnaXZlbiBkYXRlLCBlLmcuIGBFRFRgLlxuICpcbiAqIEBwYXJhbSBkYXRlVGltZVV0YyBUaGUgZGF0ZSB0byBmb3JtYXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRGb3JtYXR0ZWRUaW1lWm9uZShkYXRlVGltZVV0Yzogc3RyaW5nKSB7XG5cdHJldHVybiBhcHBseUZvcm1hdChkYXRlVGltZVV0YywgJ3onKVxufVxuXG4vKipcbiAqIEZvcm1hdHMgYSBkYXRlIHVzaW5nIHRoZSBnaXZlbiBmb3JtYXQuIFBhcnNlcyB0aGUgZGF0ZSBhcyBVVEMsIHRoZW4gY29udmVydHMgdG8gdGhlIGN1cnJlbnQgdGltZSB6b25lLCB0aGVuIGZvcm1hdHMuXG4gKiBAcGFyYW0geyp9IGRhdGVUaW1lVXRjIFRoZSBkYXRlIHRvIGZvcm1hdC4gQW55IHZhbGlkIGlucHV0IGZvciBgbW9tZW50LnV0YyguLi4pYFxuICogQHBhcmFtIHsqfSBmb3JtYXQgVGhlIGZvcm1hdCB0byB1c2VcbiAqL1xuZnVuY3Rpb24gYXBwbHlGb3JtYXQoZGF0ZVRpbWVVdGM6IHN0cmluZywgZm9ybWF0OiBzdHJpbmcsIHRpbWVab25lSWQgPSBndWVzc1RpbWVab25lSWQoKSkge1xuXHRyZXR1cm4gZ2V0Wm9uZWRNb21lbnRGcm9tVXRjKGRhdGVUaW1lVXRjLCB0aW1lWm9uZUlkKS5mb3JtYXQoZm9ybWF0KVxufVxuXG5jb25zdCBpc0lucHV0VHlwZVN1cHBvcnRlZCA9ICh0eXBlOiBzdHJpbmcpID0+IHtcblx0dHJ5IHtcblx0XHRjb25zdCB0ZXN0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKVxuXHRcdHRlc3QudHlwZSA9IHR5cGVcblx0XHRjb25zdCBpc1N1cHBvcnRlZCA9IHRlc3QudHlwZSA9PT0gdHlwZVxuXHRcdHJldHVybiBpc1N1cHBvcnRlZFxuXHR9IGNhdGNoIHtcblx0XHRyZXR1cm4gZmFsc2Vcblx0fVxufVxuXG5leHBvcnQgY29uc3QgaXNEYXRlSW5wdXRTdXBwb3J0ZWQgPSBpc0lucHV0VHlwZVN1cHBvcnRlZCgnZGF0ZScpXG5cbmV4cG9ydCBjb25zdCBpc1RpbWVJbnB1dFN1cHBvcnRlZCA9IGlzSW5wdXRUeXBlU3VwcG9ydGVkKCd0aW1lJylcblxuZXhwb3J0IGZ1bmN0aW9uIGlzRGF0ZVRpbWVWYWxpZChkYXRlVGltZTogc3RyaW5nIHwgRGF0ZSkge1xuXHRyZXR1cm4gISFkYXRlVGltZSAmJiBtb21lbnQoZGF0ZVRpbWUpLmlzVmFsaWQoKVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxJQUFBQSxlQUFBLEdBQUFDLHNCQUFBLENBQUFD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LEdBQUd5RSxhQUFhLENBQUNVLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJO0VBQ3JGLE1BQU1DLGNBQWMsR0FBR2pGLFVBQVUsQ0FBQzhELE9BQU8sQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDO0VBQ25ELE9BQU8sQ0FBQ2lCLG1CQUFtQixHQUN4QkUsY0FBYyxHQUNkRixtQkFBbUIsS0FBSyxTQUFTLElBQUksQ0FBQ3JCLGlCQUFpQjtFQUN0RDtFQUNEcUIsbUJBQW1CO0VBQ2xCO0VBQ0QsR0FBR0EsbUJBQW1CLEtBQUtFLGNBQWMsR0FBRztBQUNoRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0Msb0JBQW9CQSxDQUFDdkYsV0FBbUIsRUFBRTtFQUN6RCxPQUFPOEMsV0FBVyxDQUFDOUMsV0FBVyxFQUFFLEdBQUcsQ0FBQztBQUNyQzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzhDLFdBQVdBLENBQUM5QyxXQUFtQixFQUFFd0YsTUFBYyxFQUFrQztFQUFBLElBQWhDbkYsVUFBVSxHQUFBSixTQUFBLENBQUFDLE1BQUEsUUFBQUQsU0FBQSxRQUFBRSxTQUFBLEdBQUFGLFNBQUEsTUFBRyxJQUFBSyx5QkFBZSxFQUFDLENBQUM7RUFDdkYsT0FBT1AscUJBQXFCLENBQUNDLFdBQVcsRUFBRUssVUFBVSxDQUFDLENBQUNtRixNQUFNLENBQUNBLE1BQU0sQ0FBQztBQUNyRTtBQUVBLE1BQU1DLG9CQUFvQixHQUFJQyxJQUFZLElBQUs7RUFDOUMsSUFBSTtJQUNILE1BQU1YLElBQUksR0FBR1ksUUFBUSxDQUFDQyxhQUFhLENBQUMsT0FBTyxDQUFDO0lBQzVDYixJQUFJLENBQUNXLElBQUksR0FBR0EsSUFBSTtJQUNoQixNQUFNRyxXQUFXLEdBQUdkLElBQUksQ0FBQ1csSUFBSSxLQUFLQSxJQUFJO0lBQ3RDLE9BQU9HLFdBQVc7RUFDbkIsQ0FBQyxDQUFDLE1BQU07SUFDUCxPQUFPLEtBQUs7RUFDYjtBQUNELENBQUM7QUFFTSxNQUFNQyxvQkFBb0IsR0FBQXRHLE9BQUEsQ0FBQXNHLG9CQUFBLEdBQUdMLG9CQUFvQixDQUFDLE1BQU0sQ0FBQztBQUV6RCxNQUFNTSxvQkFBb0IsR0FBQXZHLE9BQUEsQ0FBQXVHLG9CQUFBLEdBQUdOLG9CQUFvQixDQUFDLE1BQU0sQ0FBQztBQUV6RCxTQUFTTyxlQUFlQSxDQUFDdEUsUUFBdUIsRUFBRTtFQUN4RCxPQUFPLENBQUMsQ0FBQ0EsUUFBUSxJQUFJLElBQUFuQix1QkFBTSxFQUFDbUIsUUFBUSxDQUFDLENBQUN1RSxPQUFPLENBQUMsQ0FBQztBQUNoRCIsImlnbm9yZUxpc3QiOltdfQ==
|