@ethlete/query 5.16.0 → 5.16.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (184) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/esm2022/ethlete-query.mjs +5 -0
  3. package/esm2022/index.mjs +20 -0
  4. package/esm2022/lib/auth/auth-provider.types.mjs +2 -0
  5. package/esm2022/lib/auth/auth-provider.utils.mjs +25 -0
  6. package/esm2022/lib/auth/basic-auth-provider.mjs +15 -0
  7. package/esm2022/lib/auth/bearer-auth-provider.mjs +168 -0
  8. package/esm2022/lib/auth/custom-header-auth-provider.mjs +12 -0
  9. package/esm2022/lib/auth/index.mjs +6 -0
  10. package/esm2022/lib/class-validator/class-validator.types.mjs +2 -0
  11. package/esm2022/lib/class-validator/class-validator.utils.mjs +4 -0
  12. package/esm2022/lib/class-validator/index.mjs +3 -0
  13. package/esm2022/lib/devtools/components/query-devtools/index.mjs +2 -0
  14. package/esm2022/lib/devtools/components/query-devtools/query-devtools.component.mjs +297 -0
  15. package/esm2022/lib/devtools/pipes/index.mjs +2 -0
  16. package/esm2022/lib/devtools/pipes/query-short-name.pipe.mjs +24 -0
  17. package/esm2022/lib/devtools/utils/index.mjs +2 -0
  18. package/esm2022/lib/devtools/utils/query-client.utils.mjs +13 -0
  19. package/esm2022/lib/directives/index.mjs +4 -0
  20. package/esm2022/lib/directives/infinity-query-trigger.directive.mjs +56 -0
  21. package/esm2022/lib/directives/infinity-query.directive.mjs +147 -0
  22. package/esm2022/lib/directives/query.directive.mjs +123 -0
  23. package/esm2022/lib/entity/entity-store.mjs +127 -0
  24. package/esm2022/lib/entity/entity.types.mjs +2 -0
  25. package/esm2022/lib/entity/entity.utils.mjs +29 -0
  26. package/esm2022/lib/entity/index.mjs +4 -0
  27. package/esm2022/lib/gql/gql.mjs +23 -0
  28. package/esm2022/lib/gql/index.mjs +2 -0
  29. package/esm2022/lib/infinite-query/index.mjs +4 -0
  30. package/esm2022/lib/infinite-query/infinity-query.mjs +171 -0
  31. package/esm2022/lib/infinite-query/infinity-query.types.mjs +2 -0
  32. package/esm2022/lib/infinite-query/infinity-query.utils.mjs +3 -0
  33. package/esm2022/lib/logger/index.mjs +2 -0
  34. package/esm2022/lib/logger/logger.mjs +16 -0
  35. package/esm2022/lib/query/index.mjs +4 -0
  36. package/esm2022/lib/query/query.mjs +430 -0
  37. package/esm2022/lib/query/query.types.mjs +2 -0
  38. package/esm2022/lib/query/query.utils.mjs +253 -0
  39. package/esm2022/lib/query-client/index.mjs +4 -0
  40. package/esm2022/lib/query-client/query-client.mjs +80 -0
  41. package/esm2022/lib/query-client/query-client.types.mjs +2 -0
  42. package/esm2022/lib/query-client/query-client.utils.mjs +20 -0
  43. package/esm2022/lib/query-creator/index.mjs +3 -0
  44. package/esm2022/lib/query-creator/query-creator.mjs +55 -0
  45. package/esm2022/lib/query-creator/query-creator.types.mjs +2 -0
  46. package/esm2022/lib/query-form/index.mjs +4 -0
  47. package/esm2022/lib/query-form/query-form.mjs +379 -0
  48. package/esm2022/lib/query-form/query-form.types.mjs +2 -0
  49. package/esm2022/lib/query-form/query-form.utils.mjs +97 -0
  50. package/esm2022/lib/query-store/index.mjs +2 -0
  51. package/esm2022/lib/query-store/query-store.mjs +144 -0
  52. package/esm2022/lib/request/index.mjs +4 -0
  53. package/esm2022/lib/request/request.mjs +196 -0
  54. package/esm2022/lib/request/request.types.mjs +2 -0
  55. package/esm2022/lib/request/request.util.mjs +252 -0
  56. package/esm2022/lib/symfony/index.mjs +3 -0
  57. package/esm2022/lib/symfony/symfony.types.mjs +2 -0
  58. package/esm2022/lib/symfony/symfony.utils.mjs +31 -0
  59. package/esm2022/lib/utils/data.utils.mjs +138 -0
  60. package/esm2022/lib/utils/deep-freeze.util.mjs +17 -0
  61. package/esm2022/lib/utils/def.util.mjs +8 -0
  62. package/esm2022/lib/utils/index.mjs +4 -0
  63. package/fesm2022/ethlete-query.mjs +3289 -0
  64. package/fesm2022/ethlete-query.mjs.map +1 -0
  65. package/{src/index.ts → index.d.ts} +0 -2
  66. package/lib/auth/auth-provider.types.d.ts +133 -0
  67. package/lib/auth/auth-provider.utils.d.ts +9 -0
  68. package/lib/auth/basic-auth-provider.d.ts +10 -0
  69. package/lib/auth/bearer-auth-provider.d.ts +23 -0
  70. package/lib/auth/custom-header-auth-provider.d.ts +9 -0
  71. package/{src/lib/class-validator/class-validator.types.ts → lib/class-validator/class-validator.types.d.ts} +3 -4
  72. package/lib/class-validator/class-validator.utils.d.ts +2 -0
  73. package/lib/devtools/components/query-devtools/query-devtools.component.d.ts +151 -0
  74. package/lib/devtools/pipes/query-short-name.pipe.d.ts +8 -0
  75. package/lib/devtools/utils/query-client.utils.d.ts +12 -0
  76. package/lib/directives/infinity-query-trigger.directive.d.ts +15 -0
  77. package/lib/directives/infinity-query.directive.d.ts +49 -0
  78. package/lib/directives/query.directive.d.ts +63 -0
  79. package/lib/entity/entity-store.d.ts +25 -0
  80. package/lib/entity/entity.types.d.ts +25 -0
  81. package/lib/entity/entity.utils.d.ts +12 -0
  82. package/lib/gql/gql.d.ts +6 -0
  83. package/lib/infinite-query/infinity-query.d.ts +29 -0
  84. package/lib/infinite-query/infinity-query.types.d.ts +104 -0
  85. package/lib/infinite-query/infinity-query.utils.d.ts +4 -0
  86. package/lib/logger/logger.d.ts +12 -0
  87. package/lib/query/query.d.ts +60 -0
  88. package/lib/query/query.types.d.ts +388 -0
  89. package/lib/query/query.utils.d.ts +82 -0
  90. package/lib/query-client/query-client.d.ts +29 -0
  91. package/lib/query-client/query-client.types.d.ts +82 -0
  92. package/lib/query-client/query-client.utils.d.ts +4 -0
  93. package/lib/query-creator/query-creator.d.ts +20 -0
  94. package/lib/query-creator/query-creator.types.d.ts +13 -0
  95. package/lib/query-form/query-form.d.ts +91 -0
  96. package/lib/query-form/query-form.types.d.ts +145 -0
  97. package/lib/query-form/query-form.utils.d.ts +13 -0
  98. package/lib/query-store/query-store.d.ts +31 -0
  99. package/lib/request/request.d.ts +3 -0
  100. package/lib/request/request.types.d.ts +126 -0
  101. package/lib/request/request.util.d.ts +92 -0
  102. package/lib/symfony/symfony.types.d.ts +19 -0
  103. package/lib/symfony/symfony.utils.d.ts +6 -0
  104. package/lib/utils/data.utils.d.ts +59 -0
  105. package/lib/utils/deep-freeze.util.d.ts +1 -0
  106. package/{src/lib/utils/def.util.ts → lib/utils/def.util.d.ts} +1 -1
  107. package/package.json +23 -6
  108. package/.eslintrc.json +0 -40
  109. package/jest.config.ts +0 -23
  110. package/ng-package.json +0 -8
  111. package/project.json +0 -37
  112. package/src/lib/auth/auth-provider.types.ts +0 -160
  113. package/src/lib/auth/auth-provider.utils.ts +0 -39
  114. package/src/lib/auth/basic-auth-provider.ts +0 -17
  115. package/src/lib/auth/bearer-auth-provider.ts +0 -243
  116. package/src/lib/auth/custom-header-auth-provider.ts +0 -13
  117. package/src/lib/class-validator/class-validator.utils.ts +0 -5
  118. package/src/lib/devtools/components/query-devtools/query-devtools.component.html +0 -402
  119. package/src/lib/devtools/components/query-devtools/query-devtools.component.scss +0 -360
  120. package/src/lib/devtools/components/query-devtools/query-devtools.component.ts +0 -427
  121. package/src/lib/devtools/pipes/query-short-name.pipe.ts +0 -24
  122. package/src/lib/devtools/utils/query-client.utils.ts +0 -25
  123. package/src/lib/directives/infinity-query-trigger.directive.ts +0 -58
  124. package/src/lib/directives/infinity-query.directive.ts +0 -208
  125. package/src/lib/directives/query.directive.ts +0 -201
  126. package/src/lib/entity/entity-store.ts +0 -180
  127. package/src/lib/entity/entity.types.ts +0 -34
  128. package/src/lib/entity/entity.utils.ts +0 -51
  129. package/src/lib/gql/gql.ts +0 -22
  130. package/src/lib/infinite-query/infinity-query.ts +0 -245
  131. package/src/lib/infinite-query/infinity-query.types.ts +0 -149
  132. package/src/lib/infinite-query/infinity-query.utils.ts +0 -14
  133. package/src/lib/logger/logger.ts +0 -30
  134. package/src/lib/query/query.ts +0 -631
  135. package/src/lib/query/query.types.ts +0 -532
  136. package/src/lib/query/query.utils.spec.ts +0 -92
  137. package/src/lib/query/query.utils.ts +0 -450
  138. package/src/lib/query-client/query-client.spec.ts +0 -77
  139. package/src/lib/query-client/query-client.ts +0 -195
  140. package/src/lib/query-client/query-client.types.ts +0 -101
  141. package/src/lib/query-client/query-client.utils.spec.ts +0 -61
  142. package/src/lib/query-client/query-client.utils.ts +0 -28
  143. package/src/lib/query-creator/query-creator.ts +0 -103
  144. package/src/lib/query-creator/query-creator.types.ts +0 -74
  145. package/src/lib/query-form/query-form.ts +0 -526
  146. package/src/lib/query-form/query-form.types.ts +0 -169
  147. package/src/lib/query-form/query-form.utils.ts +0 -116
  148. package/src/lib/query-store/query-store.ts +0 -192
  149. package/src/lib/request/request.ts +0 -253
  150. package/src/lib/request/request.types.ts +0 -164
  151. package/src/lib/request/request.util.spec.ts +0 -177
  152. package/src/lib/request/request.util.ts +0 -399
  153. package/src/lib/stories/angular-example-page.mdx +0 -85
  154. package/src/lib/stories/authentication-page.mdx +0 -35
  155. package/src/lib/stories/changelog-page.mdx +0 -9
  156. package/src/lib/stories/client-page.mdx +0 -100
  157. package/src/lib/stories/queries-page.mdx +0 -117
  158. package/src/lib/symfony/symfony.types.ts +0 -21
  159. package/src/lib/symfony/symfony.utils.ts +0 -43
  160. package/src/lib/utils/data.utils.ts +0 -280
  161. package/src/lib/utils/deep-freeze.util.ts +0 -21
  162. package/src/test-setup.ts +0 -1
  163. package/tsconfig.json +0 -29
  164. package/tsconfig.lib.json +0 -12
  165. package/tsconfig.lib.prod.json +0 -10
  166. package/tsconfig.spec.json +0 -11
  167. /package/{src/lib/auth/index.ts → lib/auth/index.d.ts} +0 -0
  168. /package/{src/lib/class-validator/index.ts → lib/class-validator/index.d.ts} +0 -0
  169. /package/{src/lib/devtools/components/query-devtools/index.ts → lib/devtools/components/query-devtools/index.d.ts} +0 -0
  170. /package/{src/lib/devtools/pipes/index.ts → lib/devtools/pipes/index.d.ts} +0 -0
  171. /package/{src/lib/devtools/utils/index.ts → lib/devtools/utils/index.d.ts} +0 -0
  172. /package/{src/lib/directives/index.ts → lib/directives/index.d.ts} +0 -0
  173. /package/{src/lib/entity/index.ts → lib/entity/index.d.ts} +0 -0
  174. /package/{src/lib/gql/index.ts → lib/gql/index.d.ts} +0 -0
  175. /package/{src/lib/infinite-query/index.ts → lib/infinite-query/index.d.ts} +0 -0
  176. /package/{src/lib/logger/index.ts → lib/logger/index.d.ts} +0 -0
  177. /package/{src/lib/query/index.ts → lib/query/index.d.ts} +0 -0
  178. /package/{src/lib/query-client/index.ts → lib/query-client/index.d.ts} +0 -0
  179. /package/{src/lib/query-creator/index.ts → lib/query-creator/index.d.ts} +0 -0
  180. /package/{src/lib/query-form/index.ts → lib/query-form/index.d.ts} +0 -0
  181. /package/{src/lib/query-store/index.ts → lib/query-store/index.d.ts} +0 -0
  182. /package/{src/lib/request/index.ts → lib/request/index.d.ts} +0 -0
  183. /package/{src/lib/symfony/index.ts → lib/symfony/index.d.ts} +0 -0
  184. /package/{src/lib/utils/index.ts → lib/utils/index.d.ts} +0 -0
@@ -0,0 +1,430 @@
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
+ if (this._dependents[tNodeIndex] !== undefined) {
416
+ this._dependents[tNodeIndex]--;
417
+ }
418
+ if (count <= 1) {
419
+ delete this._dependents[tNodeIndex];
420
+ }
421
+ this._dependentsChanged$.next(this._dependents);
422
+ }
423
+ /**
424
+ * @internal
425
+ */
426
+ _hasDependents() {
427
+ return Object.keys(this._dependents).length > 0;
428
+ }
429
+ }
430
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlcnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL3F1ZXJ5L3NyYy9saWIvcXVlcnkvcXVlcnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMxQyxPQUFPLEVBQ0wsZUFBZSxFQUNmLGFBQWEsRUFDYixNQUFNLEVBQ04sUUFBUSxFQUNSLEdBQUcsRUFFSCxFQUFFLEVBQ0YsYUFBYSxFQUNiLFdBQVcsRUFDWCxJQUFJLEVBQ0osT0FBTyxFQUVQLFNBQVMsRUFDVCxJQUFJLEVBQ0osU0FBUyxFQUNULFNBQVMsRUFDVCxHQUFHLEVBQ0gsS0FBSyxHQUNOLE1BQU0sTUFBTSxDQUFDO0FBQ2QsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sU0FBUyxDQUFDO0FBRS9DLE9BQU8sRUFBZSxnQkFBZ0IsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ2hFLE9BQU8sRUFBa0IsT0FBTyxFQUE4QyxNQUFNLFlBQVksQ0FBQztBQWFqRyxPQUFPLEVBQ0wsZ0JBQWdCLEVBQ2hCLG1CQUFtQixFQUNuQixrQkFBa0IsRUFDbEIsYUFBYSxFQUNiLGFBQWEsRUFDYixnQkFBZ0IsRUFDaEIscUJBQXFCLEVBQ3JCLG1CQUFtQixFQUNuQixtQkFBbUIsRUFDbkIsb0JBQW9CLEVBQ3BCLG1CQUFtQixFQUNuQixnQkFBZ0IsRUFDaEIsaUJBQWlCLEdBQ2xCLE1BQU0sZUFBZSxDQUFDO0FBRXZCLElBQUksWUFBWSxHQUFHLENBQUMsQ0FBQztBQUVyQixNQUFNLE9BQU8sS0FBSztJQXVDaEIsSUFBWSxPQUFPO1FBQ2pCLE9BQU8sRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDO0lBQ2hDLENBQUM7SUFFRCxJQUFJLE1BQU07UUFDUixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUN0QixHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtZQUNSLElB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QkFBZ0IsQ0FBQyxVQUFrQjtRQUNqQyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzNDLElBQUksS0FBSyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ3hCLE9BQU87UUFDVCxDQUFDO1FBRUQsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQy9DLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztRQUNqQyxDQUFDO1FBRUQsSUFBSSxLQUFLLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDZixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDdEMsQ0FBQztRQUVELElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFFRDs7T0FFRztJQUNILGNBQWM7UUFDWixPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFDbEQsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdW50cmFja2VkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBCZWhhdmlvclN1YmplY3QsXG4gIGNvbWJpbmVMYXRlc3QsXG4gIGZpbHRlcixcbiAgaW50ZXJ2YWwsXG4gIG1hcCxcbiAgT2JzZXJ2YWJsZSxcbiAgb2YsXG4gIFJlcGxheVN1YmplY3QsXG4gIHNoYXJlUmVwbGF5LFxuICBza2lwLFxuICBTdWJqZWN0LFxuICBTdWJzY3JpcHRpb24sXG4gIHN3aXRjaE1hcCxcbiAgdGFrZSxcbiAgdGFrZVVudGlsLFxuICB0YWtlV2hpbGUsXG4gIHRhcCxcbiAgdGltZXIsXG59IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgaXNCZWFyZXJBdXRoUHJvdmlkZXIgfSBmcm9tICcuLi9hdXRoJztcbmltcG9ydCB7IEVudGl0eVN0b3JlIH0gZnJvbSAnLi4vZW50aXR5JztcbmltcG9ydCB7IFF1ZXJ5Q2xpZW50LCBzaG91bGRDYWNoZVF1ZXJ5IH0gZnJvbSAnLi4vcXVlcnktY2xpZW50JztcbmltcG9ydCB7IEh0dHBTdGF0dXNDb2RlLCByZXF1ZXN0LCBSZXF1ZXN0RXJyb3IsIFJlcXVlc3RFdmVudCwgUmVxdWVzdEhlYWRlcnMgfSBmcm9tICcuLi9yZXF1ZXN0JztcbmltcG9ydCB7XG4gIEJhc2VBcmd1bWVudHMsXG4gIEV4ZWN1dGVRdWVyeU9wdGlvbnMsXG4gIEdxbFF1ZXJ5Q29uZmlnLFxuICBQb2xsQ29uZmlnLFxuICBRdWVyeUF1dG9SZWZyZXNoQ29uZmlnLFxuICBRdWVyeVN0YXRlLFxuICBRdWVyeVN0YXRlTWV0YSxcbiAgUXVlcnlTdGF0ZVR5cGUsXG4gIFJlc3RRdWVyeUNvbmZpZyxcbiAgUm91dGVUeXBlLFxufSBmcm9tICcuL3F1ZXJ5LnR5cGVzJztcbmltcG9ydCB7XG4gIGNvbXB1dGVRdWVyeUJvZHksXG4gIGNvbXB1dGVRdWVyeUhlYWRlcnMsXG4gIGNvbXB1dGVRdWVyeU1ldGhvZCxcbiAgZmlsdGVyRmFpbHVyZSxcbiAgZmlsdGVyU3VjY2VzcyxcbiAgaXNHcWxRdWVyeUNvbmZpZyxcbiAgaXNRdWVyeVN0YXRlQ2FuY2VsbGVkLFxuICBpc1F1ZXJ5U3RhdGVGYWlsdXJlLFxuICBpc1F1ZXJ5U3RhdGVMb2FkaW5nLFxuICBpc1F1ZXJ5U3RhdGVQcmVwYXJlZCxcbiAgaXNRdWVyeVN0YXRlU3VjY2VzcyxcbiAgc3dpdGNoUXVlcnlTdGF0ZSxcbiAgdGFrZVVudGlsUmVzcG9uc2UsXG59IGZyb20gJy4vcXVlcnkudXRpbHMnO1xuXG5sZXQgX25leHRRdWVyeUlkID0gMDtcblxuZXhwb3J0IGNsYXNzIFF1ZXJ5PFxuICBSZXNwb25zZSxcbiAgQXJndW1lbnRzIGV4dGVuZHMgQmFzZUFyZ3VtZW50cyB8IHVuZGVmaW5lZCxcbiAgUm91dGUgZXh0ZW5kcyBSb3V0ZVR5cGU8QXJndW1lbnRzPixcbiAgU3RvcmUgZXh0ZW5kcyBFbnRpdHlTdG9yZTx1bmtub3duPixcbiAgRGF0YSxcbiAgSWQsXG4+IHtcbiAgcmVhZG9ubHkgX2lkID0gX25leHRRdWVyeUlkKys7XG5cbiAgcHJpdmF0ZSBfY3VycmVudExvY2FsSWQgPSAwO1xuICBwcml2YXRlIF9wb2xsaW5nU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb24gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBfb25BYm9ydCQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuICBwcml2YXRlIF9jdXJyZW50UG9sbENvbmZpZzogUG9sbENvbmZpZyB8IG51bGwgPSBudWxsO1xuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICogVXNlZCB0byB0cmFjayB3aGljaCBjb21wb25lbnRzIGRlcGVuZCBvbiB0aGlzIHF1ZXJ5LlxuICAgKiBUaGUga2V5IGlzIHRoZSBjb21wb25lbnQncyBfdE5vZGUgaW5kZXguXG4gICAqIFRoZSB2YWx1ZSBpcyB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBjb21wb25lbnQgaGFzIHN1YnNjcmliZWQgdG8gdGhpcyBxdWVyeS5cbiAgICogVGhlIHZhbHVlIG1pZ2h0IGluY3JlYXNlIHNpbmNlIHdlIGNhbnQgZGlzdGluZ3Vpc2ggYmV0d2VlbiBhIGNvbXBvbmVudCBhbmQgYSBob3N0IGRpcmVjdGl2ZSBhcHBsaWVkIHRvIGl0LlxuICAgKi9cbiAgX2RlcGVuZGVudHM6IFJlY29yZDxudW1iZXIsIG51bWJlcj4gPSB7fTtcblxuICAvKipcbiAgICogQGludGVybmFsXG4gICAqL1xuICBfZGVwZW5kZW50c0NoYW5nZWQkID0gbmV3IFJlcGxheVN1YmplY3Q8UmVjb3JkPG51bWJlciwgbnVtYmVyPj4oKTtcblxuICAvKipcbiAgICogQGludGVybmFsXG4gICAqL1xuICBfaXNQb2xsaW5nUGF1c2VkID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfc3RhdGUkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxRdWVyeVN0YXRlPFJlc3BvbnNlPj4oe1xuICAgIHR5cGU6IFF1ZXJ5U3RhdGVUeXBlLlByZXBhcmVkLFxuICAgIG1ldGE6IHsgaWQ6IHRoaXMuX2N1cnJlbnRMb2NhbElkLCB0cmlnZ2VyZWRWaWE6ICdwcm9ncmFtJyB9LFxuICB9KTtcblxuICBwcml2YXRlIGdldCBfbmV4dElkKCkge1xuICAgIHJldHVybiArK3RoaXMuX2N1cnJlbnRMb2NhbElkO1xuICB9XG5cbiAgZ2V0IHN0YXRlJCgpOiBPYnNlcnZhYmxlPFF1ZXJ5U3RhdGU8RGF0YT4+IHtcbiAgICByZXR1cm4gdGhpcy5fc3RhdGUkLnBpcGUoXG4gICAgICB0YXAoKHMpID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLl9jbGllbnQuY29uZmlnLmxvZ2dpbmc/LnByZXBhcmVkUXVlcnlTdWJzY3JpcHRpb25zKSByZXR1cm47XG5cbiAgICAgICAgaWYgKGlzUXVlcnlTdGF0ZVByZXBhcmVkKHMpKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgYFF1ZXJ5ICR7dGhpcy5fcm91dGVXaXRoUGFyYW1zfSB3YXMgc3Vic2NyaWJlZCB0byBpbiB0aGUgcHJlcGFyZWQgc3RhdGUuIERpZCB5b3UgZm9yZ2V0IHRvIGNhbGwgLmV4ZWN1dGUoKT9gLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0pLFxuICAgICAgc3dpdGNoTWFwKChzKSA9PiB0aGlzLl90cmFuc2Zvcm1TdGF0ZShzKSksXG4gICAgICBzaGFyZVJlcGxheSh7IGJ1ZmZlclNpemU6IDEsIHJlZkNvdW50OiB0cnVlIH0pLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIHF1ZXJ5LlxuICAgKlxuICAgKiAqKldhcm5pbmchKiogVGhpcyBkaWZmZXJzIGZyb20gdGhlIGBzdGF0ZSRgIG9ic2VydmFibGUgaW4gdGhhdCBpdCBkb2VzIG5vdCB1c2UgdGhlIHF1ZXJ5IHN0b3JlLiBUaHVzLCB0aGUgcmVzcG9uc2UgZGF0YSBtaWdodCBiZSBvdXRkYXRlZC5cbiAgICogVXNlIGBzdGF0ZSRgIChvciBgZmlyc3RWYWx1ZUZyb20oc3RhdGUkKWApIHRoZSBtb3N0IHVwLXRvLWRhdGUgZGF0YS5cbiAgICovXG4gIGdldCByYXdTdGF0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhdGUkLnZhbHVlO1xuICB9XG5cbiAgZ2V0IGlzRXhwaXJlZCgpIHtcbiAgICBpZiAoaXNRdWVyeVN0YXRlTG9hZGluZyh0aGlzLnJhd1N0YXRlKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIGlzUXVlcnlTdGF0ZVByZXBhcmVkKHRoaXMucmF3U3RhdGUpIHx8XG4gICAgICBpc1F1ZXJ5U3RhdGVDYW5jZWxsZWQodGhpcy5yYXdTdGF0ZSkgfHxcbiAgICAgIGlzUXVlcnlTdGF0ZUZhaWx1cmUodGhpcy5yYXdTdGF0ZSlcbiAgICApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGNvbnN0IHRzID0gdGhpcy5yYXdTdGF0ZS5tZXRhLmV4cGlyZXNBdDtcblxuICAgIGlmICghdHMpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiB0cyA8IERhdGUubm93KCk7XG4gIH1cblxuICBnZXQgaXNJblVzZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhdGUkLm9ic2VydmVkIHx8IE9iamVjdC5rZXlzKHRoaXMuX2RlcGVuZGVudHMpLmxlbmd0aCA+IDA7XG4gIH1cblxuICAvKipcbiAgICogQGludGVybmFsXG4gICAqL1xuICBnZXQgX3N1YnNjcmliZXJDb3VudCgpIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhdGUkLm9ic2VydmVycy5sZW5ndGg7XG4gIH1cblxuICBnZXQgaXNQb2xsaW5nKCkge1xuICAgIHJldHVybiAhIXRoaXMuX3BvbGxpbmdTdWJzY3JpcHRpb247XG4gIH1cblxuICBnZXQgYXV0b1JlZnJlc2hPbkNvbmZpZygpIHtcbiAgICBjb25zdCBiYXNlID0gdGhpcy5fcXVlcnlDb25maWcuYXV0b1JlZnJlc2hPbiA/PyB7fTtcblxuICAgIGNvbnN0IHRyYW5zZm9ybWVkOiBSZWFkb25seTxRdWVyeUF1dG9SZWZyZXNoQ29uZmlnPiA9IHtcbiAgICAgIHF1ZXJ5Q2xpZW50RGVmYXVsdEhlYWRlcnNDaGFuZ2U6IGJhc2UucXVlcnlDbGllbnREZWZhdWx0SGVhZGVyc0NoYW5nZSA/PyB0cnVlLFxuICAgICAgd2luZG93Rm9jdXM6IGJhc2Uud2luZG93Rm9jdXMgPz8gdHJ1ZSxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRyYW5zZm9ybWVkO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgZ2V0IF9lbmFibGVTbWFydFBvbGxpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3F1ZXJ5Q29uZmlnLmVuYWJsZVNtYXJ0UG9sbGluZyA/PyB0cnVlO1xuICB9XG5cbiAgZ2V0IHN0b3JlKCkge1xuICAgIHJldHVybiB0aGlzLl9xdWVyeUNvbmZpZy5lbnRpdHk/LnN0b3JlID8/IG51bGw7XG4gIH1cblxuICBnZXQgY2FuQmVDYWNoZWQoKSB7XG4gICAgcmV0dXJuIHNob3VsZENhY2hlUXVlcnkodGhpcy5fcXVlcnlDb25maWcubWV0aG9kKTtcbiAgfVxuXG4gIGdldCBfaXNJbk1vY2tNb2RlKCkge1xuICAgIHJldHVybiAhIXRoaXMuX2FyZ3VtZW50cz8ubW9jaztcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2NsaWVudDogUXVlcnlDbGllbnQsXG5cbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgcmVhZG9ubHkgX3F1ZXJ5Q29uZmlnOlxuICAgICAgfCBSZXN0UXVlcnlDb25maWc8Um91dGUsIFJlc3BvbnNlLCBBcmd1bWVudHMsIFN0b3JlLCBEYXRhLCBJZD5cbiAgICAgIHwgR3FsUXVlcnlDb25maWc8Um91dGUsIFJlc3BvbnNlLCBBcmd1bWVudHMsIFN0b3JlLCBEYXRhLCBJZD4sXG5cbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgcmVhZG9ubHkgX3JvdXRlV2l0aFBhcmFtczogUm91dGUsXG5cbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgcmVhZG9ubHkgX2FyZ3VtZW50czogQXJndW1lbnRzLFxuXG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIHJlYWRvbmx5IF9xdWVyeVN0b3JlS2V5OiBzdHJpbmcsXG4gICkge31cblxuICBleGVjdXRlKG9wdGlvbnM6IEV4ZWN1dGVRdWVyeU9wdGlvbnMgPSB7fSkge1xuICAgIGNvbnN0IHsgc2tpcENhY2hlID0gZmFsc2UsIF90cmlnZ2VyZWRWaWE6IHRyaWdnZXJlZFZpYSA9ICdwcm9ncmFtJywgY2FuY2VsUHJldmlvdXMgPSBmYWxzZSB9ID0gb3B0aW9ucztcbiAgICBjb25zdCB7IGF1dGhQcm92aWRlciB9ID0gdGhpcy5fY2xpZW50O1xuICAgIGNvbnN0IHF1ZXJ5Q29uZmlnID0gdGhpcy5fcXVlcnlDb25maWc7XG5cbiAgICBpZiAoIXRoaXMuaXNFeHBpcmVkICYmICFza2lwQ2FjaGUgJiYgaXNRdWVyeVN0YXRlU3VjY2Vzcyh0aGlzLnJhd1N0YXRlKSkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgaWYgKHF1ZXJ5Q29uZmlnLnNlY3VyZSAmJiAhYXV0aFByb3ZpZGVyICYmICF0aGlzLl9pc0luTW9ja01vZGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGV4ZWN1dGUgc2VjdXJlIHF1ZXJ5IHdpdGhvdXQgYXV0aCBwcm92aWRlcicpO1xuICAgIH1cblxuICAgIGNvbnN0IGlkID0gdGhpcy5fbmV4dElkO1xuICAgIGNvbnN0IG1ldGE6IFF1ZXJ5U3RhdGVNZXRhID0geyBpZCwgdHJpZ2dlcmVkVmlhIH07XG5cbiAgICBpZiAoaXNRdWVyeVN0YXRlTG9hZGluZyh0aGlzLnJhd1N0YXRlKSkge1xuICAgICAgaWYgKGNhbmNlbFByZXZpb3VzKSB7XG4gICAgICAgIHRoaXMuYWJvcnQoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuX3VwZGF0ZVN0YXRlKHsgdHlwZTogUXVlcnlTdGF0ZVR5cGUuTG9hZGluZywgbWV0YSB9KTtcblxuICAgIGlmICh0aGlzLl9pc0luTW9ja01vZGUpIHtcbiAgICAgIHRoaXMuX21vY2tSZXF1ZXN0KHt9LCBtZXRhLCBvcHRpb25zKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IGdvU2lnbmFsID0gb2YodHJ1ZSk7XG5cbiAgICAgIGlmIChcbiAgICAgICAgYXV0aFByb3ZpZGVyICYmXG4gICAgICAgIGlzQmVhcmVyQXV0aFByb3ZpZGVyKGF1dGhQcm92aWRlcikgJiZcbiAgICAgICAgcXVlcnlDb25maWcuc2VjdXJlICYmXG4gICAgICAgICFpc1F1ZXJ5U3RhdGVTdWNjZXNzKGF1dGhQcm92aWRlci5jdXJyZW50UmVmcmVzaFF1ZXJ5Py5yYXdTdGF0ZSlcbiAgICAgICkge1xuICAgICAgICAvLyBPbiBwYWdlIGxvYWQgdGhlIHF1ZXJ5IG1pZ2h0IGJlIGV4ZWN1dGVkIGJlZm9yZSB0aGUgYXV0aCBwcm92aWRlciBoYXMgYmVlbiBpbml0aWFsaXplZC5cbiAgICAgICAgLy8gSW4gdGhpcyBjYXNlIHdlIG5lZWQgdG8gd2FpdCBmb3IgdGhlIGF1dGggcHJvdmlkZXIgdG8gYmUgcmVhZHkgYmVmb3JlIHdlIGNhbiBleGVjdXRlIHRoZSBxdWVyeS5cbiAgICAgICAgZ29TaWduYWwgPSBjb21iaW5lTGF0ZXN0KFtcbiAgICAgICAgICAvLyBUaGUgdG9rZW5zIG1pZ2h0IGdldCBzZXQgd2l0aG91dCBhIHJlZnJlc2ggcXVlcnkgYmVpbmcgY3JlYXRlZCAoZS5nLikgZGlyZWN0bHkgYWZ0ZXIgbG9naW4uXG4gICAgICAgICAgYXV0aFByb3ZpZGVyLmN1cnJlbnRSZWZyZXNoUXVlcnkkLnBpcGUoc3dpdGNoUXVlcnlTdGF0ZSgpLCB0YWtlVW50aWxSZXNwb25zZSgpKSxcbiAgICAgICAgICBhdXRoUHJvdmlkZXIudG9rZW5zJC5waXBlKHRha2UoMSkpLFxuICAgICAgICBdKS5waXBlKFxuICAgICAgICAgIHRha2VVbnRpbCh0aGlzLl9vbkFib3J0JCksXG4gICAgICAgICAgZmlsdGVyKChbc3RhdGUsIHRva2Vuc10pID0+IHtcbiAgICAgICAgICAgIGlmIChzdGF0ZSkge1xuICAgICAgICAgICAgICByZXR1cm4gIWlzUXVlcnlTdGF0ZUxvYWRpbmcoc3RhdGUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gISF0b2tlbnM7XG4gICAgICAgICAgfSksXG4gICAgICAgICAgdGFwKChbc3RhdGVdKSA9PiB7XG4gICAgICAgICAgICBpZiAoaXNRdWVyeVN0YXRlRmFpbHVyZShzdGF0ZSkpIHtcbiAgICAgICAgICAgICAgdGhpcy5fdXBkYXRlRW50aXR5U3RhdGUoeyB0eXBlOiAnZmFpbHVyZScsIGVycm9yOiBzdGF0ZS5lcnJvciwgaGVhZGVyczoge30gfSwgbWV0YSwgb3B0aW9ucyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSksXG4gICAgICAgICAgbWFwKCgpID0+IHRydWUpLFxuICAgICAgICAgIHRha2UoMSksXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGdvU2lnbmFsXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIHN3aXRjaE1hcCgoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBtZXRob2QgPSBjb21wdXRlUXVlcnlNZXRob2QoeyBjb25maWc6IHF1ZXJ5Q29uZmlnLCBjbGllbnQ6IHRoaXMuX2NsaWVudCB9KTtcbiAgICAgICAgICAgIGNvbnN0IGJvZHkgPSBjb21wdXRlUXVlcnlCb2R5KHsgY29uZmlnOiBxdWVyeUNvbmZpZywgY2xpZW50OiB0aGlzLl9jbGllbnQsIGFyZ3M6IHRoaXMuX2FyZ3VtZW50cywgbWV0aG9kIH0pO1xuICAgICAgICAgICAgY29uc3QgaGVhZGVycyA9IGNvbXB1dGVRdWVyeUhlYWRlcnMoeyBjbGllbnQ6IHRoaXMuX2NsaWVudCwgY29uZmlnOiBxdWVyeUNvbmZpZywgYXJnczogdGhpcy5fYXJndW1lbnRzIH0pO1xuXG4gICAgICAgICAgICByZXR1cm4gcmVxdWVzdDxSZXNwb25zZT4oe1xuICAgICAgICAgICAgICB1cmxXaXRoUGFyYW1zOiB0aGlzLl9yb3V0ZVdpdGhQYXJhbXMgYXMgc3RyaW5nLFxuICAgICAgICAgICAgICBtZXRob2QsXG4gICAgICAgICAgICAgIGJvZHksXG4gICAgICAgICAgICAgIGhlYWRlcnMsXG4gICAgICAgICAgICAgIHJlcG9ydFByb2dyZXNzOiBxdWVyeUNvbmZpZy5yZXBvcnRQcm9ncmVzcyxcbiAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBxdWVyeUNvbmZpZy5yZXNwb25zZVR5cGUsXG4gICAgICAgICAgICAgIHdpdGhDcmVkZW50aWFsczogcXVlcnlDb25maWcud2l0aENyZWRlbnRpYWxzLFxuICAgICAgICAgICAgICBjYWNoZUFkYXB0ZXI6IHRoaXMuX2NsaWVudC5jb25maWcucmVxdWVzdD8uY2FjaGVBZGFwdGVyLFxuICAgICAgICAgICAgICByZXRyeUZuOiB0aGlzLl9jbGllbnQuY29uZmlnLnJlcXVlc3Q/LnJldHJ5Rm4sXG4gICAgICAgICAgICB9KS5waXBlKFxuICAgICAgICAgICAgICB0YXAoKHN0YXRlKSA9PiB0aGlzLl91cGRhdGVFbnRpdHlTdGF0ZShzdGF0ZSwgbWV0YSwgb3B0aW9ucykpLFxuICAgICAgICAgICAgICB0YWtlVW50aWwodGhpcy5fb25BYm9ydCQpLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9KSxcbiAgICAgICAgKVxuXG4gICAgICAgIC5zdWJzY3JpYmUoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGFib3J0KCkge1xuICAgIGlmICghaXNRdWVyeVN0YXRlTG9hZGluZyh0aGlzLnJhd1N0YXRlKSkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgdGhpcy5fb25BYm9ydCQubmV4dCgpO1xuXG4gICAgdGhpcy5fdXBkYXRlU3RhdGUoe1xuICAgICAgdHlwZTogUXVlcnlTdGF0ZVR5cGUuQ2FuY2VsbGVkLFxuICAgICAgbWV0YTogeyBpZDogdGhpcy5yYXdTdGF0ZS5tZXRhLmlkLCB0cmlnZ2VyZWRWaWE6IHRoaXMucmF3U3RhdGUubWV0YS50cmlnZ2VyZWRWaWEgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgcG9sbChjb25maWc6IFBvbGxDb25maWcpIHtcbiAgICBpZiAodGhpcy5fcG9sbGluZ1N1YnNjcmlwdGlvbikge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgdGhpcy5fY3VycmVudFBvbGxDb25maWcgPSBjb25maWc7XG5cbiAgICBjb25zdCBpbnRlcnZhbCQgPSBpbnRlcnZhbChjb25maWcuaW50ZXJ2YWwpO1xuICAgIGNvbnN0IHBvbGwkID0gaW50ZXJ2YWwkLnBpcGUoXG4gICAgICBza2lwKGNvbmZpZy50cmlnZ2VySW1tZWRpYXRlbHkgPyAwIDogMSksXG4gICAgICB0YWtlVW50aWwoY29uZmlnLnRha2VVbnRpbCksXG4gICAgICB0YWtlV2hpbGUoKCkgPT4gIXRoaXMuX2lzUG9sbGluZ1BhdXNlZCksXG4gICAgICBmaWx0ZXIoKCkgPT4gIWlzUXVlcnlTdGF0ZUxvYWRpbmcodGhpcy5fc3RhdGUkLnZhbHVlKSksXG4gICAgKTtcblxuICAgIHRoaXMuX3BvbGxpbmdTdWJzY3JpcHRpb24gPSBwb2xsJC5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKCkgPT4gdGhpcy5leGVjdXRlKHsgc2tpcENhY2hlOiB0cnVlLCBfdHJpZ2dlcmVkVmlhOiAncG9sbCcgfSksXG4gICAgICBjb21wbGV0ZTogKCkgPT4gdGhpcy5zdG9wUG9sbGluZygpLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzdG9wUG9sbGluZygpIHtcbiAgICB0aGlzLl9wb2xsaW5nU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuX3BvbGxpbmdTdWJzY3JpcHRpb24gPSBudWxsO1xuICAgIHRoaXMuX2N1cnJlbnRQb2xsQ29uZmlnID0gbnVsbDtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgcGF1c2VQb2xsaW5nKCkge1xuICAgIHRoaXMuX3BvbGxpbmdTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5fcG9sbGluZ1N1YnNjcmlwdGlvbiA9IG51bGw7XG5cbiAgICB0aGlzLl9pc1BvbGxpbmdQYXVzZWQgPSB0cnVlO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICByZXN1bWVQb2xsaW5nKCkge1xuICAgIGlmICghdGhpcy5faXNQb2xsaW5nUGF1c2VkIHx8ICF0aGlzLl9jdXJyZW50UG9sbENvbmZpZykge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgdGhpcy5faXNQb2xsaW5nUGF1c2VkID0gZmFsc2U7XG5cbiAgICByZXR1cm4gdGhpcy5wb2xsKHsgLi4udGhpcy5fY3VycmVudFBvbGxDb25maWcsIHRyaWdnZXJJbW1lZGlhdGVseTogdHJ1ZSB9KTtcbiAgfVxuXG4gIG9uU3VjY2VzcyhjYWxsYmFjazogKHJlc3BvbnNlOiBEYXRhKSA9PiB2b2lkKSB7XG4gICAgdGhpcy5zdGF0ZSQucGlwZSh0YWtlVW50aWxSZXNwb25zZSgpLCBmaWx0ZXJTdWNjZXNzKCkpLnN1YnNjcmliZSgoc3RhdGUpID0+IGNhbGxiYWNrKHN0YXRlLnJlc3BvbnNlKSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBvbkZhaWx1cmUoY2FsbGJhY2s6IChlcnJvcjogUmVxdWVzdEVycm9yPHVua25vd24+KSA9PiB2b2lkKSB7XG4gICAgdGhpcy5zdGF0ZSQucGlwZSh0YWtlVW50aWxSZXNwb25zZSgpLCBmaWx0ZXJGYWlsdXJlKCkpLnN1YnNjcmliZSgoc3RhdGUpID0+IGNhbGxiYWNrKHN0YXRlLmVycm9yKSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBwcml2YXRlIF9nZXRCZWFyZXJBdXRoUHJvdmlkZXIoKSB7XG4gICAgY29uc3QgYXV0aFByb3ZpZGVyID0gdGhpcy5fY2xpZW50LmF1dGhQcm92aWRlcjtcblxuICAgIGlmIChhdXRoUHJvdmlkZXIgJiYgaXNCZWFyZXJBdXRoUHJvdmlkZXIoYXV0aFByb3ZpZGVyKSkge1xuICAgICAgcmV0dXJuIGF1dGhQcm92aWRlcjtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgX3VwZGF0ZUVudGl0eVN0YXRlKFxuICAgIHJlcXVlc3RFdmVudDogUmVxdWVzdEV2ZW50PFJlc3BvbnNlPixcbiAgICBtZXRhOiBRdWVyeVN0YXRlTWV0YSxcbiAgICBvcHRpb25zPzogRXhlY3V0ZVF1ZXJ5T3B0aW9ucyxcbiAgKSB7XG4gICAgc3dpdGNoIChyZXF1ZXN0RXZlbnQudHlwZSkge1xuICAgICAgY2FzZSAnc3RhcnQnOlxuICAgICAgY2FzZSAnZGVsYXktcmV0cnknOiB7XG4gICAgICAgIGNvbnN0IHsgdHlwZSwgcmV0cnlEZWxheSwgcmV0cnlOdW1iZXIgfSA9IHJlcXVlc3RFdmVudDtcbiAgICAgICAgY29uc3QgbmV3TWV0YTogUXVlcnlTdGF0ZU1ldGEgPSB7IC4uLm1ldGEsIGlzV2FpdGluZ0ZvclJldHJ5OiB0eXBlID09PSAnZGVsYXktcmV0cnknLCByZXRyeURlbGF5LCByZXRyeU51bWJlciB9O1xuXG4gICAgICAgIHRoaXMuX3VwZGF0ZVN0YXRlKHtcbiAgICAgICAgICB0eXBlOiBRdWVyeVN0YXRlVHlwZS5Mb2FkaW5nLFxuICAgICAgICAgIG1ldGE6IG5ld01ldGEsXG4gICAgICAgIH0pO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgY2FzZSAndXBsb2FkLXByb2dyZXNzJzpcbiAgICAgIGNhc2UgJ2Rvd25sb2FkLXByb2dyZXNzJzoge1xuICAgICAgICB0aGlzLl91cGRhdGVTdGF0ZSh7XG4gICAgICAgICAgdHlwZTogUXVlcnlTdGF0ZVR5cGUuTG9hZGluZyxcbiAgICAgICAgICBwcm9ncmVzczogcmVxdWVzdEV2ZW50LnByb2dyZXNzLFxuICAgICAgICAgIHBhcnRpYWxUZXh0OiAncGFydGlhbFRleHQnIGluIHJlcXVlc3RFdmVudCA/IHJlcXVlc3RFdmVudC5wYXJ0aWFsVGV4dCA6IHVuZGVmaW5lZCxcbiAgICAgICAgICBtZXRhLFxuICAgICAgICB9KTtcblxuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgY2FzZSAnc3VjY2Vzcyc6IHtcbiAgICAgICAgY29uc3QgeyByZXNwb25zZSwgZXhwaXJlc0luVGltZXN0YW1wIH0gPSByZXF1ZXN0RXZlbnQ7XG4gICAgICAgIGNvbnN0IGlzR3FsID0gaXNHcWxRdWVyeUNvbmZpZyh0aGlzLl9xdWVyeUNvbmZpZyk7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlRGF0YSA9XG4gICAgICAgICAgaXNHcWwgJiYgdHlwZW9mIHJlc3BvbnNlID09PSAnb2JqZWN0JyAmJiAhIXJlc3BvbnNlICYmICdkYXRhJyBpbiByZXNwb25zZVxuICAgICAgICAgICAgPyAocmVzcG9uc2VbJ2RhdGEnXSBhcyBSZXNwb25zZSlcbiAgICAgICAgICAgIDogKHJlc3BvbnNlIGFzIFJlc3BvbnNlKTtcblxuICAgICAgICBpZiAodGhpcy5fcXVlcnlDb25maWcuZW50aXR5ICYmIHRoaXMuX3F1ZXJ5Q29uZmlnLmVudGl0eS5zZXQpIHtcbiAgICAgICAgICBjb25zdCBpZCA9IHRoaXMuX3F1ZXJ5Q29uZmlnLmVudGl0eT8uaWQoeyBhcmdzOiB0aGlzLl9hcmd1bWVudHMsIHJlc3BvbnNlOiByZXNwb25zZURhdGEgfSk7XG5cbiAgICAgICAgICB0aGlzLl9xdWVyeUNvbmZpZy5lbnRpdHk/LnNldCh7XG4gICAgICAgICAgICBhcmdzOiB0aGlzLl9hcmd1bWVudHMsXG4gICAgICAgICAgICByZXNwb25zZTogcmVzcG9uc2VEYXRhLFxuICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICBzdG9yZTogdGhpcy5fcXVlcnlDb25maWcuZW50aXR5LnN0b3JlLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fdXBkYXRlU3RhdGUoe1xuICAgICAgICAgIHR5cGU6IFF1ZXJ5U3RhdGVUeXBlLlN1Y2Nlc3MsXG4gICAgICAgICAgcmVzcG9uc2U6IHJlc3BvbnNlRGF0YSxcbiAgICAgICAgICBtZXRhOiB7IC4uLm1ldGEsIGV4cGlyZXNBdDogZXhwaXJlc0luVGltZXN0YW1wIH0sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBjYXNlICdmYWlsdXJlJzoge1xuICAgICAgICBjb25zdCB7IGVycm9yIH0gPSByZXF1ZXN0RXZlbnQ7XG4gICAgICAgIGNvbnN0IGZhaWx1cmUgPSAoKSA9PiB0aGlzLl91cGRhdGVTdGF0ZSh7IHR5cGU6IFF1ZXJ5U3RhdGVUeXBlLkZhaWx1cmUsIGVycm9yLCBtZXRhIH0pO1xuICAgICAgICBjb25zdCBiZWFyZXJBdXRoUHJvdmlkZXIgPSB0aGlzLl9nZXRCZWFyZXJBdXRoUHJvdmlkZXIoKTtcblxuICAgICAgICBpZiAoXG4gICAgICAgICAgIWJlYXJlckF1dGhQcm92aWRlciB8fFxuICAgICAgICAgIG9wdGlvbnM/Ll9pc1VuYXV0aG9yaXplZFJldHJ5IHx8XG4gICAgICAgICAgZXJyb3Iuc3RhdHVzICE9PSBIdHRwU3RhdHVzQ29kZS5VbmF1dGhvcml6ZWQgfHxcbiAgICAgICAgICAhYmVhcmVyQXV0aFByb3ZpZGVyLnNob3VsZFJlZnJlc2hPblVuYXV0aG9yaXplZFJlc3BvbnNlXG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybiBmYWlsdXJlKCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBxdWVyeSA9IGJlYXJlckF1dGhQcm92aWRlci5fcmVmcmVzaFF1ZXJ5KCk7XG4gICAgICAgIGlmICghcXVlcnkpIHJldHVybiBmYWlsdXJlKCk7XG5cbiAgICAgICAgcXVlcnkuc3RhdGUkXG4gICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICB0YWtlVW50aWxSZXNwb25zZSgpLFxuICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMuX29uQWJvcnQkKSxcbiAgICAgICAgICAgIHRhcCgoc3RhdGUpID0+XG4gICAgICAgICAgICAgIGlzUXVlcnlTdGF0ZVN1Y2Nlc3Moc3RhdGUpID8gdGhpcy5leGVjdXRlKHsgLi4ub3B0aW9ucywgX2lzVW5hdXRob3JpemVkUmV0cnk6IHRydWUgfSkgOiBmYWlsdXJlKCksXG4gICAgICAgICAgICApLFxuICAgICAgICAgIClcbiAgICAgICAgICAuc3Vic2NyaWJlKCk7XG5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGNhc2UgJ2NhbmNlbCc6IHtcbiAgICAgICAgdGhpcy5fdXBkYXRlU3RhdGUoe1xuICAgICAgICAgIHR5cGU6IFF1ZXJ5U3RhdGVUeXBlLkNhbmNlbGxlZCxcbiAgICAgICAgICBtZXRhLFxuICAgICAgICB9KTtcblxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF90cmFuc2Zvcm1TdGF0ZShzOiBRdWVyeVN0YXRlPFJlc3BvbnNlPik6IE9ic2VydmFibGU8UXVlcnlTdGF0ZTxEYXRhPj4ge1xuICAgIGlmICghaXNRdWVyeVN0YXRlU3VjY2VzcyhzKSB8fCAhdGhpcy5fcXVlcnlDb25maWcuZW50aXR5Py5nZXQpIHtcbiAgICAgIHJldHVybiBvZihzKSBhcyBPYnNlcnZhYmxlPFF1ZXJ5U3RhdGU8RGF0YT4+O1xuICAgIH1cblxuICAgIGNvbnN0IGlkID0gdGhpcy5fcXVlcnlDb25maWcuZW50aXR5LmlkKHsgYXJnczogdGhpcy5fYXJndW1lbnRzLCByZXNwb25zZTogcy5yZXNwb25zZSB9KTtcblxuICAgIHJldHVybiB0aGlzLl9xdWVyeUNvbmZpZy5lbnRpdHlcbiAgICAgIC5nZXQoeyBhcmdzOiB0aGlzLl9hcmd1bWVudHMsIGlkLCByZXNwb25zZTogcy5yZXNwb25zZSwgc3RvcmU6IHRoaXMuX3F1ZXJ5Q29uZmlnLmVudGl0eS5zdG9yZSB9KVxuICAgICAgLnBpcGUobWFwKCh2KSA9PiAoeyAuLi5zLCByZXNwb25zZTogdiB9KSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBfdXBkYXRlU3RhdGUoczogUXVlcnlTdGF0ZTxSZXNwb25zZT4pIHtcbiAgICAvLyBXZSBuZWVkIHRvIHVzZSB1bnRyYWNrZWQgaGVyZSB0byBhdm9pZCBBbmd1bGFyJ3MgXCJhbGxvd1NpZ25hbFdyaXRlcyBpcyBmYWxzZVwiIGVycm9yIHdoZW4gZXhlY3V0aW5nIHF1ZXJpZXMgaW5zaWRlIEFuZ3VsYXIncyBjb21wdXRlZC9lZmZlY3Qgc2lnbmFsIGZ1bmN0aW9ucy5cbiAgICB1bnRyYWNrZWQoKCkgPT4gdGhpcy5fc3RhdGUkLm5leHQocykpO1xuICB9XG5cbiAgcHJpdmF0ZSBfbW9ja1JlcXVlc3QoaGVhZGVyczogUmVxdWVzdEhlYWRlcnMgfCB1bmRlZmluZWQsIG1ldGE6IFF1ZXJ5U3RhdGVNZXRhLCBvcHRpb25zOiBFeGVjdXRlUXVlcnlPcHRpb25zKSB7XG4gICAgaWYgKCF0aGlzLl9hcmd1bWVudHM/Lm1vY2spIHJldHVybjtcblxuICAgIGNvbnN0IHsgZGVsYXkgPSAyMDAsIGVycm9yLCByZXNwb25zZSwgcmV0cnlJbnRvUmVzcG9uc2UgPSBmYWxzZSwgcHJvZ3Jlc3MgfSA9IHRoaXMuX2FyZ3VtZW50cy5tb2NrO1xuICAgIGNvbnN0IHByb2dyZXNzRmlsZVNpemUgPSBwcm9ncmVzcz8uZmlsZVNpemUgPz8gMTAwMDAwMDtcbiAgICBjb25zdCBwcm9ncmVzc0V2ZW50VHlwZSA9IHByb2dyZXNzPy5ldmVudFR5cGUgPz8gJ3VwbG9hZCc7XG4gICAgY29uc3QgcHJvZ3Jlc3NFdmVudENvdW50ID0gcHJvZ3Jlc3M/LmV2ZW50Q291bnQgPz8gNTtcbiAgICBjb25zdCBwcm9ncmVzc09taXRUb3RhbCA9IHByb2dyZXNzPy5vbWl0VG90YWwgPz8gZmFsc2U7XG4gICAgY29uc3Qgb21pdFBhcnRpYWxUZXh0ID0gcHJvZ3Jlc3M/Lm9taXRQYXJ0aWFsVGV4dCA/PyBmYWxzZTtcblxuICAgIGNvbnN0IGZpbmFsUmVzb2x2ZU1vY2sgPSAoKSA9PiB7XG4gICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgdGhpcy5fdXBkYXRlRW50aXR5U3RhdGUoeyBlcnJvciwgaGVhZGVyczogaGVhZGVycyA/PyB7fSwgdHlwZTogJ2ZhaWx1cmUnIH0sIG1ldGEsIG9wdGlvbnMpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX3VwZGF0ZUVudGl0eVN0YXRlKFxuICAgICAgICB7IHJlc3BvbnNlOiByZXNwb25zZSBhcyBSZXNwb25zZSwgaGVhZGVyczogaGVhZGVycyA/PyB7fSwgdHlwZTogJ3N1Y2Nlc3MnIH0sXG4gICAgICAgIG1ldGEsXG4gICAgICAgIG9wdGlvbnMsXG4gICAgICApO1xuICAgIH07XG5cbiAgICBpZiAocHJvZ3Jlc3MpIHtcbiAgICAgIGludGVydmFsKGRlbGF5KVxuICAgICAgICAucGlwZShcbiAgICAgICAgICB0YXAoKGEpID0+IHtcbiAgICAgICAgICAgIGlmIChhID09PSBwcm9ncmVzc0V2ZW50Q291bnQgKyAxKSB7XG4gICAgICAgICAgICAgIGZpbmFsUmVzb2x2ZU1vY2soKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnQgPSBNYXRoLm1pbihwcm9ncmVzc0ZpbGVTaXplICogYSwgcHJvZ3Jlc3NGaWxlU2l6ZSAqIHByb2dyZXNzRXZlbnRDb3VudCk7XG4gICAgICAgICAgICAgIGNvbnN0IHBlcmNlbnRhZ2UgPSAoY3VycmVudCAvIChwcm9ncmVzc0ZpbGVTaXplICogcHJvZ3Jlc3NFdmVudENvdW50KSkgKiAxMDA7XG5cbiAgICAgICAgICAgICAgdGhpcy5fdXBkYXRlRW50aXR5U3RhdGUoXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgdHlwZTogcHJvZ3Jlc3NFdmVudFR5cGUgPT09ICd1cGxvYWQnID8gJ3VwbG9hZC1wcm9ncmVzcycgOiAnZG93bmxvYWQtcHJvZ3Jlc3MnLFxuICAgICAgICAgICAgICAgICAgaGVhZGVyczogaGVhZGVycyA/PyB7fSxcbiAgICAgICAgICAgICAgICAgIHByb2dyZXNzOiB7IGN1cnJlbnQsIC4uLihwcm9ncmVzc09taXRUb3RhbCA/IHt9IDogeyBwZXJjZW50YWdlLCB0b3RhbDogcHJvZ3Jlc3NGaWxlU2l6ZSB9KSB9LFxuICAgICAgICAgICAgICAgICAgcGFydGlhbFRleHQ6IG9taXRQYXJ0aWFsVGV4dCA/IHVuZGVmaW5lZCA6IGBQYXJ0aWFsIHRleHQgJHthfWAsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBtZXRhLFxuICAgICAgICAgICAgICAgIG9wdGlvbnMsXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSksXG4gICAgICAgICAgdGFrZVVudGlsKHRoaXMuX29uQWJvcnQkKSxcbiAgICAgICAgICB0YWtlV2hpbGUoKGEpID0+IGEgPCBwcm9ncmVzc0V2ZW50Q291bnQgKyAxLCB0cnVlKSxcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKCk7XG4gICAgfSBlbHNlIGlmIChyZXRyeUludG9SZXNwb25zZSkge1xuICAgICAgaW50ZXJ2YWwoZGVsYXkpXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIHRhcCgoYSkgPT4ge1xuICAgICAgICAgICAgaWYgKGEgPT09IDMpIHtcbiAgICAgICAgICAgICAgZmluYWxSZXNvbHZlTW9jaygpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgY29uc3QgYU1vZGlmaWVkID0gYSArIDE7XG4gICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZUVudGl0eVN0YXRlKFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIHR5cGU6ICdkZWxheS1yZXRyeScsXG4gICAgICAgICAgICAgICAgICBoZWFkZXJzOiBoZWFkZXJzID8/IHt9LFxuICAgICAgICAgICAgICAgICAgcmV0cnlEZWxheTogMTAwMCArIDEwMDAgKiBhTW9kaWZpZWQsXG4gICAgICAgICAgICAgICAgICByZXRyeU51bWJlcjogYU1vZGlmaWVkLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgbWV0YSxcbiAgICAgICAgICAgICAgICBvcHRpb25zLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pLFxuICAgICAgICAgIHRha2VVbnRpbCh0aGlzLl9vbkFib3J0JCksXG4gICAgICAgICAgdGFrZVdoaWxlKChhKSA9PiBhIDwgMywgdHJ1ZSksXG4gICAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aW1lcihkZWxheSlcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgdGFwKCgpID0+IGZpbmFsUmVzb2x2ZU1vY2soKSksXG4gICAgICAgICAgdGFrZVVudGlsKHRoaXMuX29uQWJvcnQkKSxcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgX2FkZERlcGVuZGVudCh0Tm9kZUluZGV4OiBudW1iZXIpIHtcbiAgICBpZiAoIXRoaXMuX2RlcGVuZGVudHNbdE5vZGVJbmRleF0pIHtcbiAgICAgIHRoaXMuX2RlcGVuZGVudHNbdE5vZGVJbmRleF0gPSAwO1xuICAgIH1cblxuICAgIHRoaXMuX2RlcGVuZGVudHNbdE5vZGVJbmRleF0rKztcblxuICAgIHRoaXMuX2RlcGVuZGVudHNDaGFuZ2VkJC5uZXh0KHRoaXMuX2RlcGVuZGVudHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgX3JlbW92ZURlcGVuZGVudCh0Tm9kZUluZGV4OiBudW1iZXIpIHtcbiAgICBjb25zdCBjb3VudCA9IHRoaXMuX2RlcGVuZGVudHNbdE5vZGVJbmRleF07XG4gICAgaWYgKGNvdW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fZGVwZW5kZW50c1t0Tm9kZUluZGV4XSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLl9kZXBlbmRlbnRzW3ROb2RlSW5kZXhdLS07XG4gICAgfVxuXG4gICAgaWYgKGNvdW50IDw9IDEpIHtcbiAgICAgIGRlbGV0ZSB0aGlzLl9kZXBlbmRlbnRzW3ROb2RlSW5kZXhdO1xuICAgIH1cblxuICAgIHRoaXMuX2RlcGVuZGVudHNDaGFuZ2VkJC5uZXh0KHRoaXMuX2RlcGVuZGVudHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgX2hhc0RlcGVuZGVudHMoKSB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMuX2RlcGVuZGVudHMpLmxlbmd0aCA+IDA7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,2 @@
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==