@ethlete/query 5.15.0 → 5.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (184) hide show
  1. package/.eslintrc.json +40 -0
  2. package/CHANGELOG.md +14 -0
  3. package/jest.config.ts +23 -0
  4. package/ng-package.json +8 -0
  5. package/package.json +6 -23
  6. package/project.json +37 -0
  7. package/{index.d.ts → src/index.ts} +2 -0
  8. package/src/lib/auth/auth-provider.types.ts +160 -0
  9. package/src/lib/auth/auth-provider.utils.ts +39 -0
  10. package/src/lib/auth/basic-auth-provider.ts +17 -0
  11. package/src/lib/auth/bearer-auth-provider.ts +243 -0
  12. package/src/lib/auth/custom-header-auth-provider.ts +13 -0
  13. package/{lib/class-validator/class-validator.types.d.ts → src/lib/class-validator/class-validator.types.ts} +4 -3
  14. package/src/lib/class-validator/class-validator.utils.ts +5 -0
  15. package/src/lib/devtools/components/query-devtools/query-devtools.component.html +402 -0
  16. package/src/lib/devtools/components/query-devtools/query-devtools.component.scss +360 -0
  17. package/src/lib/devtools/components/query-devtools/query-devtools.component.ts +427 -0
  18. package/src/lib/devtools/pipes/query-short-name.pipe.ts +24 -0
  19. package/src/lib/devtools/utils/query-client.utils.ts +25 -0
  20. package/src/lib/directives/infinity-query-trigger.directive.ts +58 -0
  21. package/src/lib/directives/infinity-query.directive.ts +208 -0
  22. package/src/lib/directives/query.directive.ts +201 -0
  23. package/src/lib/entity/entity-store.ts +180 -0
  24. package/src/lib/entity/entity.types.ts +34 -0
  25. package/src/lib/entity/entity.utils.ts +51 -0
  26. package/src/lib/gql/gql.ts +22 -0
  27. package/src/lib/infinite-query/infinity-query.ts +245 -0
  28. package/src/lib/infinite-query/infinity-query.types.ts +149 -0
  29. package/src/lib/infinite-query/infinity-query.utils.ts +14 -0
  30. package/src/lib/logger/logger.ts +30 -0
  31. package/src/lib/query/query.ts +631 -0
  32. package/src/lib/query/query.types.ts +532 -0
  33. package/src/lib/query/query.utils.spec.ts +92 -0
  34. package/src/lib/query/query.utils.ts +450 -0
  35. package/src/lib/query-client/query-client.spec.ts +77 -0
  36. package/src/lib/query-client/query-client.ts +195 -0
  37. package/src/lib/query-client/query-client.types.ts +101 -0
  38. package/src/lib/query-client/query-client.utils.spec.ts +61 -0
  39. package/src/lib/query-client/query-client.utils.ts +28 -0
  40. package/src/lib/query-creator/query-creator.ts +103 -0
  41. package/src/lib/query-creator/query-creator.types.ts +74 -0
  42. package/src/lib/query-form/query-form.ts +526 -0
  43. package/src/lib/query-form/query-form.types.ts +169 -0
  44. package/src/lib/query-form/query-form.utils.ts +116 -0
  45. package/src/lib/query-store/query-store.ts +192 -0
  46. package/src/lib/request/request.ts +253 -0
  47. package/src/lib/request/request.types.ts +164 -0
  48. package/src/lib/request/request.util.spec.ts +177 -0
  49. package/src/lib/request/request.util.ts +399 -0
  50. package/src/lib/stories/angular-example-page.mdx +85 -0
  51. package/src/lib/stories/authentication-page.mdx +35 -0
  52. package/src/lib/stories/changelog-page.mdx +9 -0
  53. package/src/lib/stories/client-page.mdx +100 -0
  54. package/src/lib/stories/queries-page.mdx +117 -0
  55. package/src/lib/symfony/symfony.types.ts +21 -0
  56. package/src/lib/symfony/symfony.utils.ts +43 -0
  57. package/src/lib/utils/data.utils.ts +280 -0
  58. package/src/lib/utils/deep-freeze.util.ts +21 -0
  59. package/{lib/utils/def.util.d.ts → src/lib/utils/def.util.ts} +1 -1
  60. package/src/test-setup.ts +1 -0
  61. package/tsconfig.json +29 -0
  62. package/tsconfig.lib.json +12 -0
  63. package/tsconfig.lib.prod.json +10 -0
  64. package/tsconfig.spec.json +11 -0
  65. package/esm2022/ethlete-query.mjs +0 -5
  66. package/esm2022/index.mjs +0 -20
  67. package/esm2022/lib/auth/auth-provider.types.mjs +0 -2
  68. package/esm2022/lib/auth/auth-provider.utils.mjs +0 -25
  69. package/esm2022/lib/auth/basic-auth-provider.mjs +0 -15
  70. package/esm2022/lib/auth/bearer-auth-provider.mjs +0 -168
  71. package/esm2022/lib/auth/custom-header-auth-provider.mjs +0 -12
  72. package/esm2022/lib/auth/index.mjs +0 -6
  73. package/esm2022/lib/class-validator/class-validator.types.mjs +0 -2
  74. package/esm2022/lib/class-validator/class-validator.utils.mjs +0 -4
  75. package/esm2022/lib/class-validator/index.mjs +0 -3
  76. package/esm2022/lib/devtools/components/query-devtools/index.mjs +0 -2
  77. package/esm2022/lib/devtools/components/query-devtools/query-devtools.component.mjs +0 -297
  78. package/esm2022/lib/devtools/pipes/index.mjs +0 -2
  79. package/esm2022/lib/devtools/pipes/query-short-name.pipe.mjs +0 -24
  80. package/esm2022/lib/devtools/utils/index.mjs +0 -2
  81. package/esm2022/lib/devtools/utils/query-client.utils.mjs +0 -13
  82. package/esm2022/lib/directives/index.mjs +0 -4
  83. package/esm2022/lib/directives/infinity-query-trigger.directive.mjs +0 -56
  84. package/esm2022/lib/directives/infinity-query.directive.mjs +0 -147
  85. package/esm2022/lib/directives/query.directive.mjs +0 -123
  86. package/esm2022/lib/entity/entity-store.mjs +0 -127
  87. package/esm2022/lib/entity/entity.types.mjs +0 -2
  88. package/esm2022/lib/entity/entity.utils.mjs +0 -29
  89. package/esm2022/lib/entity/index.mjs +0 -4
  90. package/esm2022/lib/gql/gql.mjs +0 -23
  91. package/esm2022/lib/gql/index.mjs +0 -2
  92. package/esm2022/lib/infinite-query/index.mjs +0 -4
  93. package/esm2022/lib/infinite-query/infinity-query.mjs +0 -171
  94. package/esm2022/lib/infinite-query/infinity-query.types.mjs +0 -2
  95. package/esm2022/lib/infinite-query/infinity-query.utils.mjs +0 -3
  96. package/esm2022/lib/logger/index.mjs +0 -2
  97. package/esm2022/lib/logger/logger.mjs +0 -16
  98. package/esm2022/lib/query/index.mjs +0 -4
  99. package/esm2022/lib/query/query.mjs +0 -428
  100. package/esm2022/lib/query/query.types.mjs +0 -2
  101. package/esm2022/lib/query/query.utils.mjs +0 -253
  102. package/esm2022/lib/query-client/index.mjs +0 -4
  103. package/esm2022/lib/query-client/query-client.mjs +0 -80
  104. package/esm2022/lib/query-client/query-client.types.mjs +0 -2
  105. package/esm2022/lib/query-client/query-client.utils.mjs +0 -20
  106. package/esm2022/lib/query-creator/index.mjs +0 -3
  107. package/esm2022/lib/query-creator/query-creator.mjs +0 -55
  108. package/esm2022/lib/query-creator/query-creator.types.mjs +0 -2
  109. package/esm2022/lib/query-form/index.mjs +0 -4
  110. package/esm2022/lib/query-form/query-form.mjs +0 -368
  111. package/esm2022/lib/query-form/query-form.types.mjs +0 -2
  112. package/esm2022/lib/query-form/query-form.utils.mjs +0 -97
  113. package/esm2022/lib/query-store/index.mjs +0 -2
  114. package/esm2022/lib/query-store/query-store.mjs +0 -144
  115. package/esm2022/lib/request/index.mjs +0 -4
  116. package/esm2022/lib/request/request.mjs +0 -196
  117. package/esm2022/lib/request/request.types.mjs +0 -2
  118. package/esm2022/lib/request/request.util.mjs +0 -252
  119. package/esm2022/lib/symfony/index.mjs +0 -3
  120. package/esm2022/lib/symfony/symfony.types.mjs +0 -2
  121. package/esm2022/lib/symfony/symfony.utils.mjs +0 -31
  122. package/esm2022/lib/utils/data.utils.mjs +0 -138
  123. package/esm2022/lib/utils/deep-freeze.util.mjs +0 -17
  124. package/esm2022/lib/utils/def.util.mjs +0 -8
  125. package/esm2022/lib/utils/index.mjs +0 -4
  126. package/fesm2022/ethlete-query.mjs +0 -3276
  127. package/fesm2022/ethlete-query.mjs.map +0 -1
  128. package/lib/auth/auth-provider.types.d.ts +0 -133
  129. package/lib/auth/auth-provider.utils.d.ts +0 -9
  130. package/lib/auth/basic-auth-provider.d.ts +0 -10
  131. package/lib/auth/bearer-auth-provider.d.ts +0 -23
  132. package/lib/auth/custom-header-auth-provider.d.ts +0 -9
  133. package/lib/class-validator/class-validator.utils.d.ts +0 -2
  134. package/lib/devtools/components/query-devtools/query-devtools.component.d.ts +0 -151
  135. package/lib/devtools/pipes/query-short-name.pipe.d.ts +0 -8
  136. package/lib/devtools/utils/query-client.utils.d.ts +0 -12
  137. package/lib/directives/infinity-query-trigger.directive.d.ts +0 -15
  138. package/lib/directives/infinity-query.directive.d.ts +0 -49
  139. package/lib/directives/query.directive.d.ts +0 -63
  140. package/lib/entity/entity-store.d.ts +0 -25
  141. package/lib/entity/entity.types.d.ts +0 -25
  142. package/lib/entity/entity.utils.d.ts +0 -12
  143. package/lib/gql/gql.d.ts +0 -6
  144. package/lib/infinite-query/infinity-query.d.ts +0 -29
  145. package/lib/infinite-query/infinity-query.types.d.ts +0 -104
  146. package/lib/infinite-query/infinity-query.utils.d.ts +0 -4
  147. package/lib/logger/logger.d.ts +0 -12
  148. package/lib/query/query.d.ts +0 -60
  149. package/lib/query/query.types.d.ts +0 -388
  150. package/lib/query/query.utils.d.ts +0 -91
  151. package/lib/query-client/query-client.d.ts +0 -29
  152. package/lib/query-client/query-client.types.d.ts +0 -82
  153. package/lib/query-client/query-client.utils.d.ts +0 -4
  154. package/lib/query-creator/query-creator.d.ts +0 -20
  155. package/lib/query-creator/query-creator.types.d.ts +0 -13
  156. package/lib/query-form/query-form.d.ts +0 -89
  157. package/lib/query-form/query-form.types.d.ts +0 -138
  158. package/lib/query-form/query-form.utils.d.ts +0 -13
  159. package/lib/query-store/query-store.d.ts +0 -31
  160. package/lib/request/request.d.ts +0 -3
  161. package/lib/request/request.types.d.ts +0 -126
  162. package/lib/request/request.util.d.ts +0 -92
  163. package/lib/symfony/symfony.types.d.ts +0 -19
  164. package/lib/symfony/symfony.utils.d.ts +0 -6
  165. package/lib/utils/data.utils.d.ts +0 -59
  166. package/lib/utils/deep-freeze.util.d.ts +0 -1
  167. /package/{lib/auth/index.d.ts → src/lib/auth/index.ts} +0 -0
  168. /package/{lib/class-validator/index.d.ts → src/lib/class-validator/index.ts} +0 -0
  169. /package/{lib/devtools/components/query-devtools/index.d.ts → src/lib/devtools/components/query-devtools/index.ts} +0 -0
  170. /package/{lib/devtools/pipes/index.d.ts → src/lib/devtools/pipes/index.ts} +0 -0
  171. /package/{lib/devtools/utils/index.d.ts → src/lib/devtools/utils/index.ts} +0 -0
  172. /package/{lib/directives/index.d.ts → src/lib/directives/index.ts} +0 -0
  173. /package/{lib/entity/index.d.ts → src/lib/entity/index.ts} +0 -0
  174. /package/{lib/gql/index.d.ts → src/lib/gql/index.ts} +0 -0
  175. /package/{lib/infinite-query/index.d.ts → src/lib/infinite-query/index.ts} +0 -0
  176. /package/{lib/logger/index.d.ts → src/lib/logger/index.ts} +0 -0
  177. /package/{lib/query/index.d.ts → src/lib/query/index.ts} +0 -0
  178. /package/{lib/query-client/index.d.ts → src/lib/query-client/index.ts} +0 -0
  179. /package/{lib/query-creator/index.d.ts → src/lib/query-creator/index.ts} +0 -0
  180. /package/{lib/query-form/index.d.ts → src/lib/query-form/index.ts} +0 -0
  181. /package/{lib/query-store/index.d.ts → src/lib/query-store/index.ts} +0 -0
  182. /package/{lib/request/index.d.ts → src/lib/request/index.ts} +0 -0
  183. /package/{lib/symfony/index.d.ts → src/lib/symfony/index.ts} +0 -0
  184. /package/{lib/utils/index.d.ts → src/lib/utils/index.ts} +0 -0
@@ -1,428 +0,0 @@
1
- import { untracked } from '@angular/core';
2
- import { BehaviorSubject, combineLatest, filter, interval, map, of, ReplaySubject, shareReplay, skip, Subject, switchMap, take, takeUntil, takeWhile, tap, timer, } from 'rxjs';
3
- import { isBearerAuthProvider } from '../auth';
4
- import { shouldCacheQuery } from '../query-client';
5
- import { request } from '../request';
6
- import { computeQueryBody, computeQueryHeaders, computeQueryMethod, filterFailure, filterSuccess, isGqlQueryConfig, isQueryStateCancelled, isQueryStateFailure, isQueryStateLoading, isQueryStatePrepared, isQueryStateSuccess, switchQueryState, takeUntilResponse, } from './query.utils';
7
- let _nextQueryId = 0;
8
- export class Query {
9
- get _nextId() {
10
- return ++this._currentLocalId;
11
- }
12
- get state$() {
13
- return this._state$.pipe(tap((s) => {
14
- if (!this._client.config.logging?.preparedQuerySubscriptions)
15
- return;
16
- if (isQueryStatePrepared(s)) {
17
- console.warn(`Query ${this._routeWithParams} was subscribed to in the prepared state. Did you forget to call .execute()?`);
18
- }
19
- }), switchMap((s) => this._transformState(s)), shareReplay({ bufferSize: 1, refCount: true }));
20
- }
21
- /**
22
- * The current state of the query.
23
- *
24
- * **Warning!** This differs from the `state$` observable in that it does not use the query store. Thus, the response data might be outdated.
25
- * Use `state$` (or `firstValueFrom(state$)`) the most up-to-date data.
26
- */
27
- get rawState() {
28
- return this._state$.value;
29
- }
30
- get isExpired() {
31
- if (isQueryStateLoading(this.rawState)) {
32
- return false;
33
- }
34
- if (isQueryStatePrepared(this.rawState) ||
35
- isQueryStateCancelled(this.rawState) ||
36
- isQueryStateFailure(this.rawState)) {
37
- return true;
38
- }
39
- const ts = this.rawState.meta.expiresAt;
40
- if (!ts) {
41
- return true;
42
- }
43
- return ts < Date.now();
44
- }
45
- get isInUse() {
46
- return this._state$.observed || Object.keys(this._dependents).length > 0;
47
- }
48
- /**
49
- * @internal
50
- */
51
- get _subscriberCount() {
52
- return this._state$.observers.length;
53
- }
54
- get isPolling() {
55
- return !!this._pollingSubscription;
56
- }
57
- get autoRefreshOnConfig() {
58
- const base = this._queryConfig.autoRefreshOn ?? {};
59
- const transformed = {
60
- queryClientDefaultHeadersChange: base.queryClientDefaultHeadersChange ?? true,
61
- windowFocus: base.windowFocus ?? true,
62
- };
63
- return transformed;
64
- }
65
- /**
66
- * @internal
67
- */
68
- get _enableSmartPolling() {
69
- return this._queryConfig.enableSmartPolling ?? true;
70
- }
71
- get store() {
72
- return this._queryConfig.entity?.store ?? null;
73
- }
74
- get canBeCached() {
75
- return shouldCacheQuery(this._queryConfig.method);
76
- }
77
- get _isInMockMode() {
78
- return !!this._arguments?.mock;
79
- }
80
- constructor(_client,
81
- /**
82
- * @internal
83
- */
84
- _queryConfig,
85
- /**
86
- * @internal
87
- */
88
- _routeWithParams,
89
- /**
90
- * @internal
91
- */
92
- _arguments,
93
- /**
94
- * @internal
95
- */
96
- _queryStoreKey) {
97
- this._client = _client;
98
- this._queryConfig = _queryConfig;
99
- this._routeWithParams = _routeWithParams;
100
- this._arguments = _arguments;
101
- this._queryStoreKey = _queryStoreKey;
102
- this._id = _nextQueryId++;
103
- this._currentLocalId = 0;
104
- this._pollingSubscription = null;
105
- this._onAbort$ = new Subject();
106
- this._currentPollConfig = null;
107
- /**
108
- * @internal
109
- * Used to track which components depend on this query.
110
- * The key is the component's _tNode index.
111
- * The value is the number of times the component has subscribed to this query.
112
- * The value might increase since we cant distinguish between a component and a host directive applied to it.
113
- */
114
- this._dependents = {};
115
- /**
116
- * @internal
117
- */
118
- this._dependentsChanged$ = new ReplaySubject();
119
- /**
120
- * @internal
121
- */
122
- this._isPollingPaused = false;
123
- this._state$ = new BehaviorSubject({
124
- type: "PREPARED" /* QueryStateType.Prepared */,
125
- meta: { id: this._currentLocalId, triggeredVia: 'program' },
126
- });
127
- }
128
- execute(options = {}) {
129
- const { skipCache = false, _triggeredVia: triggeredVia = 'program', cancelPrevious = false } = options;
130
- const { authProvider } = this._client;
131
- const queryConfig = this._queryConfig;
132
- if (!this.isExpired && !skipCache && isQueryStateSuccess(this.rawState)) {
133
- return this;
134
- }
135
- if (queryConfig.secure && !authProvider && !this._isInMockMode) {
136
- throw new Error('Cannot execute secure query without auth provider');
137
- }
138
- const id = this._nextId;
139
- const meta = { id, triggeredVia };
140
- if (isQueryStateLoading(this.rawState)) {
141
- if (cancelPrevious) {
142
- this.abort();
143
- }
144
- else {
145
- return this;
146
- }
147
- }
148
- this._updateState({ type: "LOADING" /* QueryStateType.Loading */, meta });
149
- if (this._isInMockMode) {
150
- this._mockRequest({}, meta, options);
151
- }
152
- else {
153
- let goSignal = of(true);
154
- if (authProvider &&
155
- isBearerAuthProvider(authProvider) &&
156
- queryConfig.secure &&
157
- !isQueryStateSuccess(authProvider.currentRefreshQuery?.rawState)) {
158
- // On page load the query might be executed before the auth provider has been initialized.
159
- // In this case we need to wait for the auth provider to be ready before we can execute the query.
160
- goSignal = combineLatest([
161
- // The tokens might get set without a refresh query being created (e.g.) directly after login.
162
- authProvider.currentRefreshQuery$.pipe(switchQueryState(), takeUntilResponse()),
163
- authProvider.tokens$.pipe(take(1)),
164
- ]).pipe(takeUntil(this._onAbort$), filter(([state, tokens]) => {
165
- if (state) {
166
- return !isQueryStateLoading(state);
167
- }
168
- return !!tokens;
169
- }), tap(([state]) => {
170
- if (isQueryStateFailure(state)) {
171
- this._updateEntityState({ type: 'failure', error: state.error, headers: {} }, meta, options);
172
- }
173
- }), map(() => true), take(1));
174
- }
175
- goSignal
176
- .pipe(switchMap(() => {
177
- const method = computeQueryMethod({ config: queryConfig, client: this._client });
178
- const body = computeQueryBody({ config: queryConfig, client: this._client, args: this._arguments, method });
179
- const headers = computeQueryHeaders({ client: this._client, config: queryConfig, args: this._arguments });
180
- return request({
181
- urlWithParams: this._routeWithParams,
182
- method,
183
- body,
184
- headers,
185
- reportProgress: queryConfig.reportProgress,
186
- responseType: queryConfig.responseType,
187
- withCredentials: queryConfig.withCredentials,
188
- cacheAdapter: this._client.config.request?.cacheAdapter,
189
- retryFn: this._client.config.request?.retryFn,
190
- }).pipe(tap((state) => this._updateEntityState(state, meta, options)), takeUntil(this._onAbort$));
191
- }))
192
- .subscribe();
193
- }
194
- return this;
195
- }
196
- abort() {
197
- if (!isQueryStateLoading(this.rawState)) {
198
- return this;
199
- }
200
- this._onAbort$.next();
201
- this._updateState({
202
- type: "CANCELLED" /* QueryStateType.Cancelled */,
203
- meta: { id: this.rawState.meta.id, triggeredVia: this.rawState.meta.triggeredVia },
204
- });
205
- return this;
206
- }
207
- poll(config) {
208
- if (this._pollingSubscription) {
209
- return this;
210
- }
211
- this._currentPollConfig = config;
212
- const interval$ = interval(config.interval);
213
- const poll$ = interval$.pipe(skip(config.triggerImmediately ? 0 : 1), takeUntil(config.takeUntil), takeWhile(() => !this._isPollingPaused), filter(() => !isQueryStateLoading(this._state$.value)));
214
- this._pollingSubscription = poll$.subscribe({
215
- next: () => this.execute({ skipCache: true, _triggeredVia: 'poll' }),
216
- complete: () => this.stopPolling(),
217
- });
218
- return this;
219
- }
220
- stopPolling() {
221
- this._pollingSubscription?.unsubscribe();
222
- this._pollingSubscription = null;
223
- this._currentPollConfig = null;
224
- return this;
225
- }
226
- pausePolling() {
227
- this._pollingSubscription?.unsubscribe();
228
- this._pollingSubscription = null;
229
- this._isPollingPaused = true;
230
- return this;
231
- }
232
- resumePolling() {
233
- if (!this._isPollingPaused || !this._currentPollConfig) {
234
- return this;
235
- }
236
- this._isPollingPaused = false;
237
- return this.poll({ ...this._currentPollConfig, triggerImmediately: true });
238
- }
239
- onSuccess(callback) {
240
- this.state$.pipe(takeUntilResponse(), filterSuccess()).subscribe((state) => callback(state.response));
241
- return this;
242
- }
243
- onFailure(callback) {
244
- this.state$.pipe(takeUntilResponse(), filterFailure()).subscribe((state) => callback(state.error));
245
- return this;
246
- }
247
- _getBearerAuthProvider() {
248
- const authProvider = this._client.authProvider;
249
- if (authProvider && isBearerAuthProvider(authProvider)) {
250
- return authProvider;
251
- }
252
- return null;
253
- }
254
- _updateEntityState(requestEvent, meta, options) {
255
- switch (requestEvent.type) {
256
- case 'start':
257
- case 'delay-retry': {
258
- const { type, retryDelay, retryNumber } = requestEvent;
259
- const newMeta = { ...meta, isWaitingForRetry: type === 'delay-retry', retryDelay, retryNumber };
260
- this._updateState({
261
- type: "LOADING" /* QueryStateType.Loading */,
262
- meta: newMeta,
263
- });
264
- break;
265
- }
266
- case 'upload-progress':
267
- case 'download-progress': {
268
- this._updateState({
269
- type: "LOADING" /* QueryStateType.Loading */,
270
- progress: requestEvent.progress,
271
- partialText: 'partialText' in requestEvent ? requestEvent.partialText : undefined,
272
- meta,
273
- });
274
- break;
275
- }
276
- case 'success': {
277
- const { response, expiresInTimestamp } = requestEvent;
278
- const isGql = isGqlQueryConfig(this._queryConfig);
279
- const responseData = isGql && typeof response === 'object' && !!response && 'data' in response
280
- ? response['data']
281
- : response;
282
- if (this._queryConfig.entity && this._queryConfig.entity.set) {
283
- const id = this._queryConfig.entity?.id({ args: this._arguments, response: responseData });
284
- this._queryConfig.entity?.set({
285
- args: this._arguments,
286
- response: responseData,
287
- id,
288
- store: this._queryConfig.entity.store,
289
- });
290
- }
291
- this._updateState({
292
- type: "SUCCESS" /* QueryStateType.Success */,
293
- response: responseData,
294
- meta: { ...meta, expiresAt: expiresInTimestamp },
295
- });
296
- break;
297
- }
298
- case 'failure': {
299
- const { error } = requestEvent;
300
- const failure = () => this._updateState({ type: "FAILURE" /* QueryStateType.Failure */, error, meta });
301
- const bearerAuthProvider = this._getBearerAuthProvider();
302
- if (!bearerAuthProvider ||
303
- options?._isUnauthorizedRetry ||
304
- error.status !== 401 /* HttpStatusCode.Unauthorized */ ||
305
- !bearerAuthProvider.shouldRefreshOnUnauthorizedResponse) {
306
- return failure();
307
- }
308
- const query = bearerAuthProvider._refreshQuery();
309
- if (!query)
310
- return failure();
311
- query.state$
312
- .pipe(takeUntilResponse(), takeUntil(this._onAbort$), tap((state) => isQueryStateSuccess(state) ? this.execute({ ...options, _isUnauthorizedRetry: true }) : failure()))
313
- .subscribe();
314
- break;
315
- }
316
- case 'cancel': {
317
- this._updateState({
318
- type: "CANCELLED" /* QueryStateType.Cancelled */,
319
- meta,
320
- });
321
- break;
322
- }
323
- }
324
- }
325
- _transformState(s) {
326
- if (!isQueryStateSuccess(s) || !this._queryConfig.entity?.get) {
327
- return of(s);
328
- }
329
- const id = this._queryConfig.entity.id({ args: this._arguments, response: s.response });
330
- return this._queryConfig.entity
331
- .get({ args: this._arguments, id, response: s.response, store: this._queryConfig.entity.store })
332
- .pipe(map((v) => ({ ...s, response: v })));
333
- }
334
- _updateState(s) {
335
- // We need to use untracked here to avoid Angular's "allowSignalWrites is false" error when executing queries inside Angular's computed/effect signal functions.
336
- untracked(() => this._state$.next(s));
337
- }
338
- _mockRequest(headers, meta, options) {
339
- if (!this._arguments?.mock)
340
- return;
341
- const { delay = 200, error, response, retryIntoResponse = false, progress } = this._arguments.mock;
342
- const progressFileSize = progress?.fileSize ?? 1000000;
343
- const progressEventType = progress?.eventType ?? 'upload';
344
- const progressEventCount = progress?.eventCount ?? 5;
345
- const progressOmitTotal = progress?.omitTotal ?? false;
346
- const omitPartialText = progress?.omitPartialText ?? false;
347
- const finalResolveMock = () => {
348
- if (error) {
349
- this._updateEntityState({ error, headers: headers ?? {}, type: 'failure' }, meta, options);
350
- return;
351
- }
352
- this._updateEntityState({ response: response, headers: headers ?? {}, type: 'success' }, meta, options);
353
- };
354
- if (progress) {
355
- interval(delay)
356
- .pipe(tap((a) => {
357
- if (a === progressEventCount + 1) {
358
- finalResolveMock();
359
- }
360
- else {
361
- const current = Math.min(progressFileSize * a, progressFileSize * progressEventCount);
362
- const percentage = (current / (progressFileSize * progressEventCount)) * 100;
363
- this._updateEntityState({
364
- type: progressEventType === 'upload' ? 'upload-progress' : 'download-progress',
365
- headers: headers ?? {},
366
- progress: { current, ...(progressOmitTotal ? {} : { percentage, total: progressFileSize }) },
367
- partialText: omitPartialText ? undefined : `Partial text ${a}`,
368
- }, meta, options);
369
- }
370
- }), takeUntil(this._onAbort$), takeWhile((a) => a < progressEventCount + 1, true))
371
- .subscribe();
372
- }
373
- else if (retryIntoResponse) {
374
- interval(delay)
375
- .pipe(tap((a) => {
376
- if (a === 3) {
377
- finalResolveMock();
378
- }
379
- else {
380
- const aModified = a + 1;
381
- this._updateEntityState({
382
- type: 'delay-retry',
383
- headers: headers ?? {},
384
- retryDelay: 1000 + 1000 * aModified,
385
- retryNumber: aModified,
386
- }, meta, options);
387
- }
388
- }), takeUntil(this._onAbort$), takeWhile((a) => a < 3, true))
389
- .subscribe();
390
- }
391
- else {
392
- timer(delay)
393
- .pipe(tap(() => finalResolveMock()), takeUntil(this._onAbort$))
394
- .subscribe();
395
- }
396
- }
397
- /**
398
- * @internal
399
- */
400
- _addDependent(tNodeIndex) {
401
- if (!this._dependents[tNodeIndex]) {
402
- this._dependents[tNodeIndex] = 0;
403
- }
404
- this._dependents[tNodeIndex]++;
405
- this._dependentsChanged$.next(this._dependents);
406
- }
407
- /**
408
- * @internal
409
- */
410
- _removeDependent(tNodeIndex) {
411
- const count = this._dependents[tNodeIndex];
412
- if (count === undefined) {
413
- return;
414
- }
415
- this._dependents[tNodeIndex]--;
416
- if (count <= 1) {
417
- delete this._dependents[tNodeIndex];
418
- }
419
- this._dependentsChanged$.next(this._dependents);
420
- }
421
- /**
422
- * @internal
423
- */
424
- _hasDependents() {
425
- return Object.keys(this._dependents).length > 0;
426
- }
427
- }
428
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlcnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL3F1ZXJ5L3NyYy9saWIvcXVlcnkvcXVlcnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMxQyxPQUFPLEVBQ0wsZUFBZSxFQUNmLGFBQWEsRUFDYixNQUFNLEVBQ04sUUFBUSxFQUNSLEdBQUcsRUFFSCxFQUFFLEVBQ0YsYUFBYSxFQUNiLFdBQVcsRUFDWCxJQUFJLEVBQ0osT0FBTyxFQUVQLFNBQVMsRUFDVCxJQUFJLEVBQ0osU0FBUyxFQUNULFNBQVMsRUFDVCxHQUFHLEVBQ0gsS0FBSyxHQUNOLE1BQU0sTUFBTSxDQUFDO0FBQ2QsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sU0FBUyxDQUFDO0FBRS9DLE9BQU8sRUFBZSxnQkFBZ0IsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ2hFLE9BQU8sRUFBa0IsT0FBTyxFQUE4QyxNQUFNLFlBQVksQ0FBQztBQWFqRyxPQUFPLEVBQ0wsZ0JBQWdCLEVBQ2hCLG1CQUFtQixFQUNuQixrQkFBa0IsRUFDbEIsYUFBYSxFQUNiLGFBQWEsRUFDYixnQkFBZ0IsRUFDaEIscUJBQXFCLEVBQ3JCLG1CQUFtQixFQUNuQixtQkFBbUIsRUFDbkIsb0JBQW9CLEVBQ3BCLG1CQUFtQixFQUNuQixnQkFBZ0IsRUFDaEIsaUJBQWlCLEdBQ2xCLE1BQU0sZUFBZSxDQUFDO0FBRXZCLElBQUksWUFBWSxHQUFHLENBQUMsQ0FBQztBQUVyQixNQUFNLE9BQU8sS0FBSztJQXVDaEIsSUFBWSxPQUFPO1FBQ2pCLE9BQU8sRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDO0lBQ2hDLENBQUM7SUFFRCxJQUFJLE1BQU07UUFDUixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUN0QixHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtZQUNSLElB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QkFBZ0IsQ0FBQyxVQUFrQjtRQUNqQyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzNDLElBQUksS0FBSyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ3hCLE9BQU87UUFDVCxDQUFDO1FBRUQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO1FBRS9CLElBQUksS0FBSyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ2YsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3RDLENBQUM7UUFFRCxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUNsRCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxjQUFjO1FBQ1osT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBQ2xELENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHVudHJhY2tlZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgQmVoYXZpb3JTdWJqZWN0LFxuICBjb21iaW5lTGF0ZXN0LFxuICBmaWx0ZXIsXG4gIGludGVydmFsLFxuICBtYXAsXG4gIE9ic2VydmFibGUsXG4gIG9mLFxuICBSZXBsYXlTdWJqZWN0LFxuICBzaGFyZVJlcGxheSxcbiAgc2tpcCxcbiAgU3ViamVjdCxcbiAgU3Vic2NyaXB0aW9uLFxuICBzd2l0Y2hNYXAsXG4gIHRha2UsXG4gIHRha2VVbnRpbCxcbiAgdGFrZVdoaWxlLFxuICB0YXAsXG4gIHRpbWVyLFxufSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGlzQmVhcmVyQXV0aFByb3ZpZGVyIH0gZnJvbSAnLi4vYXV0aCc7XG5pbXBvcnQgeyBFbnRpdHlTdG9yZSB9IGZyb20gJy4uL2VudGl0eSc7XG5pbXBvcnQgeyBRdWVyeUNsaWVudCwgc2hvdWxkQ2FjaGVRdWVyeSB9IGZyb20gJy4uL3F1ZXJ5LWNsaWVudCc7XG5pbXBvcnQgeyBIdHRwU3RhdHVzQ29kZSwgcmVxdWVzdCwgUmVxdWVzdEVycm9yLCBSZXF1ZXN0RXZlbnQsIFJlcXVlc3RIZWFkZXJzIH0gZnJvbSAnLi4vcmVxdWVzdCc7XG5pbXBvcnQge1xuICBCYXNlQXJndW1lbnRzLFxuICBFeGVjdXRlUXVlcnlPcHRpb25zLFxuICBHcWxRdWVyeUNvbmZpZyxcbiAgUG9sbENvbmZpZyxcbiAgUXVlcnlBdXRvUmVmcmVzaENvbmZpZyxcbiAgUXVlcnlTdGF0ZSxcbiAgUXVlcnlTdGF0ZU1ldGEsXG4gIFF1ZXJ5U3RhdGVUeXBlLFxuICBSZXN0UXVlcnlDb25maWcsXG4gIFJvdXRlVHlwZSxcbn0gZnJvbSAnLi9xdWVyeS50eXBlcyc7XG5pbXBvcnQge1xuICBjb21wdXRlUXVlcnlCb2R5LFxuICBjb21wdXRlUXVlcnlIZWFkZXJzLFxuICBjb21wdXRlUXVlcnlNZXRob2QsXG4gIGZpbHRlckZhaWx1cmUsXG4gIGZpbHRlclN1Y2Nlc3MsXG4gIGlzR3FsUXVlcnlDb25maWcsXG4gIGlzUXVlcnlTdGF0ZUNhbmNlbGxlZCxcbiAgaXNRdWVyeVN0YXRlRmFpbHVyZSxcbiAgaXNRdWVyeVN0YXRlTG9hZGluZyxcbiAgaXNRdWVyeVN0YXRlUHJlcGFyZWQsXG4gIGlzUXVlcnlTdGF0ZVN1Y2Nlc3MsXG4gIHN3aXRjaFF1ZXJ5U3RhdGUsXG4gIHRha2VVbnRpbFJlc3BvbnNlLFxufSBmcm9tICcuL3F1ZXJ5LnV0aWxzJztcblxubGV0IF9uZXh0UXVlcnlJZCA9IDA7XG5cbmV4cG9ydCBjbGFzcyBRdWVyeTxcbiAgUmVzcG9uc2UsXG4gIEFyZ3VtZW50cyBleHRlbmRzIEJhc2VBcmd1bWVudHMgfCB1bmRlZmluZWQsXG4gIFJvdXRlIGV4dGVuZHMgUm91dGVUeXBlPEFyZ3VtZW50cz4sXG4gIFN0b3JlIGV4dGVuZHMgRW50aXR5U3RvcmU8dW5rbm93bj4sXG4gIERhdGEsXG4gIElkLFxuPiB7XG4gIHJlYWRvbmx5IF9pZCA9IF9uZXh0UXVlcnlJZCsrO1xuXG4gIHByaXZhdGUgX2N1cnJlbnRMb2NhbElkID0gMDtcbiAgcHJpdmF0ZSBfcG9sbGluZ1N1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgX29uQWJvcnQkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgcHJpdmF0ZSBfY3VycmVudFBvbGxDb25maWc6IFBvbGxDb25maWcgfCBudWxsID0gbnVsbDtcblxuICAvKipcbiAgICogQGludGVybmFsXG4gICAqIFVzZWQgdG8gdHJhY2sgd2hpY2ggY29tcG9uZW50cyBkZXBlbmQgb24gdGhpcyBxdWVyeS5cbiAgICogVGhlIGtleSBpcyB0aGUgY29tcG9uZW50J3MgX3ROb2RlIGluZGV4LlxuICAgKiBUaGUgdmFsdWUgaXMgdGhlIG51bWJlciBvZiB0aW1lcyB0aGUgY29tcG9uZW50IGhhcyBzdWJzY3JpYmVkIHRvIHRoaXMgcXVlcnkuXG4gICAqIFRoZSB2YWx1ZSBtaWdodCBpbmNyZWFzZSBzaW5jZSB3ZSBjYW50IGRpc3Rpbmd1aXNoIGJldHdlZW4gYSBjb21wb25lbnQgYW5kIGEgaG9zdCBkaXJlY3RpdmUgYXBwbGllZCB0byBpdC5cbiAgICovXG4gIF9kZXBlbmRlbnRzOiBSZWNvcmQ8bnVtYmVyLCBudW1iZXI+ID0ge307XG5cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgX2RlcGVuZGVudHNDaGFuZ2VkJCA9IG5ldyBSZXBsYXlTdWJqZWN0PFJlY29yZDxudW1iZXIsIG51bWJlcj4+KCk7XG5cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgX2lzUG9sbGluZ1BhdXNlZCA9IGZhbHNlO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX3N0YXRlJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8UXVlcnlTdGF0ZTxSZXNwb25zZT4+KHtcbiAgICB0eXBlOiBRdWVyeVN0YXRlVHlwZS5QcmVwYXJlZCxcbiAgICBtZXRhOiB7IGlkOiB0aGlzLl9jdXJyZW50TG9jYWxJZCwgdHJpZ2dlcmVkVmlhOiAncHJvZ3JhbScgfSxcbiAgfSk7XG5cbiAgcHJpdmF0ZSBnZXQgX25leHRJZCgpIHtcbiAgICByZXR1cm4gKyt0aGlzLl9jdXJyZW50TG9jYWxJZDtcbiAgfVxuXG4gIGdldCBzdGF0ZSQoKTogT2JzZXJ2YWJsZTxRdWVyeVN0YXRlPERhdGE+PiB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YXRlJC5waXBlKFxuICAgICAgdGFwKChzKSA9PiB7XG4gICAgICAgIGlmICghdGhpcy5fY2xpZW50LmNvbmZpZy5sb2dnaW5nPy5wcmVwYXJlZFF1ZXJ5U3Vic2NyaXB0aW9ucykgcmV0dXJuO1xuXG4gICAgICAgIGlmIChpc1F1ZXJ5U3RhdGVQcmVwYXJlZChzKSkge1xuICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgIGBRdWVyeSAke3RoaXMuX3JvdXRlV2l0aFBhcmFtc30gd2FzIHN1YnNjcmliZWQgdG8gaW4gdGhlIHByZXBhcmVkIHN0YXRlLiBEaWQgeW91IGZvcmdldCB0byBjYWxsIC5leGVjdXRlKCk/YCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9KSxcbiAgICAgIHN3aXRjaE1hcCgocykgPT4gdGhpcy5fdHJhbnNmb3JtU3RhdGUocykpLFxuICAgICAgc2hhcmVSZXBsYXkoeyBidWZmZXJTaXplOiAxLCByZWZDb3VudDogdHJ1ZSB9KSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBxdWVyeS5cbiAgICpcbiAgICogKipXYXJuaW5nISoqIFRoaXMgZGlmZmVycyBmcm9tIHRoZSBgc3RhdGUkYCBvYnNlcnZhYmxlIGluIHRoYXQgaXQgZG9lcyBub3QgdXNlIHRoZSBxdWVyeSBzdG9yZS4gVGh1cywgdGhlIHJlc3BvbnNlIGRhdGEgbWlnaHQgYmUgb3V0ZGF0ZWQuXG4gICAqIFVzZSBgc3RhdGUkYCAob3IgYGZpcnN0VmFsdWVGcm9tKHN0YXRlJClgKSB0aGUgbW9zdCB1cC10by1kYXRlIGRhdGEuXG4gICAqL1xuICBnZXQgcmF3U3RhdGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YXRlJC52YWx1ZTtcbiAgfVxuXG4gIGdldCBpc0V4cGlyZWQoKSB7XG4gICAgaWYgKGlzUXVlcnlTdGF0ZUxvYWRpbmcodGhpcy5yYXdTdGF0ZSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICBpc1F1ZXJ5U3RhdGVQcmVwYXJlZCh0aGlzLnJhd1N0YXRlKSB8fFxuICAgICAgaXNRdWVyeVN0YXRlQ2FuY2VsbGVkKHRoaXMucmF3U3RhdGUpIHx8XG4gICAgICBpc1F1ZXJ5U3RhdGVGYWlsdXJlKHRoaXMucmF3U3RhdGUpXG4gICAgKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBjb25zdCB0cyA9IHRoaXMucmF3U3RhdGUubWV0YS5leHBpcmVzQXQ7XG5cbiAgICBpZiAoIXRzKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHMgPCBEYXRlLm5vdygpO1xuICB9XG5cbiAgZ2V0IGlzSW5Vc2UoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YXRlJC5vYnNlcnZlZCB8fCBPYmplY3Qua2V5cyh0aGlzLl9kZXBlbmRlbnRzKS5sZW5ndGggPiAwO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgZ2V0IF9zdWJzY3JpYmVyQ291bnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YXRlJC5vYnNlcnZlcnMubGVuZ3RoO1xuICB9XG5cbiAgZ2V0IGlzUG9sbGluZygpIHtcbiAgICByZXR1cm4gISF0aGlzLl9wb2xsaW5nU3Vic2NyaXB0aW9uO1xuICB9XG5cbiAgZ2V0IGF1dG9SZWZyZXNoT25Db25maWcoKSB7XG4gICAgY29uc3QgYmFzZSA9IHRoaXMuX3F1ZXJ5Q29uZmlnLmF1dG9SZWZyZXNoT24gPz8ge307XG5cbiAgICBjb25zdCB0cmFuc2Zvcm1lZDogUmVhZG9ubHk8UXVlcnlBdXRvUmVmcmVzaENvbmZpZz4gPSB7XG4gICAgICBxdWVyeUNsaWVudERlZmF1bHRIZWFkZXJzQ2hhbmdlOiBiYXNlLnF1ZXJ5Q2xpZW50RGVmYXVsdEhlYWRlcnNDaGFuZ2UgPz8gdHJ1ZSxcbiAgICAgIHdpbmRvd0ZvY3VzOiBiYXNlLndpbmRvd0ZvY3VzID8/IHRydWUsXG4gICAgfTtcblxuICAgIHJldHVybiB0cmFuc2Zvcm1lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIGdldCBfZW5hYmxlU21hcnRQb2xsaW5nKCkge1xuICAgIHJldHVybiB0aGlzLl9xdWVyeUNvbmZpZy5lbmFibGVTbWFydFBvbGxpbmcgPz8gdHJ1ZTtcbiAgfVxuXG4gIGdldCBzdG9yZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fcXVlcnlDb25maWcuZW50aXR5Py5zdG9yZSA/PyBudWxsO1xuICB9XG5cbiAgZ2V0IGNhbkJlQ2FjaGVkKCkge1xuICAgIHJldHVybiBzaG91bGRDYWNoZVF1ZXJ5KHRoaXMuX3F1ZXJ5Q29uZmlnLm1ldGhvZCk7XG4gIH1cblxuICBnZXQgX2lzSW5Nb2NrTW9kZSgpIHtcbiAgICByZXR1cm4gISF0aGlzLl9hcmd1bWVudHM/Lm1vY2s7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9jbGllbnQ6IFF1ZXJ5Q2xpZW50LFxuXG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIHJlYWRvbmx5IF9xdWVyeUNvbmZpZzpcbiAgICAgIHwgUmVzdFF1ZXJ5Q29uZmlnPFJvdXRlLCBSZXNwb25zZSwgQXJndW1lbnRzLCBTdG9yZSwgRGF0YSwgSWQ+XG4gICAgICB8IEdxbFF1ZXJ5Q29uZmlnPFJvdXRlLCBSZXNwb25zZSwgQXJndW1lbnRzLCBTdG9yZSwgRGF0YSwgSWQ+LFxuXG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIHJlYWRvbmx5IF9yb3V0ZVdpdGhQYXJhbXM6IFJvdXRlLFxuXG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIHJlYWRvbmx5IF9hcmd1bWVudHM6IEFyZ3VtZW50cyxcblxuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyByZWFkb25seSBfcXVlcnlTdG9yZUtleTogc3RyaW5nLFxuICApIHt9XG5cbiAgZXhlY3V0ZShvcHRpb25zOiBFeGVjdXRlUXVlcnlPcHRpb25zID0ge30pIHtcbiAgICBjb25zdCB7IHNraXBDYWNoZSA9IGZhbHNlLCBfdHJpZ2dlcmVkVmlhOiB0cmlnZ2VyZWRWaWEgPSAncHJvZ3JhbScsIGNhbmNlbFByZXZpb3VzID0gZmFsc2UgfSA9IG9wdGlvbnM7XG4gICAgY29uc3QgeyBhdXRoUHJvdmlkZXIgfSA9IHRoaXMuX2NsaWVudDtcbiAgICBjb25zdCBxdWVyeUNvbmZpZyA9IHRoaXMuX3F1ZXJ5Q29uZmlnO1xuXG4gICAgaWYgKCF0aGlzLmlzRXhwaXJlZCAmJiAhc2tpcENhY2hlICYmIGlzUXVlcnlTdGF0ZVN1Y2Nlc3ModGhpcy5yYXdTdGF0ZSkpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIGlmIChxdWVyeUNvbmZpZy5zZWN1cmUgJiYgIWF1dGhQcm92aWRlciAmJiAhdGhpcy5faXNJbk1vY2tNb2RlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBleGVjdXRlIHNlY3VyZSBxdWVyeSB3aXRob3V0IGF1dGggcHJvdmlkZXInKTtcbiAgICB9XG5cbiAgICBjb25zdCBpZCA9IHRoaXMuX25leHRJZDtcbiAgICBjb25zdCBtZXRhOiBRdWVyeVN0YXRlTWV0YSA9IHsgaWQsIHRyaWdnZXJlZFZpYSB9O1xuXG4gICAgaWYgKGlzUXVlcnlTdGF0ZUxvYWRpbmcodGhpcy5yYXdTdGF0ZSkpIHtcbiAgICAgIGlmIChjYW5jZWxQcmV2aW91cykge1xuICAgICAgICB0aGlzLmFib3J0KCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLl91cGRhdGVTdGF0ZSh7IHR5cGU6IFF1ZXJ5U3RhdGVUeXBlLkxvYWRpbmcsIG1ldGEgfSk7XG5cbiAgICBpZiAodGhpcy5faXNJbk1vY2tNb2RlKSB7XG4gICAgICB0aGlzLl9tb2NrUmVxdWVzdCh7fSwgbWV0YSwgb3B0aW9ucyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCBnb1NpZ25hbCA9IG9mKHRydWUpO1xuXG4gICAgICBpZiAoXG4gICAgICAgIGF1dGhQcm92aWRlciAmJlxuICAgICAgICBpc0JlYXJlckF1dGhQcm92aWRlcihhdXRoUHJvdmlkZXIpICYmXG4gICAgICAgIHF1ZXJ5Q29uZmlnLnNlY3VyZSAmJlxuICAgICAgICAhaXNRdWVyeVN0YXRlU3VjY2VzcyhhdXRoUHJvdmlkZXIuY3VycmVudFJlZnJlc2hRdWVyeT8ucmF3U3RhdGUpXG4gICAgICApIHtcbiAgICAgICAgLy8gT24gcGFnZSBsb2FkIHRoZSBxdWVyeSBtaWdodCBiZSBleGVjdXRlZCBiZWZvcmUgdGhlIGF1dGggcHJvdmlkZXIgaGFzIGJlZW4gaW5pdGlhbGl6ZWQuXG4gICAgICAgIC8vIEluIHRoaXMgY2FzZSB3ZSBuZWVkIHRvIHdhaXQgZm9yIHRoZSBhdXRoIHByb3ZpZGVyIHRvIGJlIHJlYWR5IGJlZm9yZSB3ZSBjYW4gZXhlY3V0ZSB0aGUgcXVlcnkuXG4gICAgICAgIGdvU2lnbmFsID0gY29tYmluZUxhdGVzdChbXG4gICAgICAgICAgLy8gVGhlIHRva2VucyBtaWdodCBnZXQgc2V0IHdpdGhvdXQgYSByZWZyZXNoIHF1ZXJ5IGJlaW5nIGNyZWF0ZWQgKGUuZy4pIGRpcmVjdGx5IGFmdGVyIGxvZ2luLlxuICAgICAgICAgIGF1dGhQcm92aWRlci5jdXJyZW50UmVmcmVzaFF1ZXJ5JC5waXBlKHN3aXRjaFF1ZXJ5U3RhdGUoKSwgdGFrZVVudGlsUmVzcG9uc2UoKSksXG4gICAgICAgICAgYXV0aFByb3ZpZGVyLnRva2VucyQucGlwZSh0YWtlKDEpKSxcbiAgICAgICAgXSkucGlwZShcbiAgICAgICAgICB0YWtlVW50aWwodGhpcy5fb25BYm9ydCQpLFxuICAgICAgICAgIGZpbHRlcigoW3N0YXRlLCB0b2tlbnNdKSA9PiB7XG4gICAgICAgICAgICBpZiAoc3RhdGUpIHtcbiAgICAgICAgICAgICAgcmV0dXJuICFpc1F1ZXJ5U3RhdGVMb2FkaW5nKHN0YXRlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuICEhdG9rZW5zO1xuICAgICAgICAgIH0pLFxuICAgICAgICAgIHRhcCgoW3N0YXRlXSkgPT4ge1xuICAgICAgICAgICAgaWYgKGlzUXVlcnlTdGF0ZUZhaWx1cmUoc3RhdGUpKSB7XG4gICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZUVudGl0eVN0YXRlKHsgdHlwZTogJ2ZhaWx1cmUnLCBlcnJvcjogc3RhdGUuZXJyb3IsIGhlYWRlcnM6IHt9IH0sIG1ldGEsIG9wdGlvbnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pLFxuICAgICAgICAgIG1hcCgoKSA9PiB0cnVlKSxcbiAgICAgICAgICB0YWtlKDEpLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBnb1NpZ25hbFxuICAgICAgICAucGlwZShcbiAgICAgICAgICBzd2l0Y2hNYXAoKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgbWV0aG9kID0gY29tcHV0ZVF1ZXJ5TWV0aG9kKHsgY29uZmlnOiBxdWVyeUNvbmZpZywgY2xpZW50OiB0aGlzLl9jbGllbnQgfSk7XG4gICAgICAgICAgICBjb25zdCBib2R5ID0gY29tcHV0ZVF1ZXJ5Qm9keSh7IGNvbmZpZzogcXVlcnlDb25maWcsIGNsaWVudDogdGhpcy5fY2xpZW50LCBhcmdzOiB0aGlzLl9hcmd1bWVudHMsIG1ldGhvZCB9KTtcbiAgICAgICAgICAgIGNvbnN0IGhlYWRlcnMgPSBjb21wdXRlUXVlcnlIZWFkZXJzKHsgY2xpZW50OiB0aGlzLl9jbGllbnQsIGNvbmZpZzogcXVlcnlDb25maWcsIGFyZ3M6IHRoaXMuX2FyZ3VtZW50cyB9KTtcblxuICAgICAgICAgICAgcmV0dXJuIHJlcXVlc3Q8UmVzcG9uc2U+KHtcbiAgICAgICAgICAgICAgdXJsV2l0aFBhcmFtczogdGhpcy5fcm91dGVXaXRoUGFyYW1zIGFzIHN0cmluZyxcbiAgICAgICAgICAgICAgbWV0aG9kLFxuICAgICAgICAgICAgICBib2R5LFxuICAgICAgICAgICAgICBoZWFkZXJzLFxuICAgICAgICAgICAgICByZXBvcnRQcm9ncmVzczogcXVlcnlDb25maWcucmVwb3J0UHJvZ3Jlc3MsXG4gICAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogcXVlcnlDb25maWcucmVzcG9uc2VUeXBlLFxuICAgICAgICAgICAgICB3aXRoQ3JlZGVudGlhbHM6IHF1ZXJ5Q29uZmlnLndpdGhDcmVkZW50aWFscyxcbiAgICAgICAgICAgICAgY2FjaGVBZGFwdGVyOiB0aGlzLl9jbGllbnQuY29uZmlnLnJlcXVlc3Q/LmNhY2hlQWRhcHRlcixcbiAgICAgICAgICAgICAgcmV0cnlGbjogdGhpcy5fY2xpZW50LmNvbmZpZy5yZXF1ZXN0Py5yZXRyeUZuLFxuICAgICAgICAgICAgfSkucGlwZShcbiAgICAgICAgICAgICAgdGFwKChzdGF0ZSkgPT4gdGhpcy5fdXBkYXRlRW50aXR5U3RhdGUoc3RhdGUsIG1ldGEsIG9wdGlvbnMpKSxcbiAgICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMuX29uQWJvcnQkKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSksXG4gICAgICAgIClcblxuICAgICAgICAuc3Vic2NyaWJlKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBhYm9ydCgpIHtcbiAgICBpZiAoIWlzUXVlcnlTdGF0ZUxvYWRpbmcodGhpcy5yYXdTdGF0ZSkpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHRoaXMuX29uQWJvcnQkLm5leHQoKTtcblxuICAgIHRoaXMuX3VwZGF0ZVN0YXRlKHtcbiAgICAgIHR5cGU6IFF1ZXJ5U3RhdGVUeXBlLkNhbmNlbGxlZCxcbiAgICAgIG1ldGE6IHsgaWQ6IHRoaXMucmF3U3RhdGUubWV0YS5pZCwgdHJpZ2dlcmVkVmlhOiB0aGlzLnJhd1N0YXRlLm1ldGEudHJpZ2dlcmVkVmlhIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHBvbGwoY29uZmlnOiBQb2xsQ29uZmlnKSB7XG4gICAgaWYgKHRoaXMuX3BvbGxpbmdTdWJzY3JpcHRpb24pIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHRoaXMuX2N1cnJlbnRQb2xsQ29uZmlnID0gY29uZmlnO1xuXG4gICAgY29uc3QgaW50ZXJ2YWwkID0gaW50ZXJ2YWwoY29uZmlnLmludGVydmFsKTtcbiAgICBjb25zdCBwb2xsJCA9IGludGVydmFsJC5waXBlKFxuICAgICAgc2tpcChjb25maWcudHJpZ2dlckltbWVkaWF0ZWx5ID8gMCA6IDEpLFxuICAgICAgdGFrZVVudGlsKGNvbmZpZy50YWtlVW50aWwpLFxuICAgICAgdGFrZVdoaWxlKCgpID0+ICF0aGlzLl9pc1BvbGxpbmdQYXVzZWQpLFxuICAgICAgZmlsdGVyKCgpID0+ICFpc1F1ZXJ5U3RhdGVMb2FkaW5nKHRoaXMuX3N0YXRlJC52YWx1ZSkpLFxuICAgICk7XG5cbiAgICB0aGlzLl9wb2xsaW5nU3Vic2NyaXB0aW9uID0gcG9sbCQuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6ICgpID0+IHRoaXMuZXhlY3V0ZSh7IHNraXBDYWNoZTogdHJ1ZSwgX3RyaWdnZXJlZFZpYTogJ3BvbGwnIH0pLFxuICAgICAgY29tcGxldGU6ICgpID0+IHRoaXMuc3RvcFBvbGxpbmcoKSxcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc3RvcFBvbGxpbmcoKSB7XG4gICAgdGhpcy5fcG9sbGluZ1N1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLl9wb2xsaW5nU3Vic2NyaXB0aW9uID0gbnVsbDtcbiAgICB0aGlzLl9jdXJyZW50UG9sbENvbmZpZyA9IG51bGw7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHBhdXNlUG9sbGluZygpIHtcbiAgICB0aGlzLl9wb2xsaW5nU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuX3BvbGxpbmdTdWJzY3JpcHRpb24gPSBudWxsO1xuXG4gICAgdGhpcy5faXNQb2xsaW5nUGF1c2VkID0gdHJ1ZTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgcmVzdW1lUG9sbGluZygpIHtcbiAgICBpZiAoIXRoaXMuX2lzUG9sbGluZ1BhdXNlZCB8fCAhdGhpcy5fY3VycmVudFBvbGxDb25maWcpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHRoaXMuX2lzUG9sbGluZ1BhdXNlZCA9IGZhbHNlO1xuXG4gICAgcmV0dXJuIHRoaXMucG9sbCh7IC4uLnRoaXMuX2N1cnJlbnRQb2xsQ29uZmlnLCB0cmlnZ2VySW1tZWRpYXRlbHk6IHRydWUgfSk7XG4gIH1cblxuICBvblN1Y2Nlc3MoY2FsbGJhY2s6IChyZXNwb25zZTogRGF0YSkgPT4gdm9pZCkge1xuICAgIHRoaXMuc3RhdGUkLnBpcGUodGFrZVVudGlsUmVzcG9uc2UoKSwgZmlsdGVyU3VjY2VzcygpKS5zdWJzY3JpYmUoKHN0YXRlKSA9PiBjYWxsYmFjayhzdGF0ZS5yZXNwb25zZSkpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgb25GYWlsdXJlKGNhbGxiYWNrOiAoZXJyb3I6IFJlcXVlc3RFcnJvcjx1bmtub3duPikgPT4gdm9pZCkge1xuICAgIHRoaXMuc3RhdGUkLnBpcGUodGFrZVVudGlsUmVzcG9uc2UoKSwgZmlsdGVyRmFpbHVyZSgpKS5zdWJzY3JpYmUoKHN0YXRlKSA9PiBjYWxsYmFjayhzdGF0ZS5lcnJvcikpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0QmVhcmVyQXV0aFByb3ZpZGVyKCkge1xuICAgIGNvbnN0IGF1dGhQcm92aWRlciA9IHRoaXMuX2NsaWVudC5hdXRoUHJvdmlkZXI7XG5cbiAgICBpZiAoYXV0aFByb3ZpZGVyICYmIGlzQmVhcmVyQXV0aFByb3ZpZGVyKGF1dGhQcm92aWRlcikpIHtcbiAgICAgIHJldHVybiBhdXRoUHJvdmlkZXI7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBwcml2YXRlIF91cGRhdGVFbnRpdHlTdGF0ZShcbiAgICByZXF1ZXN0RXZlbnQ6IFJlcXVlc3RFdmVudDxSZXNwb25zZT4sXG4gICAgbWV0YTogUXVlcnlTdGF0ZU1ldGEsXG4gICAgb3B0aW9ucz86IEV4ZWN1dGVRdWVyeU9wdGlvbnMsXG4gICkge1xuICAgIHN3aXRjaCAocmVxdWVzdEV2ZW50LnR5cGUpIHtcbiAgICAgIGNhc2UgJ3N0YXJ0JzpcbiAgICAgIGNhc2UgJ2RlbGF5LXJldHJ5Jzoge1xuICAgICAgICBjb25zdCB7IHR5cGUsIHJldHJ5RGVsYXksIHJldHJ5TnVtYmVyIH0gPSByZXF1ZXN0RXZlbnQ7XG4gICAgICAgIGNvbnN0IG5ld01ldGE6IFF1ZXJ5U3RhdGVNZXRhID0geyAuLi5tZXRhLCBpc1dhaXRpbmdGb3JSZXRyeTogdHlwZSA9PT0gJ2RlbGF5LXJldHJ5JywgcmV0cnlEZWxheSwgcmV0cnlOdW1iZXIgfTtcblxuICAgICAgICB0aGlzLl91cGRhdGVTdGF0ZSh7XG4gICAgICAgICAgdHlwZTogUXVlcnlTdGF0ZVR5cGUuTG9hZGluZyxcbiAgICAgICAgICBtZXRhOiBuZXdNZXRhLFxuICAgICAgICB9KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGNhc2UgJ3VwbG9hZC1wcm9ncmVzcyc6XG4gICAgICBjYXNlICdkb3dubG9hZC1wcm9ncmVzcyc6IHtcbiAgICAgICAgdGhpcy5fdXBkYXRlU3RhdGUoe1xuICAgICAgICAgIHR5cGU6IFF1ZXJ5U3RhdGVUeXBlLkxvYWRpbmcsXG4gICAgICAgICAgcHJvZ3Jlc3M6IHJlcXVlc3RFdmVudC5wcm9ncmVzcyxcbiAgICAgICAgICBwYXJ0aWFsVGV4dDogJ3BhcnRpYWxUZXh0JyBpbiByZXF1ZXN0RXZlbnQgPyByZXF1ZXN0RXZlbnQucGFydGlhbFRleHQgOiB1bmRlZmluZWQsXG4gICAgICAgICAgbWV0YSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGNhc2UgJ3N1Y2Nlc3MnOiB7XG4gICAgICAgIGNvbnN0IHsgcmVzcG9uc2UsIGV4cGlyZXNJblRpbWVzdGFtcCB9ID0gcmVxdWVzdEV2ZW50O1xuICAgICAgICBjb25zdCBpc0dxbCA9IGlzR3FsUXVlcnlDb25maWcodGhpcy5fcXVlcnlDb25maWcpO1xuICAgICAgICBjb25zdCByZXNwb25zZURhdGEgPVxuICAgICAgICAgIGlzR3FsICYmIHR5cGVvZiByZXNwb25zZSA9PT0gJ29iamVjdCcgJiYgISFyZXNwb25zZSAmJiAnZGF0YScgaW4gcmVzcG9uc2VcbiAgICAgICAgICAgID8gKHJlc3BvbnNlWydkYXRhJ10gYXMgUmVzcG9uc2UpXG4gICAgICAgICAgICA6IChyZXNwb25zZSBhcyBSZXNwb25zZSk7XG5cbiAgICAgICAgaWYgKHRoaXMuX3F1ZXJ5Q29uZmlnLmVudGl0eSAmJiB0aGlzLl9xdWVyeUNvbmZpZy5lbnRpdHkuc2V0KSB7XG4gICAgICAgICAgY29uc3QgaWQgPSB0aGlzLl9xdWVyeUNvbmZpZy5lbnRpdHk/LmlkKHsgYXJnczogdGhpcy5fYXJndW1lbnRzLCByZXNwb25zZTogcmVzcG9uc2VEYXRhIH0pO1xuXG4gICAgICAgICAgdGhpcy5fcXVlcnlDb25maWcuZW50aXR5Py5zZXQoe1xuICAgICAgICAgICAgYXJnczogdGhpcy5fYXJndW1lbnRzLFxuICAgICAgICAgICAgcmVzcG9uc2U6IHJlc3BvbnNlRGF0YSxcbiAgICAgICAgICAgIGlkLFxuICAgICAgICAgICAgc3RvcmU6IHRoaXMuX3F1ZXJ5Q29uZmlnLmVudGl0eS5zdG9yZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3VwZGF0ZVN0YXRlKHtcbiAgICAgICAgICB0eXBlOiBRdWVyeVN0YXRlVHlwZS5TdWNjZXNzLFxuICAgICAgICAgIHJlc3BvbnNlOiByZXNwb25zZURhdGEsXG4gICAgICAgICAgbWV0YTogeyAuLi5tZXRhLCBleHBpcmVzQXQ6IGV4cGlyZXNJblRpbWVzdGFtcCB9LFxuICAgICAgICB9KTtcblxuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgY2FzZSAnZmFpbHVyZSc6IHtcbiAgICAgICAgY29uc3QgeyBlcnJvciB9ID0gcmVxdWVzdEV2ZW50O1xuICAgICAgICBjb25zdCBmYWlsdXJlID0gKCkgPT4gdGhpcy5fdXBkYXRlU3RhdGUoeyB0eXBlOiBRdWVyeVN0YXRlVHlwZS5GYWlsdXJlLCBlcnJvciwgbWV0YSB9KTtcbiAgICAgICAgY29uc3QgYmVhcmVyQXV0aFByb3ZpZGVyID0gdGhpcy5fZ2V0QmVhcmVyQXV0aFByb3ZpZGVyKCk7XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICFiZWFyZXJBdXRoUHJvdmlkZXIgfHxcbiAgICAgICAgICBvcHRpb25zPy5faXNVbmF1dGhvcml6ZWRSZXRyeSB8fFxuICAgICAgICAgIGVycm9yLnN0YXR1cyAhPT0gSHR0cFN0YXR1c0NvZGUuVW5hdXRob3JpemVkIHx8XG4gICAgICAgICAgIWJlYXJlckF1dGhQcm92aWRlci5zaG91bGRSZWZyZXNoT25VbmF1dGhvcml6ZWRSZXNwb25zZVxuICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm4gZmFpbHVyZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcXVlcnkgPSBiZWFyZXJBdXRoUHJvdmlkZXIuX3JlZnJlc2hRdWVyeSgpO1xuICAgICAgICBpZiAoIXF1ZXJ5KSByZXR1cm4gZmFpbHVyZSgpO1xuXG4gICAgICAgIHF1ZXJ5LnN0YXRlJFxuICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgdGFrZVVudGlsUmVzcG9uc2UoKSxcbiAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLl9vbkFib3J0JCksXG4gICAgICAgICAgICB0YXAoKHN0YXRlKSA9PlxuICAgICAgICAgICAgICBpc1F1ZXJ5U3RhdGVTdWNjZXNzKHN0YXRlKSA/IHRoaXMuZXhlY3V0ZSh7IC4uLm9wdGlvbnMsIF9pc1VuYXV0aG9yaXplZFJldHJ5OiB0cnVlIH0pIDogZmFpbHVyZSgpLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICApXG4gICAgICAgICAgLnN1YnNjcmliZSgpO1xuXG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBjYXNlICdjYW5jZWwnOiB7XG4gICAgICAgIHRoaXMuX3VwZGF0ZVN0YXRlKHtcbiAgICAgICAgICB0eXBlOiBRdWVyeVN0YXRlVHlwZS5DYW5jZWxsZWQsXG4gICAgICAgICAgbWV0YSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfdHJhbnNmb3JtU3RhdGUoczogUXVlcnlTdGF0ZTxSZXNwb25zZT4pOiBPYnNlcnZhYmxlPFF1ZXJ5U3RhdGU8RGF0YT4+IHtcbiAgICBpZiAoIWlzUXVlcnlTdGF0ZVN1Y2Nlc3MocykgfHwgIXRoaXMuX3F1ZXJ5Q29uZmlnLmVudGl0eT8uZ2V0KSB7XG4gICAgICByZXR1cm4gb2YocykgYXMgT2JzZXJ2YWJsZTxRdWVyeVN0YXRlPERhdGE+PjtcbiAgICB9XG5cbiAgICBjb25zdCBpZCA9IHRoaXMuX3F1ZXJ5Q29uZmlnLmVudGl0eS5pZCh7IGFyZ3M6IHRoaXMuX2FyZ3VtZW50cywgcmVzcG9uc2U6IHMucmVzcG9uc2UgfSk7XG5cbiAgICByZXR1cm4gdGhpcy5fcXVlcnlDb25maWcuZW50aXR5XG4gICAgICAuZ2V0KHsgYXJnczogdGhpcy5fYXJndW1lbnRzLCBpZCwgcmVzcG9uc2U6IHMucmVzcG9uc2UsIHN0b3JlOiB0aGlzLl9xdWVyeUNvbmZpZy5lbnRpdHkuc3RvcmUgfSlcbiAgICAgIC5waXBlKG1hcCgodikgPT4gKHsgLi4ucywgcmVzcG9uc2U6IHYgfSkpKTtcbiAgfVxuXG4gIHByaXZhdGUgX3VwZGF0ZVN0YXRlKHM6IFF1ZXJ5U3RhdGU8UmVzcG9uc2U+KSB7XG4gICAgLy8gV2UgbmVlZCB0byB1c2UgdW50cmFja2VkIGhlcmUgdG8gYXZvaWQgQW5ndWxhcidzIFwiYWxsb3dTaWduYWxXcml0ZXMgaXMgZmFsc2VcIiBlcnJvciB3aGVuIGV4ZWN1dGluZyBxdWVyaWVzIGluc2lkZSBBbmd1bGFyJ3MgY29tcHV0ZWQvZWZmZWN0IHNpZ25hbCBmdW5jdGlvbnMuXG4gICAgdW50cmFja2VkKCgpID0+IHRoaXMuX3N0YXRlJC5uZXh0KHMpKTtcbiAgfVxuXG4gIHByaXZhdGUgX21vY2tSZXF1ZXN0KGhlYWRlcnM6IFJlcXVlc3RIZWFkZXJzIHwgdW5kZWZpbmVkLCBtZXRhOiBRdWVyeVN0YXRlTWV0YSwgb3B0aW9uczogRXhlY3V0ZVF1ZXJ5T3B0aW9ucykge1xuICAgIGlmICghdGhpcy5fYXJndW1lbnRzPy5tb2NrKSByZXR1cm47XG5cbiAgICBjb25zdCB7IGRlbGF5ID0gMjAwLCBlcnJvciwgcmVzcG9uc2UsIHJldHJ5SW50b1Jlc3BvbnNlID0gZmFsc2UsIHByb2dyZXNzIH0gPSB0aGlzLl9hcmd1bWVudHMubW9jaztcbiAgICBjb25zdCBwcm9ncmVzc0ZpbGVTaXplID0gcHJvZ3Jlc3M/LmZpbGVTaXplID8/IDEwMDAwMDA7XG4gICAgY29uc3QgcHJvZ3Jlc3NFdmVudFR5cGUgPSBwcm9ncmVzcz8uZXZlbnRUeXBlID8/ICd1cGxvYWQnO1xuICAgIGNvbnN0IHByb2dyZXNzRXZlbnRDb3VudCA9IHByb2dyZXNzPy5ldmVudENvdW50ID8/IDU7XG4gICAgY29uc3QgcHJvZ3Jlc3NPbWl0VG90YWwgPSBwcm9ncmVzcz8ub21pdFRvdGFsID8/IGZhbHNlO1xuICAgIGNvbnN0IG9taXRQYXJ0aWFsVGV4dCA9IHByb2dyZXNzPy5vbWl0UGFydGlhbFRleHQgPz8gZmFsc2U7XG5cbiAgICBjb25zdCBmaW5hbFJlc29sdmVNb2NrID0gKCkgPT4ge1xuICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgIHRoaXMuX3VwZGF0ZUVudGl0eVN0YXRlKHsgZXJyb3IsIGhlYWRlcnM6IGhlYWRlcnMgPz8ge30sIHR5cGU6ICdmYWlsdXJlJyB9LCBtZXRhLCBvcHRpb25zKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl91cGRhdGVFbnRpdHlTdGF0ZShcbiAgICAgICAgeyByZXNwb25zZTogcmVzcG9uc2UgYXMgUmVzcG9uc2UsIGhlYWRlcnM6IGhlYWRlcnMgPz8ge30sIHR5cGU6ICdzdWNjZXNzJyB9LFxuICAgICAgICBtZXRhLFxuICAgICAgICBvcHRpb25zLFxuICAgICAgKTtcbiAgICB9O1xuXG4gICAgaWYgKHByb2dyZXNzKSB7XG4gICAgICBpbnRlcnZhbChkZWxheSlcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgdGFwKChhKSA9PiB7XG4gICAgICAgICAgICBpZiAoYSA9PT0gcHJvZ3Jlc3NFdmVudENvdW50ICsgMSkge1xuICAgICAgICAgICAgICBmaW5hbFJlc29sdmVNb2NrKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBjb25zdCBjdXJyZW50ID0gTWF0aC5taW4ocHJvZ3Jlc3NGaWxlU2l6ZSAqIGEsIHByb2dyZXNzRmlsZVNpemUgKiBwcm9ncmVzc0V2ZW50Q291bnQpO1xuICAgICAgICAgICAgICBjb25zdCBwZXJjZW50YWdlID0gKGN1cnJlbnQgLyAocHJvZ3Jlc3NGaWxlU2l6ZSAqIHByb2dyZXNzRXZlbnRDb3VudCkpICogMTAwO1xuXG4gICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZUVudGl0eVN0YXRlKFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIHR5cGU6IHByb2dyZXNzRXZlbnRUeXBlID09PSAndXBsb2FkJyA/ICd1cGxvYWQtcHJvZ3Jlc3MnIDogJ2Rvd25sb2FkLXByb2dyZXNzJyxcbiAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IGhlYWRlcnMgPz8ge30sXG4gICAgICAgICAgICAgICAgICBwcm9ncmVzczogeyBjdXJyZW50LCAuLi4ocHJvZ3Jlc3NPbWl0VG90YWwgPyB7fSA6IHsgcGVyY2VudGFnZSwgdG90YWw6IHByb2dyZXNzRmlsZVNpemUgfSkgfSxcbiAgICAgICAgICAgICAgICAgIHBhcnRpYWxUZXh0OiBvbWl0UGFydGlhbFRleHQgPyB1bmRlZmluZWQgOiBgUGFydGlhbCB0ZXh0ICR7YX1gLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgbWV0YSxcbiAgICAgICAgICAgICAgICBvcHRpb25zLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pLFxuICAgICAgICAgIHRha2VVbnRpbCh0aGlzLl9vbkFib3J0JCksXG4gICAgICAgICAgdGFrZVdoaWxlKChhKSA9PiBhIDwgcHJvZ3Jlc3NFdmVudENvdW50ICsgMSwgdHJ1ZSksXG4gICAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZSgpO1xuICAgIH0gZWxzZSBpZiAocmV0cnlJbnRvUmVzcG9uc2UpIHtcbiAgICAgIGludGVydmFsKGRlbGF5KVxuICAgICAgICAucGlwZShcbiAgICAgICAgICB0YXAoKGEpID0+IHtcbiAgICAgICAgICAgIGlmIChhID09PSAzKSB7XG4gICAgICAgICAgICAgIGZpbmFsUmVzb2x2ZU1vY2soKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGNvbnN0IGFNb2RpZmllZCA9IGEgKyAxO1xuICAgICAgICAgICAgICB0aGlzLl91cGRhdGVFbnRpdHlTdGF0ZShcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICB0eXBlOiAnZGVsYXktcmV0cnknLFxuICAgICAgICAgICAgICAgICAgaGVhZGVyczogaGVhZGVycyA/PyB7fSxcbiAgICAgICAgICAgICAgICAgIHJldHJ5RGVsYXk6IDEwMDAgKyAxMDAwICogYU1vZGlmaWVkLFxuICAgICAgICAgICAgICAgICAgcmV0cnlOdW1iZXI6IGFNb2RpZmllZCxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIG1ldGEsXG4gICAgICAgICAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KSxcbiAgICAgICAgICB0YWtlVW50aWwodGhpcy5fb25BYm9ydCQpLFxuICAgICAgICAgIHRha2VXaGlsZSgoYSkgPT4gYSA8IDMsIHRydWUpLFxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGltZXIoZGVsYXkpXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIHRhcCgoKSA9PiBmaW5hbFJlc29sdmVNb2NrKCkpLFxuICAgICAgICAgIHRha2VVbnRpbCh0aGlzLl9vbkFib3J0JCksXG4gICAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIF9hZGREZXBlbmRlbnQodE5vZGVJbmRleDogbnVtYmVyKSB7XG4gICAgaWYgKCF0aGlzLl9kZXBlbmRlbnRzW3ROb2RlSW5kZXhdKSB7XG4gICAgICB0aGlzLl9kZXBlbmRlbnRzW3ROb2RlSW5kZXhdID0gMDtcbiAgICB9XG5cbiAgICB0aGlzLl9kZXBlbmRlbnRzW3ROb2RlSW5kZXhdKys7XG5cbiAgICB0aGlzLl9kZXBlbmRlbnRzQ2hhbmdlZCQubmV4dCh0aGlzLl9kZXBlbmRlbnRzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIF9yZW1vdmVEZXBlbmRlbnQodE5vZGVJbmRleDogbnVtYmVyKSB7XG4gICAgY29uc3QgY291bnQgPSB0aGlzLl9kZXBlbmRlbnRzW3ROb2RlSW5kZXhdO1xuICAgIGlmIChjb3VudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fZGVwZW5kZW50c1t0Tm9kZUluZGV4XS0tO1xuXG4gICAgaWYgKGNvdW50IDw9IDEpIHtcbiAgICAgIGRlbGV0ZSB0aGlzLl9kZXBlbmRlbnRzW3ROb2RlSW5kZXhdO1xuICAgIH1cblxuICAgIHRoaXMuX2RlcGVuZGVudHNDaGFuZ2VkJC5uZXh0KHRoaXMuX2RlcGVuZGVudHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgX2hhc0RlcGVuZGVudHMoKSB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMuX2RlcGVuZGVudHMpLmxlbmd0aCA+IDA7XG4gIH1cbn1cbiJdfQ==
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlcnkudHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL3F1ZXJ5L3NyYy9saWIvcXVlcnkvcXVlcnkudHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEVudGl0eVN0b3JlIH0gZnJvbSAnLi4vZW50aXR5JztcbmltcG9ydCB7IEFueVF1ZXJ5Q3JlYXRvciwgQ29uc3RydWN0UXVlcnksIFF1ZXJ5RGF0YU9mLCBRdWVyeVJlc3BvbnNlT2YgfSBmcm9tICcuLi9xdWVyeS1jcmVhdG9yJztcbmltcG9ydCB7IFF1ZXJ5Rm9ybSB9IGZyb20gJy4uL3F1ZXJ5LWZvcm0nO1xuaW1wb3J0IHsgTWV0aG9kLCBQYXRoUGFyYW1zLCBRdWVyeVBhcmFtcywgUmVxdWVzdEVycm9yLCBSZXF1ZXN0UHJvZ3Jlc3MgfSBmcm9tICcuLi9yZXF1ZXN0JztcbmltcG9ydCB7IFF1ZXJ5IH0gZnJvbSAnLi9xdWVyeSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUXVlcnlBdXRvUmVmcmVzaENvbmZpZyB7XG4gIC8qKlxuICAgKiBSZWZyZXNoIHRoZSBxdWVyeSB3aGVuIHRoZSBxdWVyeSBjbGllbnQncyBoZWFkZXJzIGNoYW5nZS5cbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgcXVlcnlDbGllbnREZWZhdWx0SGVhZGVyc0NoYW5nZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFJlZnJlc2ggdGhlIHF1ZXJ5IHdoZW4gdGhlIHdpbmRvdyByZWdhaW5zIGZvY3VzLlxuICAgKlxuICAgKiBUaGlzIGNhbiBvbmx5IGJlIGRpc2FibGVkIGlmIGBhdXRvUmVmcmVzaFF1ZXJpZXNPbldpbmRvd0ZvY3VzYCBpcyBlbmFibGVkIG9uIHRoZSBxdWVyeSBjbGllbnQuXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIHdpbmRvd0ZvY3VzPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFbnRpdHlTZXRQYXJhbXM8U3RvcmUsIFJlc3BvbnNlLCBBcmd1bWVudHMsIElkPiB7XG4gIC8qKlxuICAgKiBUaGUgcmVzcG9uc2UgZGF0YS5cbiAgICovXG4gIHJlc3BvbnNlOiBSZXNwb25zZTtcblxuICAvKipcbiAgICogVGhlIGlkKHMpIHJldHVybmVkIGJ5IHRoZSBgaWRgIGZ1bmN0aW9uLlxuICAgKi9cbiAgaWQ6IElkO1xuXG4gIC8qKlxuICAgKiBUaGUgYXJndW1lbnRzIHBhc3NlZCB0byB0aGUgcXVlcnkuXG4gICAqL1xuICBhcmdzOiBBcmd1bWVudHM7XG5cbiAgLyoqXG4gICAqIFRoZSBlbnRpdHkgc3RvcmUuXG4gICAqL1xuICBzdG9yZTogU3RvcmU7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRW50aXR5R2V0UGFyYW1zPFN0b3JlLCBSZXNwb25zZSwgQXJndW1lbnRzLCBJZD4ge1xuICAvKipcbiAgICogVGhlIHJlc3BvbnNlIGRhdGEuXG4gICAqL1xuICByZXNwb25zZTogUmVzcG9uc2U7XG5cbiAgLyoqXG4gICAqIFRoZSBpZChzKSByZXR1cm5lZCBieSB0aGUgYGlkYCBmdW5jdGlvbi5cbiAgICovXG4gIGlkOiBJZDtcblxuICAvKipcbiAgICogVGhlIGFyZ3VtZW50cyBwYXNzZWQgdG8gdGhlIHF1ZXJ5LlxuICAgKi9cbiAgYXJnczogQXJndW1lbnRzO1xuXG4gIC8qKlxuICAgKiBUaGUgZW50aXR5IHN0b3JlLlxuICAgKi9cbiAgc3RvcmU6IFN0b3JlO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEVudGl0eUlkUGFyYW1zPFJlc3BvbnNlLCBBcmd1bWVudHM+IHtcbiAgLyoqXG4gICAqIFRoZSByZXNwb25zZSBkYXRhLlxuICAgKi9cbiAgcmVzcG9uc2U6IFJlc3BvbnNlO1xuXG4gIC8qKlxuICAgKiBUaGUgYXJndW1lbnRzIHBhc3NlZCB0byB0aGUgcXVlcnkuXG4gICAqL1xuICBhcmdzOiBBcmd1bWVudHM7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUXVlcnlFbnRpdHlDb25maWc8U3RvcmUsIERhdGEsIFJlc3BvbnNlLCBBcmd1bWVudHMsIElkPiB7XG4gIC8qKlxuICAgKiBUaGUgZW50aXR5IHN0b3JlIHRvIHVzZSBmb3IgdGhlIHF1ZXJ5LlxuICAgKi9cbiAgc3RvcmU6IFN0b3JlO1xuXG4gIC8qKlxuICAgKiBBIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUgaWQgb2YgdGhlIGVudGl0eS4gQ2FuIGFsc28gcmV0dXJuIGFuIGFycmF5IG9mIGlkcy5cbiAgICovXG4gIGlkOiAoZGF0YTogRW50aXR5SWRQYXJhbXM8UmVzcG9uc2UsIEFyZ3VtZW50cz4pID0+IElkO1xuXG4gIC8qKlxuICAgKiBBIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUgcmVzcG9uc2UgZGF0YSAoY2FuIGJlIGEgc3Vic2V0IG9mIHRoZSByZXNwb25zZSkuXG4gICAqL1xuICBnZXQ/OiAoZGF0YTogRW50aXR5R2V0UGFyYW1zPFN0b3JlLCBSZXNwb25zZSwgQXJndW1lbnRzLCBJZD4pID0+IE9ic2VydmFibGU8RGF0YT47XG5cbiAgLyoqXG4gICAqIEEgZnVuY3Rpb24gdG8gdXBkYXRlIHRoZSBlbnRpdHkgc3RvcmUgZXZlcnkgdGltZSBhIG5ldyByZXNwb25zZSBpcyByZWNlaXZlZC5cbiAgICovXG4gIHNldD86IChkYXRhOiBFbnRpdHlTZXRQYXJhbXM8U3RvcmUsIFJlc3BvbnNlLCBBcmd1bWVudHMsIElkPikgPT4gdm9pZDtcbn1cblxuZXhwb3J0IHR5cGUgUXVlcnlDb25maWdCYXNlPFxuICBSZXNwb25zZSxcbiAgQXJndW1lbnRzIGV4dGVuZHMgQmFzZUFyZ3VtZW50cyB8IHVuZGVmaW5lZCxcbiAgU3RvcmUgZXh0ZW5kcyBFbnRpdHlTdG9yZTx1bmtub3duPixcbiAgRGF0YSxcbiAgSWQsXG4+ID0ge1xuICAvKipcbiAgICogVGhlIGh0dHAgbWV0aG9kIHRvIHVzZSBmb3IgdGhlIHF1ZXJ5LlxuICAgKi9cbiAgbWV0aG9kOiBNZXRob2Q7XG5cbiAgLyoqXG4gICAqIERldGVybWluZXMgaWYgdGhlIGF1dGggcHJvdmlkZXIgc2hvdWxkIGJlIHVzZWQgZm9yIHRoaXMgcXVlcnkuXG4gICAqIFRoZSBxdWVyeSAqKndpbGwgdGhyb3cqKiBpZiB0aGUgcXVlcnkgY2xpZW50J3MgYXV0aCBwcm92aWRlciBpcyB1bnNldC5cbiAgICovXG4gIHNlY3VyZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIERldGVybWluZXMgaWYgdGhlIHF1ZXJ5IHNob3VsZCBlbWl0IHByb2dyZXNzIGV2ZW50cy5cbiAgICovXG4gIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyB0aGUgcXVlcnkncyByZXNwb25zZSB0eXBlLlxuICAgKiBAZGVmYXVsdCAnanNvbidcbiAgICovXG4gIHJlc3BvbnNlVHlwZT86ICdhcnJheWJ1ZmZlcicgfCAnYmxvYicgfCAnanNvbicgfCAndGV4dCc7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhpcyByZXF1ZXN0IHNob3VsZCBiZSBzZW50IHdpdGggb3V0Z29pbmcgY3JlZGVudGlhbHMgKGNvb2tpZXMpLlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgd2l0aENyZWRlbnRpYWxzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQ29uZmlndXJhdGlvbiBmb3IgaGFuZGxpbmcgYXV0byByZWZyZXNoIHRyaWdnZXJzLlxuICAgKlxuICAgKiAqKk5vdGU6KiogVGhpcyBpcyBvbmx5IGF2YWlsYWJsZSBmb3IgcXVlcmllcyB0aGF0IGNhbiBiZSByZWZyZXNoZWQuIChgR0VUYCwgYEhFQURgLCBgT1BUSU9OU2AsIGBHUUxfUVVFUllgKVxuICAgKi9cbiAgYXV0b1JlZnJlc2hPbj86IFF1ZXJ5QXV0b1JlZnJlc2hDb25maWc7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gYXV0b21hdGljYWxseSBzdG9wIHBvbGxpbmcgZm9yIHRoaXMgcXVlcnkgd2hlbiB0aGUgd2luZG93IGxvc2VzIGZvY3VzLlxuICAgKiBQb2xsaW5nIHdpbGwgcmVzdW1lIHdoZW4gdGhlIHdpbmRvdyByZWdhaW5zIGZvY3VzLlxuICAgKlxuICAgKiBUaGlzIGNhbiBvbmx5IGJlIGRpc2FibGVkIGlmIGBlbmFibGVTbWFydFBvbGxpbmdgIGlzIGVuYWJsZWQgb24gdGhlIHF1ZXJ5IGNsaWVudC5cbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgZW5hYmxlU21hcnRQb2xsaW5nPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogT2JqZWN0IGNvbnRhaW5pbmcgdGhlIHF1ZXJ5J3MgdHlwZSBpbmZvcm1hdGlvbi5cbiAgICovXG4gIHR5cGVzPzoge1xuICAgIC8qKlxuICAgICAqIFRoZSB0eXBlIG9mIHRoZSBzdWNjZXNzZnVsIHJlc3BvbnNlLlxuICAgICAqL1xuICAgIHJlc3BvbnNlPzogUmVzcG9uc2U7XG5cbiAgICAvKipcbiAgICAgKiBBcmd1bWVudHMgZm9yIGV4ZWN1dGluZyB0aGUgcXVlcnkuXG4gICAgICpcbiAgICAgKiAtIGBwYXRoUGFyYW1zYDogVGhlIHBhdGggcGFyYW1ldGVycyBmb3IgdGhlIHF1ZXJ5LiAoaW4gZnJvbnQgb2YgdGhlID8gaW4gdGhlIHVybClcbiAgICAgKiAtIGBxdWVyeVBhcmFtc2A6IFRoZSBxdWVyeSBwYXJhbWV0ZXJzIGZvciB0aGUgcXVlcnkuIChhZnRlciB0aGUgPyBpbiB0aGUgdXJsKVxuICAgICAqIC0gYGJvZHlgOiBUaGUgYm9keSBmb3IgdGhlIHF1ZXJ5LiBVbmF2YWlsYWJsZSBmb3IgR0VULCBIRUFEIGFuZCBPUFRJT05TIHJlcXVlc3RzLlxuICAgICAqIC0gYGhlYWRlcnNgOiBUaGUgaGVhZGVycyBmb3IgdGhlIHF1ZXJ5LlxuICAgICAqIC0gYHZhcmlhYmxlc2A6IFRoZSB2YXJpYWJsZXMgZm9yIHRoZSBxdWVyeS4gKGdyYXBocWwgb25seSlcbiAgICAgKi9cbiAgICBhcmdzPzogQXJndW1lbnRzO1xuICB9O1xuXG4gIC8qKlxuICAgKiBPYmplY3QgY29udGFpbmluZyB0aGUgcXVlcnkncyBlbnRpdHkgc3RvcmUgaW5mb3JtYXRpb24uXG4gICAqL1xuICBlbnRpdHk/OiBRdWVyeUVudGl0eUNvbmZpZzxTdG9yZSwgRGF0YSwgUmVzcG9uc2UsIEFyZ3VtZW50cywgSWQ+O1xufTtcblxuZXhwb3J0IHR5cGUgUmVzdFF1ZXJ5Q29uZmlnPFxuICBSb3V0ZSBleHRlbmRzIFJvdXRlVHlwZTxBcmd1bWVudHM+LFxuICBSZXNwb25zZSxcbiAgQXJndW1lbnRzIGV4dGVuZHMgQmFzZUFyZ3VtZW50cyB8IHVuZGVmaW5lZCxcbiAgU3RvcmUgZXh0ZW5kcyBFbnRpdHlTdG9yZTx1bmtub3duPixcbiAgRGF0YSxcbiAgSWQsXG4+ID0gUXVlcnlDb25maWdCYXNlPFJlc3BvbnNlLCBBcmd1bWVudHMsIFN0b3JlLCBEYXRhLCBJZD4gJiB7XG4gIC8qKlxuICAgKiBUaGUgYXBpIHJvdXRlIHRvIHVzZSBmb3IgdGhlIHF1ZXJ5LlxuICAgKi9cbiAgcm91dGU6IFJvdXRlO1xufTtcblxuZXhwb3J0IHR5cGUgR3FsVHJhbnNmZXJPcHRpb24gPSAnR0VUJyB8ICdQT1NUJztcblxuZXhwb3J0IGludGVyZmFjZSBHcWxRdWVyeUNvbmZpZzxcbiAgUm91dGUgZXh0ZW5kcyBSb3V0ZVR5cGU8QXJndW1lbnRzPiB8IHVuZGVmaW5lZCxcbiAgUmVzcG9uc2UsXG4gIEFyZ3VtZW50cyBleHRlbmRzIEJhc2VBcmd1bWVudHMgfCB1bmRlZmluZWQsXG4gIFN0b3JlIGV4dGVuZHMgRW50aXR5U3RvcmU8dW5rbm93bj4sXG4gIERhdGEsXG4gIElkLFxuPiBleHRlbmRzIFF1ZXJ5Q29uZmlnQmFzZTxSZXNwb25zZSwgQXJndW1lbnRzLCBTdG9yZSwgRGF0YSwgSWQ+IHtcbiAgLyoqXG4gICAqIFRoZSBncmFwaHFsIHF1ZXJ5IHRvIHVzZSBmb3IgdGhlIHF1ZXJ5LlxuICAgKi9cbiAgcXVlcnk6IHN0cmluZztcblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyBpZiB0aGUgcXVlcnkgc2hvdWxkIGJlIHNlbnQgdmlhIEdFVCBvciBQT1NULlxuICAgKiAtIGBHRVRgOiBUaGUgcXVlcnkgd2lsbCBiZSBzZW50IHZpYSBxdWVyeSBwYXJhbWV0ZXJzLlxuICAgKiAtIGBQT1NUYDogVGhlIHF1ZXJ5IHdpbGwgYmUgc2VudCB2aWEgdGhlIGJvZHkuXG4gICAqIEBkZWZhdWx0ICdQT1NUJ1xuICAgKi9cbiAgdHJhbnNmZXJWaWE/OiBHcWxUcmFuc2Zlck9wdGlvbjtcblxuICAvKipcbiAgICogU3Vicm91dGUgdG8gdXNlIGZvciB0aGUgcXVlcnkuXG4gICAqL1xuICByb3V0ZT86IFJvdXRlO1xufVxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuZXhwb3J0IHR5cGUgQW55UmVzdFF1ZXJ5Q29uZmlnID0gUmVzdFF1ZXJ5Q29uZmlnPGFueSwgYW55LCBhbnksIGFueSwgYW55LCBhbnk+O1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbmV4cG9ydCB0eXBlIEFueUdxbFF1ZXJ5Q29uZmlnID0gR3FsUXVlcnlDb25maWc8YW55LCBhbnksIGFueSwgYW55LCBhbnksIGFueT47XG5cbmV4cG9ydCB0eXBlIFF1ZXJ5Q29uZmlnV2l0aG91dE1ldGhvZDxcbiAgUm91dGUgZXh0ZW5kcyBSb3V0ZVR5cGU8QXJndW1lbnRzPixcbiAgUmVzcG9uc2UsXG4gIEFyZ3VtZW50cyBleHRlbmRzIEJhc2VBcmd1bWVudHMgfCB1bmRlZmluZWQsXG4gIFN0b3JlIGV4dGVuZHMgRW50aXR5U3RvcmU8dW5rbm93bj4sXG4gIERhdGEsXG4gIElkLFxuPiA9IE9taXQ8UmVzdFF1ZXJ5Q29uZmlnPFJvdXRlLCBSZXNwb25zZSwgQXJndW1lbnRzLCBTdG9yZSwgRGF0YSwgSWQ+LCAnbWV0aG9kJz47XG5cbmV4cG9ydCB0eXBlIEdxbFF1ZXJ5Q29uZmlnV2l0aG91dE1ldGhvZDxcbiAgUm91dGUgZXh0ZW5kcyBSb3V0ZVR5cGU8QXJndW1lbnRzPixcbiAgUmVzcG9uc2UsXG4gIEFyZ3VtZW50cyBleHRlbmRzIEJhc2VBcmd1bWVudHMgfCB1bmRlZmluZWQsXG4gIFN0b3JlIGV4dGVuZHMgRW50aXR5U3RvcmU8dW5rbm93bj4sXG4gIERhdGEsXG4gIElkLFxuPiA9IE9taXQ8R3FsUXVlcnlDb25maWc8Um91dGUsIFJlc3BvbnNlLCBBcmd1bWVudHMsIFN0b3JlLCBEYXRhLCBJZD4sICdtZXRob2QnPjtcblxuZXhwb3J0IHR5cGUgQmFzZUFyZ3VtZW50cyA9IFdpdGhIZWFkZXJzICZcbiAgV2l0aFZhcmlhYmxlcyAmXG4gIFdpdGhCb2R5ICZcbiAgV2l0aFF1ZXJ5UGFyYW1zICZcbiAgV2l0aFBhdGhQYXJhbXMgJlxuICBXaXRoTW9jazx1bmtub3duPjtcblxuZXhwb3J0IGludGVyZmFjZSBXaXRoSGVhZGVycyB7XG4gIC8qKlxuICAgKiBUaGUgaGVhZGVycyB0byBzZW5kIHdpdGggdGhlIHF1ZXJ5LlxuICAgKi9cbiAgaGVhZGVycz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUXVlcnlNb2NrQ29uZmlnPE1vY2tSZXNwb25zZT4ge1xuICAvKipcbiAgICogVGhlIG1vY2sgcmVzcG9uc2UgdG8gdXNlIGZvciB0aGUgcXVlcnkuXG4gICAqL1xuICByZXNwb25zZT86IE1vY2tSZXNwb25zZTtcblxuICAvKipcbiAgICogVGhlIG1vY2sgZXJyb3IgdG8gdXNlIGZvciB0aGUgcXVlcnkuXG4gICAqL1xuICBlcnJvcj86IFJlcXVlc3RFcnJvcjtcblxuICAvKipcbiAgICogVGhlIGRlbGF5IGluIG1pbGxpc2Vjb25kcyB0byB3YWl0IGJlZm9yZSByZXNvbHZpbmcgdGhlIG1vY2suXG4gICAqIElmIHByb2dyZXNzIGlzIGVuYWJsZWQsIHRoZSBkZWxheSB3aWxsIGJlIHVzZWQgZm9yIGVhY2ggcHJvZ3Jlc3MgZXZlbnQuXG4gICAqIEBkZWZhdWx0IDIwMFxuICAgKi9cbiAgZGVsYXk/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gcmVwb3J0IHByb2dyZXNzIGZvciB0aGUgbW9jay5cbiAgICogRm9yIHRlc3RpbmcgZS5nLiBmaWxlIHVwbG9hZHMuXG4gICAqL1xuICBwcm9ncmVzcz86IHtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHByb2dyZXNzIGV2ZW50cyB0byByZXBvcnQuXG4gICAgICogQGRlZmF1bHQgNVxuICAgICAqL1xuICAgIGV2ZW50Q291bnQ/OiBudW1iZXI7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgdHlwZSBvZiBwcm9ncmVzcyBldmVudCB0byByZXBvcnQuXG4gICAgICogQGRlZmF1bHQgJ3VwbG9hZCdcbiAgICAgKi9cbiAgICBldmVudFR5cGU/OiAnZG93bmxvYWQnIHwgJ3VwbG9hZCc7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgc2l6ZSBvZiB0aGUgZmlsZSB0byByZXBvcnQgcHJvZ3Jlc3MgZm9yIGluIGJ5dGVzLlxuICAgICAqIEBkZWZhdWx0IDFfMDAwXzAwMCAoMU1CKVxuICAgICAqL1xuICAgIGZpbGVTaXplPzogbnVtYmVyO1xuXG4gICAgLyoqXG4gICAgICogSWYgdHJ1ZSwgdGhlIHRvdGFsIHNpemUgb2YgdGhlIGZpbGUgd2lsbCBiZSBvbWl0dGVkIGZyb20gdGhlIHByb2dyZXNzIGV2ZW50LlxuICAgICAqIFVzZWZ1bCBmb3IgdGVzdGluZyBlLmcuIGRvd25sb2FkIHByb2dyZXNzIHdoZW4gdGhlIHNlcnZlciBkb2VzIG5vdCBwcm92aWRlIGEgdG90YWwgc2l6ZS5cbiAgICAgKi9cbiAgICBvbWl0VG90YWw/OiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICogSWYgdHJ1ZSwgdGhlIHBhcnRpYWwgdGV4dCB3aWxsIGJlIG9taXR0ZWQgZnJvbSB0aGUgcHJvZ3Jlc3MgZXZlbnQuXG4gICAgICogVXNlZnVsIGZvciB0ZXN0aW5nIGUuZy4gZG93bmxvYWQgcHJvZ3Jlc3Mgd2hlbiB0aGUgc2VydmVyIGRvZXMgbm90IHByb3ZpZGUgYSBwYXJ0aWFsIHRleHQuXG4gICAgICovXG4gICAgb21pdFBhcnRpYWxUZXh0PzogYm9vbGVhbjtcbiAgfTtcblxuICAvKipcbiAgICogVGhpcyB3aWxsIG1vY2sgdGhlIHJlcXVlc3QgZmFpbGluZyBhbmQgZ2V0dGluZyByZXRyaWVkIDMgdGltZXMuIEFmdGVyLCB0aGUgcmVxdWVzdCB3aWxsIHN1Y2NlZWQgd2l0aCB0aGUgcHJvdmlkZWQgcmVzcG9uc2UuXG4gICAqIENhbiBub3QgYmUgdXNlZCB3aXRoIGBwcm9ncmVzc2AgZW5hYmxlZC5cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJldHJ5SW50b1Jlc3BvbnNlPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBXaXRoTW9jazxNb2NrUmVzcG9uc2U+IHtcbiAgbW9jaz86IFF1ZXJ5TW9ja0NvbmZpZzxNb2NrUmVzcG9uc2U+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFF1ZXJ5Q29uZmlnIHtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhpcyBxdWVyeSBzaG91bGQgYmUgYWRkZWQgdG8gdGhlIGludGVybmFsIHF1ZXJ5IHN0b3JlLlxuICAgKlxuICAgKiBHZW5lcmFsbHkgdGhpcyBzaG91bGQgYmUgbGVmdCBvbiBgZmFsc2VgIHVubGVzcyB5b3Uga25vdyB3aGF0IHlvdSBhcmUgZG9pbmcuXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBza2lwUXVlcnlTdG9yZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSBjYWNoZSBrZXkgdG8gdXNlIGZvciB0aGlzIHF1ZXJ5LlxuICAgKiBVc2VmdWwgZm9yIHF1ZXJpZXMgdGhhdCBhcmUgZXF1YWwgYnV0IHNob3VsZCBiZSBzdG9yZWQgc2VwYXJhdGVseS5cbiAgICogV2lsbCBiZSBnZW5lcmF0ZWQgYXV0b21hdGljYWxseSBpZiBub3QgcHJvdmlkZWQuXG4gICAqXG4gICAqIEdlbmVyYWxseSB0aGlzIHNob3VsZCBiZSBsZWZ0IG9uIGB1bmRlZmluZWRgIHVubGVzcyB5b3Uga25vdyB3aGF0IHlvdSBhcmUgZG9pbmcuXG4gICAqL1xuICBxdWVyeVN0b3JlQ2FjaGVLZXk/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgV2l0aENvbmZpZyB7XG4gIC8qKlxuICAgKiBBZGRpdGlvbmFsIGNvbmZpZ3VyYXRpb24gZm9yIHRoaXMgcXVlcnkuXG4gICAqL1xuICBjb25maWc/OiBRdWVyeUNvbmZpZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBXaXRoVmFyaWFibGVzIHtcbiAgLyoqXG4gICAqIFRoZSB2YXJpYWJsZXMgZm9yIHRoZSBxdWVyeS4gKGdyYXBocWwgb25seSlcbiAgICovXG4gIHZhcmlhYmxlcz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFdpdGhCb2R5IHtcbiAgLyoqXG4gICAqIFRoZSBib2R5IGZvciB0aGUgcXVlcnkuIFVuYXZhaWxhYmxlIGZvciBHRVQsIEhFQUQgYW5kIE9QVElPTlMgcmVxdWVzdHMuXG4gICAqL1xuICBib2R5PzogdW5rbm93bjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBXaXRoUXVlcnlQYXJhbXMge1xuICAvKipcbiAgICogVGhlIHF1ZXJ5IHBhcmFtZXRlcnMgZm9yIHRoZSBxdWVyeS4gKGFmdGVyIHRoZSA/IGluIHRoZSB1cmwpXG4gICAqL1xuICBxdWVyeVBhcmFtcz86IFF1ZXJ5UGFyYW1zO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFdpdGhQYXRoUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBwYXRoIHBhcmFtZXRlcnMgZm9yIHRoZSBxdWVyeS4gKGluIGZyb250IG9mIHRoZSA/IGluIHRoZSB1cmwpXG4gICAqL1xuICBwYXRoUGFyYW1zPzogUGF0aFBhcmFtcztcbn1cblxuZXhwb3J0IHR5cGUgUXVlcnlUcmlnZ2VyID0gJ3Byb2dyYW0nIHwgJ3BvbGwnIHwgJ2F1dG8nO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10eXBlc1xuZXhwb3J0IHR5cGUgRW1wdHlPYmplY3QgPSB7fTtcblxuZXhwb3J0IGludGVyZmFjZSBFeGVjdXRlUXVlcnlPcHRpb25zIHtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gc2tpcCB0aGUgY2FjaGUgZm9yIHRoaXMgcXVlcnkuIFRoaXMgd2lsbCBmb3JjZSB0aGUgcXVlcnkgdG8gYmUgZXhlY3V0ZWQuIEl0IG1pZ2h0IHN0aWxsIGJlIGNhdWdodCBieSB0aGUgbmF0aXZlIGJyb3dzZXIgY2FjaGUuXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBza2lwQ2FjaGU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGNhbmNlbCB0aGUgcHJldmlvdXMgcmVxdWVzdCBpZiBpdCBpcyBzdGlsbCBsb2FkaW5nLlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgY2FuY2VsUHJldmlvdXM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgdHJpZ2dlciB0eXBlIGZvciB0aGlzIHF1ZXJ5LlxuICAgKiAtIGBwcm9ncmFtYDogVGhlIHF1ZXJ5IHdhcyB0cmlnZ2VyZWQgYnkgdGhlIHVzZXIuXG4gICAqIC0gYHBvbGxgOiBUaGUgcXVlcnkgd2FzIHRyaWdnZXJlZCBieSBwb2xsaW5nLlxuICAgKiAtIGBhdXRvYDogVGhlIHF1ZXJ5IHdhcyB0cmlnZ2VyZWQgYnkgYW4gYXV0byByZWZyZXNoIGV2ZW50LlxuICAgKiBAZGVmYXVsdCAncHJvZ3JhbSdcbiAgICogQGludGVybmFsXG4gICAqL1xuICBfdHJpZ2dlcmVkVmlhPzogUXVlcnlUcmlnZ2VyO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoaXMgaXMgYSByZXRyeSBvZiBhbiB1bmF1dGhvcml6ZWQgcmVxdWVzdC5cbiAgICogQGludGVybmFsXG4gICAqL1xuICBfaXNVbmF1dGhvcml6ZWRSZXRyeT86IGJvb2xlYW47XG59XG5cbmV4cG9ydCB0eXBlIFJvdXRlVHlwZTxBcmd1bWVudHMgZXh0ZW5kcyBCYXNlQXJndW1lbnRzIHwgdW5kZWZpbmVkPiA9IEFyZ3VtZW50cyBleHRlbmRzIHtcbiAgcGF0aFBhcmFtczogaW5mZXIgUGF0aFBhcmFtcztcbn1cbiAgPyAocDogUGF0aFBhcmFtcykgPT4gUm91dGVTdHJpbmdcbiAgOiBSb3V0ZVN0cmluZztcblxuZXhwb3J0IHR5cGUgUm91dGVTdHJpbmcgPSBgLyR7c3RyaW5nfWA7XG5cbmV4cG9ydCB0eXBlIEFueVJvdXRlID0gKChwOiBQYXRoUGFyYW1zKSA9PiBzdHJpbmcpIHwgUm91dGVTdHJpbmc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUG9sbENvbmZpZyB7XG4gIC8qKlxuICAgKiBUaGUgaW50ZXJ2YWwgaW4gbWlsbGlzZWNvbmRzIHRvIHBvbGwgdGhlIHF1ZXJ5LlxuICAgKi9cbiAgaW50ZXJ2YWw6IG51bWJlcjtcblxuICAvKipcbiAgICogQSBvYnNlcnZhYmxlIHRoYXQgd2lsbCBzdG9wIHRoZSBwb2xsaW5nIHdoZW4gaXQgZW1pdHMuXG4gICAqL1xuICB0YWtlVW50aWw6IE9ic2VydmFibGU8dW5rbm93bj47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gdHJpZ2dlciB0aGUgcXVlcnkgaW1tZWRpYXRlbHkgYWZ0ZXIgcG9sbGluZyBzdGFydHMuXG4gICAqL1xuICB0cmlnZ2VySW1tZWRpYXRlbHk/OiBib29sZWFuO1xufVxuXG5leHBvcnQgY29uc3QgZW51bSBRdWVyeVN0YXRlVHlwZSB7XG4gIFByZXBhcmVkID0gJ1BSRVBBUkVEJyxcbiAgTG9hZGluZyA9ICdMT0FESU5HJyxcbiAgU3VjY2VzcyA9ICdTVUNDRVNTJyxcbiAgRmFpbHVyZSA9ICdGQUlMVVJFJyxcbiAgQ2FuY2VsbGVkID0gJ0NBTkNFTExFRCcsXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHJlcGFyZWQge1xuICB0eXBlOiBRdWVyeVN0YXRlVHlwZS5QcmVwYXJlZDtcbiAgbWV0YTogUXVlcnlTdGF0ZU1ldGE7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3VjY2VzczxSZXNwb25zZSA9IHVua25vd24+IHtcbiAgdHlwZTogUXVlcnlTdGF0ZVR5cGUuU3VjY2VzcztcbiAgcmVzcG9uc2U6IFJlc3BvbnNlO1xuICBtZXRhOiBRdWVyeVN0YXRlU3VjY2Vzc01ldGE7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRmFpbHVyZSB7XG4gIHR5cGU6IFF1ZXJ5U3RhdGVUeXBlLkZhaWx1cmU7XG4gIGVycm9yOiBSZXF1ZXN0RXJyb3I7XG4gIG1ldGE6IFF1ZXJ5U3RhdGVNZXRhO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIExvYWRpbmcge1xuICB0eXBlOiBRdWVyeVN0YXRlVHlwZS5Mb2FkaW5nO1xuICBtZXRhOiBRdWVyeVN0YXRlTWV0YTtcbiAgcGFydGlhbFRleHQ/OiBzdHJpbmc7XG4gIHByb2dyZXNzPzogUmVxdWVzdFByb2dyZXNzO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENhbmNlbGxlZCB7XG4gIHR5cGU6IFF1ZXJ5U3RhdGVUeXBlLkNhbmNlbGxlZDtcbiAgbWV0YTogUXVlcnlTdGF0ZU1ldGE7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUXVlcnlTdGF0ZU1ldGEge1xuICBpZDogbnVtYmVyO1xuICB0cmlnZ2VyZWRWaWE6IFF1ZXJ5VHJpZ2dlcjtcbiAgaXNXYWl0aW5nRm9yUmV0cnk/OiBib29sZWFuO1xuICByZXRyeU51bWJlcj86IG51bWJlcjtcbiAgcmV0cnlEZWxheT86IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBRdWVyeVN0YXRlU3VjY2Vzc01ldGEgZXh0ZW5kcyBRdWVyeVN0YXRlTWV0YSB7XG4gIGV4cGlyZXNBdD86IG51bWJlcjtcbn1cblxuZXhwb3J0IHR5cGUgUXVlcnlTdGF0ZTxSZXNwb25zZSA9IHVua25vd24+ID0gTG9hZGluZyB8IFN1Y2Nlc3M8UmVzcG9uc2U+IHwgRmFpbHVyZSB8IENhbmNlbGxlZCB8IFByZXBhcmVkO1xuXG5leHBvcnQgdHlwZSBRdWVyeVN0YXRlUmVzcG9uc2VPZjxUIGV4dGVuZHMgUXVlcnlTdGF0ZSA9IFF1ZXJ5U3RhdGU+ID1cbiAgVCBleHRlbmRzIFN1Y2Nlc3M8aW5mZXIgUmVzcG9uc2U+ID8gUmVzcG9uc2UgOiBuZXZlcjtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbmV4cG9ydCB0eXBlIEFueVF1ZXJ5ID0gUXVlcnk8YW55LCBhbnksIGFueSwgYW55LCBhbnksIGFueT47XG5cbmV4cG9ydCB0eXBlIEFueVF1ZXJ5Q3JlYXRvckNvbGxlY3Rpb24gPSB7IFtuYW1lOiBzdHJpbmddOiBBbnlRdWVyeUNyZWF0b3IgfTtcblxuZXhwb3J0IHR5cGUgUXVlcnlDb2xsZWN0aW9uT2Y8VCBleHRlbmRzIHsgW25hbWU6IHN0cmluZ106IEFueVF1ZXJ5Q3JlYXRvciB9PiA9IHtcbiAgW0sgaW4ga2V5b2YgVF06IHsgdHlwZTogSzsgcXVlcnk6IENvbnN0cnVjdFF1ZXJ5PFRbS10+IH07XG59W2tleW9mIFRdO1xuXG5leHBvcnQgdHlwZSBBbnlRdWVyeUNvbGxlY3Rpb24gPSBRdWVyeUNvbGxlY3Rpb25PZjxBbnlRdWVyeUNyZWF0b3JDb2xsZWN0aW9uPjtcblxuZXhwb3J0IHR5cGUgUXVlcnlPZjxUIGV4dGVuZHMgQW55UXVlcnlDb2xsZWN0aW9uIHwgQW55UXVlcnkgfCBudWxsPiA9IFQgZXh0ZW5kcyBBbnlRdWVyeVxuICA/IFRcbiAgOiBUIGV4dGVuZHMgQW55UXVlcnlDb2xsZWN0aW9uXG4gICAgPyBUWydxdWVyeSddXG4gICAgOiBuZXZlcjtcblxuZXhwb3J0IHR5cGUgQW55UXVlcnlDb2xsZWN0aW9uUmVzcG9uc2U8VCBleHRlbmRzIEFueVF1ZXJ5Q29sbGVjdGlvbj4gPSBRdWVyeVJlc3BvbnNlT2Y8VFsncXVlcnknXT47XG5leHBvcnQgdHlwZSBBbnlRdWVyeUNvbGxlY3Rpb25EYXRhPFQgZXh0ZW5kcyBBbnlRdWVyeUNvbGxlY3Rpb24+ID0gUXVlcnlEYXRhT2Y8VFsncXVlcnknXT47XG5cbmV4cG9ydCB0eXBlIFF1ZXJ5Q29sbGVjdGlvbktleXNPZjxUIGV4dGVuZHMgQW55UXVlcnlDb2xsZWN0aW9uIHwgQW55UXVlcnkgfCBudWxsPiA9IFQgZXh0ZW5kcyBBbnlRdWVyeUNvbGxlY3Rpb25cbiAgPyBUWyd0eXBlJ11cbiAgOiBuZXZlcjtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbmV4cG9ydCBpbnRlcmZhY2UgUmVzZXRQYWdlT25FcnJvck9wZXJhdG9yQ29uZmlnPEogZXh0ZW5kcyBRdWVyeUZvcm08YW55Pj4ge1xuICAvKipcbiAgICogVGhlIHF1ZXJ5IGZvcm0gdG8gcmVzZXQgdGhlIHBhZ2Ugb2YuXG4gICAqL1xuICBxdWVyeUZvcm06IEo7XG5cbiAgLyoqXG4gICAqIFRoZSBrZXkgb2YgdGhlIHBhZ2UgY29udHJvbCBpbiB0aGUgcXVlcnkgZm9ybS5cbiAgICogQGRlZmF1bHQgJ3BhZ2UnXG4gICAqL1xuICBwYWdlQ29udHJvbEtleT86IHN0cmluZztcbn1cbiJdfQ==