@atlasauth/angular 0.1.2 → 0.2.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.
package/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # @atlas/angular
1
+ # @atlasauth/angular
2
2
 
3
3
  The official **Angular** SDK for Atlas — the Angular peer of [`@atlasauth/react`](../react). It wraps the framework-agnostic [`@atlasauth/js`](../js) client and exposes Atlas's reactive auth state, sign-in/up flows, prebuilt UI, authorization directives, and route guards as idiomatic modern Angular (standalone APIs, RxJS **and** Signals, DI).
4
4
 
@@ -9,7 +9,7 @@ Requires **Angular 17+**.
9
9
  ## Install
10
10
 
11
11
  ```bash
12
- pnpm add @atlas/angular
12
+ pnpm add @atlasauth/angular
13
13
  # peers: @angular/core, @angular/common (>=17), rxjs (>=7); @angular/router if you use the guards
14
14
  ```
15
15
 
@@ -22,7 +22,7 @@ pnpm add @atlas/angular
22
22
  ```ts
23
23
  import { bootstrapApplication } from '@angular/platform-browser';
24
24
  import { provideRouter } from '@angular/router';
25
- import { provideAtlas } from '@atlas/angular';
25
+ import { provideAtlas } from '@atlasauth/angular';
26
26
  import { AppComponent } from './app/app.component';
27
27
  import { routes } from './app/routes';
28
28
 
@@ -44,7 +44,7 @@ The service begins booting immediately — completing any OAuth/hosted-page redi
44
44
  ### NgModule
45
45
 
46
46
  ```ts
47
- import { AtlasModule } from '@atlas/angular';
47
+ import { AtlasModule } from '@atlasauth/angular';
48
48
 
49
49
  @NgModule({
50
50
  imports: [AtlasModule.forRoot({ publishableKey: 'pk_test_…' })],
@@ -55,7 +55,7 @@ export class AppModule {}
55
55
  Feature modules `import { AtlasModule }` (no `forRoot`) to use the directives and components. Standalone components import them individually, or spread `ATLAS_UI`:
56
56
 
57
57
  ```ts
58
- import { ATLAS_UI } from '@atlas/angular';
58
+ import { ATLAS_UI } from '@atlasauth/angular';
59
59
 
60
60
  @Component({ standalone: true, imports: [...ATLAS_UI], template: '…' })
61
61
  export class DashboardComponent {}
@@ -162,7 +162,7 @@ Server-driven, rendered in the host DOM (no iframe), themed via the `appearance`
162
162
 
163
163
  ```ts
164
164
  import { Routes } from '@angular/router';
165
- import { atlasGuard } from '@atlas/angular';
165
+ import { atlasGuard } from '@atlasauth/angular';
166
166
 
167
167
  export const routes: Routes = [
168
168
  {
@@ -190,6 +190,6 @@ Like the components, guards are UX, not security — the server enforces the sam
190
190
 
191
191
  ## Build & test
192
192
 
193
- - **Build**: `pnpm --filter @atlas/angular build` (ng-packagr → `dist/`, an Angular Package Format bundle with FESM2022 + type definitions).
194
- - **Typecheck**: `pnpm --filter @atlas/angular typecheck`.
193
+ - **Build**: `pnpm --filter @atlasauth/angular build` (ng-packagr → `dist/`, an Angular Package Format bundle with FESM2022 + type definitions).
194
+ - **Typecheck**: `pnpm --filter @atlasauth/angular typecheck`.
195
195
  - **Test**: unit specs run under the Angular CLI test runner (Karma/Jasmine or your configured runner). A starter spec lives in `src/lib/atlas.service.spec.ts`.
package/dist/README.md CHANGED
@@ -1,6 +1,6 @@
1
- # @atlas/angular
1
+ # @atlasauth/angular
2
2
 
3
- The official **Angular** SDK for Atlas — the Angular peer of [`@atlas/react`](../react). It wraps the framework-agnostic [`@atlas/js`](../js) client and exposes Atlas's reactive auth state, sign-in/up flows, prebuilt UI, authorization directives, and route guards as idiomatic modern Angular (standalone APIs, RxJS **and** Signals, DI).
3
+ The official **Angular** SDK for Atlas — the Angular peer of [`@atlasauth/react`](../react). It wraps the framework-agnostic [`@atlasauth/js`](../js) client and exposes Atlas's reactive auth state, sign-in/up flows, prebuilt UI, authorization directives, and route guards as idiomatic modern Angular (standalone APIs, RxJS **and** Signals, DI).
4
4
 
5
5
  Requires **Angular 17+**.
6
6
 
@@ -9,7 +9,7 @@ Requires **Angular 17+**.
9
9
  ## Install
10
10
 
11
11
  ```bash
12
- pnpm add @atlas/angular
12
+ pnpm add @atlasauth/angular
13
13
  # peers: @angular/core, @angular/common (>=17), rxjs (>=7); @angular/router if you use the guards
14
14
  ```
15
15
 
@@ -22,7 +22,7 @@ pnpm add @atlas/angular
22
22
  ```ts
23
23
  import { bootstrapApplication } from '@angular/platform-browser';
24
24
  import { provideRouter } from '@angular/router';
25
- import { provideAtlas } from '@atlas/angular';
25
+ import { provideAtlas } from '@atlasauth/angular';
26
26
  import { AppComponent } from './app/app.component';
27
27
  import { routes } from './app/routes';
28
28
 
@@ -44,7 +44,7 @@ The service begins booting immediately — completing any OAuth/hosted-page redi
44
44
  ### NgModule
45
45
 
46
46
  ```ts
47
- import { AtlasModule } from '@atlas/angular';
47
+ import { AtlasModule } from '@atlasauth/angular';
48
48
 
49
49
  @NgModule({
50
50
  imports: [AtlasModule.forRoot({ publishableKey: 'pk_test_…' })],
@@ -55,7 +55,7 @@ export class AppModule {}
55
55
  Feature modules `import { AtlasModule }` (no `forRoot`) to use the directives and components. Standalone components import them individually, or spread `ATLAS_UI`:
56
56
 
57
57
  ```ts
58
- import { ATLAS_UI } from '@atlas/angular';
58
+ import { ATLAS_UI } from '@atlasauth/angular';
59
59
 
60
60
  @Component({ standalone: true, imports: [...ATLAS_UI], template: '…' })
61
61
  export class DashboardComponent {}
@@ -152,7 +152,7 @@ Server-driven, rendered in the host DOM (no iframe), themed via the `appearance`
152
152
  | `<atlas-user-profile>` | `<UserProfile/>` |
153
153
  | `<atlas-organization-profile>` | `<OrganizationProfile/>` |
154
154
 
155
- `<atlas-sign-in>` / `<atlas-sign-up>` run the full multi-step flow (identifier → first factor → 2FA / enrollment → email code → completion, plus magic-link polling), driven entirely by the server-side attempt status through the shared `@atlas/js` engine.
155
+ `<atlas-sign-in>` / `<atlas-sign-up>` run the full multi-step flow (identifier → first factor → 2FA / enrollment → email code → completion, plus magic-link polling), driven entirely by the server-side attempt status through the shared `@atlasauth/js` engine.
156
156
 
157
157
  ---
158
158
 
@@ -162,7 +162,7 @@ Server-driven, rendered in the host DOM (no iframe), themed via the `appearance`
162
162
 
163
163
  ```ts
164
164
  import { Routes } from '@angular/router';
165
- import { atlasGuard } from '@atlas/angular';
165
+ import { atlasGuard } from '@atlasauth/angular';
166
166
 
167
167
  export const routes: Routes = [
168
168
  {
@@ -186,10 +186,10 @@ Like the components, guards are UX, not security — the server enforces the sam
186
186
 
187
187
  ## Theming & i18n
188
188
 
189
- `appearance` accepts design tokens + per-element class overrides and a `baseTheme` (`default`, `dark`, `neobrutalist`); overrides are **appended** to the base classes so your Tailwind/CSS just works. `localization` merges a catalog over `en-US`. Both are identical in shape to `@atlas/react` — see `appearance.ts` and `i18n.ts`, which are shared verbatim.
189
+ `appearance` accepts design tokens + per-element class overrides and a `baseTheme` (`default`, `dark`, `neobrutalist`); overrides are **appended** to the base classes so your Tailwind/CSS just works. `localization` merges a catalog over `en-US`. Both are identical in shape to `@atlasauth/react` — see `appearance.ts` and `i18n.ts`, which are shared verbatim.
190
190
 
191
191
  ## Build & test
192
192
 
193
- - **Build**: `pnpm --filter @atlas/angular build` (ng-packagr → `dist/`, an Angular Package Format bundle with FESM2022 + type definitions).
194
- - **Typecheck**: `pnpm --filter @atlas/angular typecheck`.
193
+ - **Build**: `pnpm --filter @atlasauth/angular build` (ng-packagr → `dist/`, an Angular Package Format bundle with FESM2022 + type definitions).
194
+ - **Typecheck**: `pnpm --filter @atlasauth/angular typecheck`.
195
195
  - **Test**: unit specs run under the Angular CLI test runner (Karma/Jasmine or your configured runner). A starter spec lives in `src/lib/atlas.service.spec.ts`.
@@ -17,6 +17,8 @@
17
17
  * replacement is a support burden where every override starts by rebuilding the
18
18
  * component's base styles from scratch.
19
19
  */
20
+ import { renderDesignAppearance, } from '@atlasauth/design/runtime';
21
+ export { instanceDesignFrom } from '@atlasauth/design/runtime';
20
22
  export const DEFAULT_TOKENS = {
21
23
  colorPrimary: '#5b5bd6',
22
24
  colorText: '#1c1c1f',
@@ -89,4 +91,37 @@ export function classFor(element, appearance, base) {
89
91
  const override = appearance?.elements?.[element];
90
92
  return override ? `${base} ${override}` : base;
91
93
  }
92
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwZWFyYW5jZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvYXBwZWFyYW5jZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0JHO0FBd0NILE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBMkI7SUFDcEQsWUFBWSxFQUFFLFNBQVM7SUFDdkIsU0FBUyxFQUFFLFNBQVM7SUFDcEIsZUFBZSxFQUFFLFNBQVM7SUFDMUIsV0FBVyxFQUFFLFNBQVM7SUFDdEIsV0FBVyxFQUFFLFNBQVM7SUFDdEIsWUFBWSxFQUFFLEtBQUs7SUFDbkIsVUFBVSxFQUFFLGlFQUFpRTtJQUM3RSxXQUFXLEVBQUUsS0FBSztDQUNuQixDQUFDO0FBRUY7Ozs7O0dBS0c7QUFDSCxNQUFNLENBQUMsTUFBTSxNQUFNLEdBQUc7SUFDcEIsT0FBTyxFQUFFLGNBQWM7SUFDdkIsSUFBSSxFQUFFO1FBQ0osR0FBRyxjQUFjO1FBQ2pCLFNBQVMsRUFBRSxTQUFTO1FBQ3BCLGVBQWUsRUFBRSxTQUFTO1FBQzFCLFdBQVcsRUFBRSxTQUFTO1FBQ3RCLFlBQVksRUFBRSxTQUFTO0tBQ3hCO0lBQ0QsWUFBWSxFQUFFO1FBQ1osR0FBRyxjQUFjO1FBQ2pCLFlBQVksRUFBRSxTQUFTO1FBQ3ZCLFNBQVMsRUFBRSxTQUFTO1FBQ3BCLGVBQWUsRUFBRSxTQUFTO1FBQzFCLFdBQVcsRUFBRSxTQUFTO1FBQ3RCLFlBQVksRUFBRSxLQUFLO1FBQ25CLFVBQVUsRUFBRSx3Q0FBd0M7S0FDckQ7Q0FDd0QsQ0FBQztBQUU1RDs7Ozs7O0dBTUc7QUFDSCxNQUFNLFVBQVUsYUFBYSxDQUFDLFVBQXVCO0lBQ25ELE1BQU0sSUFBSSxHQUFHLFVBQVUsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQztJQUNuRixNQUFNLFNBQVMsR0FBRyxVQUFVLEVBQUUsU0FBUyxJQUFJLEVBQUUsQ0FBQztJQUU5QyxNQUFNLFFBQVEsR0FBRyxFQUFFLEdBQUcsY0FBYyxFQUFFLEdBQUcsSUFBSSxFQUFFLENBQUM7SUFDaEQsS0FBSyxNQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztRQUNyRCxJQUFJLEtBQUssS0FBSyxTQUFTO1lBQUUsUUFBUSxDQUFDLEdBQXlCLENBQUMsR0FBRyxLQUFLLENBQUM7SUFDdkUsQ0FBQztJQUNELE9BQU8sUUFBUSxDQUFDO0FBQ2xCLENBQUM7QUFFRCxvRUFBb0U7QUFDcEUsTUFBTSxVQUFVLFlBQVksQ0FBQyxNQUE4QjtJQUN6RCxNQUFNLElBQUksR0FBMkIsRUFBRSxDQUFDO0lBQ3hDLEtBQUssTUFBTSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFDbEQsMEVBQTBFO1FBQzFFLElBQUksQ0FBQyxXQUFXLEdBQUcsQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQztJQUNqRixDQUFDO0lBQ0QsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsTUFBTSxVQUFVLFFBQVEsQ0FDdEIsT0FBbUIsRUFDbkIsVUFBa0MsRUFDbEMsSUFBWTtJQUVaLE1BQU0sUUFBUSxHQUFHLFVBQVUsRUFBRSxRQUFRLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNqRCxPQUFPLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLElBQUksUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztBQUNqRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiDCpzEwLjMgdGhlbWluZy5cbiAqXG4gKiBcImFwcGVhcmFuY2UgcHJvcDogZGVzaWduIHRva2VucyAoY29sb3JzLCByYWRpdXMsIGZvbnQsIHNwYWNpbmcpICsgcGVyLWVsZW1lbnRcbiAqIGNsYXNzIG92ZXJyaWRlcyAoZWxlbWVudHM6IHsgZm9ybUJ1dHRvblByaW1hcnk6IFwi4oCmXCIgfSkuIE5vIGlmcmFtZSDigJQgY29tcG9uZW50c1xuICogcmVuZGVyIGluIHRoZSBob3N0IERPTSBzbyBUYWlsd2luZC9DU1MganVzdCB3b3Jrcy5cIlxuICpcbiAqIFJlbmRlcmluZyBpbiB0aGUgaG9zdCBET00gaXMgdGhlIGRlY2lzaW9uIGV2ZXJ5dGhpbmcgZWxzZSBmb2xsb3dzIGZyb20uIEFuXG4gKiBpZnJhbWUgd291bGQgaXNvbGF0ZSBzdHlsZXMgcGVyZmVjdGx5IGFuZCBiZSB1bnVzYWJsZTogaXQgY2Fubm90IGJlIHNpemVkIHRvXG4gKiBpdHMgY29udGVudCByZWxpYWJseSwgaXQgYnJlYWtzIHBhc3N3b3JkIG1hbmFnZXJzLCBpdCBicmVha3MgYXV0b2ZpbGwsIGFuZCBhXG4gKiBUYWlsd2luZCBjbGFzcyB0aGUgY3VzdG9tZXIgd3JpdGVzIGhhcyBubyBlZmZlY3QgaW5zaWRlIGl0LiBTaGFyaW5nIHRoZSBET01cbiAqIG1lYW5zIHRoZSBjdXN0b21lcidzIENTUyByZWFjaGVzIG91ciBtYXJrdXAsIHdoaWNoIGlzIGV4YWN0bHkgd2hhdCB0aGV5IHdhbnRcbiAqIGFuZCB3aGF0IG1ha2VzIGFuIG92ZXJyaWRlIHN5c3RlbSBuZWNlc3NhcnkgcmF0aGVyIHRoYW4gZGVjb3JhdGl2ZS5cbiAqXG4gKiBFbGVtZW50IGNsYXNzZXMgYXJlIEFQUEVOREVEIHRvIG91cnMsIG5ldmVyIHJlcGxhY2luZyB0aGVtLiBBIGN1c3RvbWVyIGFkZGluZ1xuICogYGNsYXNzTmFtZT1cInJvdW5kZWQteGxcImAgd2FudHMgYSByb3VuZGVyIGJ1dHRvbiwgbm90IGFuIHVuc3R5bGVkIG9uZSDigJQgYW5kXG4gKiByZXBsYWNlbWVudCBpcyBhIHN1cHBvcnQgYnVyZGVuIHdoZXJlIGV2ZXJ5IG92ZXJyaWRlIHN0YXJ0cyBieSByZWJ1aWxkaW5nIHRoZVxuICogY29tcG9uZW50J3MgYmFzZSBzdHlsZXMgZnJvbSBzY3JhdGNoLlxuICovXG5cbmV4cG9ydCBpbnRlcmZhY2UgRGVzaWduVG9rZW5zIHtcbiAgY29sb3JQcmltYXJ5Pzogc3RyaW5nO1xuICBjb2xvclRleHQ/OiBzdHJpbmc7XG4gIGNvbG9yQmFja2dyb3VuZD86IHN0cmluZztcbiAgY29sb3JEYW5nZXI/OiBzdHJpbmc7XG4gIGNvbG9yQm9yZGVyPzogc3RyaW5nO1xuICBib3JkZXJSYWRpdXM/OiBzdHJpbmc7XG4gIGZvbnRGYW1pbHk/OiBzdHJpbmc7XG4gIHNwYWNpbmdVbml0Pzogc3RyaW5nO1xufVxuXG4vKiogRXZlcnkgZWxlbWVudCBhIGN1c3RvbWVyIG1heSB0YXJnZXQuIE5hbWVkIGZvciB3aGF0IGl0IElTLCBub3Qgd2hlcmUgaXQgc2l0cy4gKi9cbmV4cG9ydCB0eXBlIEVsZW1lbnRLZXkgPVxuICB8ICdyb290J1xuICB8ICdjYXJkJ1xuICB8ICdoZWFkZXJUaXRsZSdcbiAgfCAnaGVhZGVyU3VidGl0bGUnXG4gIHwgJ2Zvcm1GaWVsZCdcbiAgfCAnZm9ybUZpZWxkTGFiZWwnXG4gIHwgJ2Zvcm1GaWVsZElucHV0J1xuICB8ICdmb3JtRmllbGRFcnJvcidcbiAgfCAnZm9ybUJ1dHRvblByaW1hcnknXG4gIHwgJ2Zvcm1CdXR0b25TZWNvbmRhcnknXG4gIHwgJ3NvY2lhbEJ1dHRvbidcbiAgfCAnZGl2aWRlclRleHQnXG4gIHwgJ2Zvb3RlckFjdGlvbidcbiAgfCAnYXZhdGFyJ1xuICB8ICdtZW51J1xuICB8ICdtZW51SXRlbSdcbiAgfCAnYmFkZ2UnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEFwcGVhcmFuY2Uge1xuICAvKiogQSBwcmVidWlsdCB0aGVtZSB0byBzdGFydCBmcm9tLiAqL1xuICBiYXNlVGhlbWU/OiBrZXlvZiB0eXBlb2YgVEhFTUVTO1xuICB2YXJpYWJsZXM/OiBEZXNpZ25Ub2tlbnM7XG4gIGVsZW1lbnRzPzogUGFydGlhbDxSZWNvcmQ8RWxlbWVudEtleSwgc3RyaW5nPj47XG59XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX1RPS0VOUzogUmVxdWlyZWQ8RGVzaWduVG9rZW5zPiA9IHtcbiAgY29sb3JQcmltYXJ5OiAnIzViNWJkNicsXG4gIGNvbG9yVGV4dDogJyMxYzFjMWYnLFxuICBjb2xvckJhY2tncm91bmQ6ICcjZmZmZmZmJyxcbiAgY29sb3JEYW5nZXI6ICcjZDY0NTQ1JyxcbiAgY29sb3JCb3JkZXI6ICcjZTRlNGU5JyxcbiAgYm9yZGVyUmFkaXVzOiAnOHB4JyxcbiAgZm9udEZhbWlseTogJ3VpLXNhbnMtc2VyaWYsIHN5c3RlbS11aSwgLWFwcGxlLXN5c3RlbSwgXCJTZWdvZSBVSVwiLCBzYW5zLXNlcmlmJyxcbiAgc3BhY2luZ1VuaXQ6ICc0cHgnLFxufTtcblxuLyoqXG4gKiDCpzEwLjM6IFwicHJlYnVpbHQgdGhlbWVzIHNoaXBwZWQgKGRlZmF1bHQsIGRhcmssIG5lb2JydXRhbGlzdCBhcyBhIGRlbW8gb2YgdGhlXG4gKiBvdmVycmlkZSBzeXN0ZW0pXCIuIE5lb2JydXRhbGlzdCBleGlzdHMgdG8gcHJvdmUgdGhlIHRva2VuIHNldCBpcyBleHByZXNzaXZlXG4gKiBlbm91Z2ggZm9yIGEgdGhlbWUgdGhhdCBsb29rcyBub3RoaW5nIGxpa2UgdGhlIGRlZmF1bHQg4oCUIGEgdGhlbWluZyBzeXN0ZW1cbiAqIHRoYXQgb25seSBwcm9kdWNlcyB0YXN0ZWZ1bCB2YXJpYXRpb25zIG9mIGl0c2VsZiBpcyBub3QgYSB0aGVtaW5nIHN5c3RlbS5cbiAqL1xuZXhwb3J0IGNvbnN0IFRIRU1FUyA9IHtcbiAgZGVmYXVsdDogREVGQVVMVF9UT0tFTlMsXG4gIGRhcms6IHtcbiAgICAuLi5ERUZBVUxUX1RPS0VOUyxcbiAgICBjb2xvclRleHQ6ICcjZTZlOWVmJyxcbiAgICBjb2xvckJhY2tncm91bmQ6ICcjMTQxNzFjJyxcbiAgICBjb2xvckJvcmRlcjogJyMyNDI5MzInLFxuICAgIGNvbG9yUHJpbWFyeTogJyM2ZWE4ZmUnLFxuICB9LFxuICBuZW9icnV0YWxpc3Q6IHtcbiAgICAuLi5ERUZBVUxUX1RPS0VOUyxcbiAgICBjb2xvclByaW1hcnk6ICcjZmZlNjAwJyxcbiAgICBjb2xvclRleHQ6ICcjMDAwMDAwJyxcbiAgICBjb2xvckJhY2tncm91bmQ6ICcjZmZmZmZmJyxcbiAgICBjb2xvckJvcmRlcjogJyMwMDAwMDAnLFxuICAgIGJvcmRlclJhZGl1czogJzBweCcsXG4gICAgZm9udEZhbWlseTogJ1wiQ291cmllciBOZXdcIiwgdWktbW9ub3NwYWNlLCBtb25vc3BhY2UnLFxuICB9LFxufSBhcyBjb25zdCBzYXRpc2ZpZXMgUmVjb3JkPHN0cmluZywgUmVxdWlyZWQ8RGVzaWduVG9rZW5zPj47XG5cbi8qKlxuICogUmVzb2x2ZSB0b2tlbnM6IGRlZmF1bHRzLCB0aGVuIHRoZSBiYXNlIHRoZW1lLCB0aGVuIGV4cGxpY2l0IHZhcmlhYmxlcy5cbiAqXG4gKiBMYXRlciB3aW5zLCBhbmQgYHVuZGVmaW5lZGAgbmV2ZXIgb3ZlcndyaXRlcy4gQSBjdXN0b21lciBzZXR0aW5nIG9uZSB2YXJpYWJsZVxuICogb24gdGhlIGRhcmsgdGhlbWUgZXhwZWN0cyB0aGUgb3RoZXIgZWxldmVuIHRvIHN0YXkgZGFyaywgbm90IHNpbGVudGx5IHJldmVydFxuICogdG8gdGhlIGxpZ2h0IGRlZmF1bHRzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVRva2VucyhhcHBlYXJhbmNlPzogQXBwZWFyYW5jZSk6IFJlcXVpcmVkPERlc2lnblRva2Vucz4ge1xuICBjb25zdCBiYXNlID0gYXBwZWFyYW5jZT8uYmFzZVRoZW1lID8gVEhFTUVTW2FwcGVhcmFuY2UuYmFzZVRoZW1lXSA6IERFRkFVTFRfVE9LRU5TO1xuICBjb25zdCBvdmVycmlkZXMgPSBhcHBlYXJhbmNlPy52YXJpYWJsZXMgPz8ge307XG5cbiAgY29uc3QgcmVzb2x2ZWQgPSB7IC4uLkRFRkFVTFRfVE9LRU5TLCAuLi5iYXNlIH07XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKG92ZXJyaWRlcykpIHtcbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkgcmVzb2x2ZWRba2V5IGFzIGtleW9mIERlc2lnblRva2Vuc10gPSB2YWx1ZTtcbiAgfVxuICByZXR1cm4gcmVzb2x2ZWQ7XG59XG5cbi8qKiBUb2tlbnMgYXMgQ1NTIGN1c3RvbSBwcm9wZXJ0aWVzLCBmb3IgdGhlIGhvc3QgRE9NIHRvIGluaGVyaXQuICovXG5leHBvcnQgZnVuY3Rpb24gY3NzVmFyaWFibGVzKHRva2VuczogUmVxdWlyZWQ8RGVzaWduVG9rZW5zPik6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICBjb25zdCB2YXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHRva2VucykpIHtcbiAgICAvLyBjYW1lbENhc2Ug4oaSIC0tYXRsYXMta2ViYWItY2FzZSwgd2hpY2ggaXMgd2hhdCBhIGN1c3RvbWVyIHdyaXRlcyBpbiBDU1MuXG4gICAgdmFyc1tgLS1hdGxhcy0ke2tleS5yZXBsYWNlKC9bQS1aXS9nLCAoYykgPT4gYC0ke2MudG9Mb3dlckNhc2UoKX1gKX1gXSA9IHZhbHVlO1xuICB9XG4gIHJldHVybiB2YXJzO1xufVxuXG4vKipcbiAqIENvbWJpbmUgb3VyIGJhc2UgY2xhc3Mgd2l0aCB0aGUgY3VzdG9tZXIncyBvdmVycmlkZS5cbiAqXG4gKiBBcHBlbmRlZCwgbmV2ZXIgcmVwbGFjZWQg4oCUIGEgY3VzdG9tZXIgYWRkaW5nIGByb3VuZGVkLXhsYCB3YW50cyBhIHJvdW5kZXJcbiAqIGJ1dHRvbiwgbm90IGFuIHVuc3R5bGVkIG9uZS4gVGhlaXJzIGNvbWVzIGxhc3Qgc28gaXQgd2lucyBvbiBlcXVhbFxuICogc3BlY2lmaWNpdHksIHdoaWNoIGlzIHRoZSBiZWhhdmlvdXIgYW55b25lIHdyaXRpbmcgVGFpbHdpbmQgZXhwZWN0cy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNsYXNzRm9yKFxuICBlbGVtZW50OiBFbGVtZW50S2V5LFxuICBhcHBlYXJhbmNlOiBBcHBlYXJhbmNlIHwgdW5kZWZpbmVkLFxuICBiYXNlOiBzdHJpbmcsXG4pOiBzdHJpbmcge1xuICBjb25zdCBvdmVycmlkZSA9IGFwcGVhcmFuY2U/LmVsZW1lbnRzPy5bZWxlbWVudF07XG4gIHJldHVybiBvdmVycmlkZSA/IGAke2Jhc2V9ICR7b3ZlcnJpZGV9YCA6IGJhc2U7XG59XG4iXX0=
94
+ // ---- the design system ---------------------------------------------------------
95
+ /**
96
+ * The legacy tokens the developer chose EXPLICITLY: a non-default `baseTheme`
97
+ * plus `variables`. Only these map onto a design — the token defaults must not
98
+ * overwrite the dashboard design.
99
+ */
100
+ export function explicitTokens(appearance) {
101
+ const out = {};
102
+ if (appearance?.baseTheme && appearance.baseTheme !== 'default') {
103
+ Object.assign(out, THEMES[appearance.baseTheme]);
104
+ }
105
+ for (const [key, value] of Object.entries(appearance?.variables ?? {})) {
106
+ if (value !== undefined)
107
+ out[key] = value;
108
+ }
109
+ return out;
110
+ }
111
+ /**
112
+ * Turn an `appearance` (+ the instance's dashboard design from the Frontend
113
+ * API) into root attributes and a stylesheet — the same semantics as
114
+ * `@atlasauth/react`. Precedence, lowest first: dashboard design < `preset` <
115
+ * `variables` (and a non-default `baseTheme`) < `design`. Without a dashboard
116
+ * design and without `preset`/`design`, the output is exactly the
117
+ * pre-design-system one: the token variables, no stylesheet, no attributes.
118
+ */
119
+ export function renderAppearance(appearance, instanceDesign, options = {}) {
120
+ return renderDesignAppearance(appearance, instanceDesign, {
121
+ tokens: explicitTokens(appearance),
122
+ legacyStyle: () => cssVariables(resolveTokens(appearance)),
123
+ frontendApi: options.frontendApi,
124
+ warn: options.warn,
125
+ });
126
+ }
127
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwZWFyYW5jZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvYXBwZWFyYW5jZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0JHO0FBRUgsT0FBTyxFQUNMLHNCQUFzQixHQUt2QixNQUFNLDJCQUEyQixDQUFDO0FBRW5DLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBaUQvRCxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQTJCO0lBQ3BELFlBQVksRUFBRSxTQUFTO0lBQ3ZCLFNBQVMsRUFBRSxTQUFTO0lBQ3BCLGVBQWUsRUFBRSxTQUFTO0lBQzFCLFdBQVcsRUFBRSxTQUFTO0lBQ3RCLFdBQVcsRUFBRSxTQUFTO0lBQ3RCLFlBQVksRUFBRSxLQUFLO0lBQ25CLFVBQVUsRUFBRSxpRUFBaUU7SUFDN0UsV0FBVyxFQUFFLEtBQUs7Q0FDbkIsQ0FBQztBQUVGOzs7OztHQUtHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sTUFBTSxHQUFHO0lBQ3BCLE9BQU8sRUFBRSxjQUFjO0lBQ3ZCLElBQUksRUFBRTtRQUNKLEdBQUcsY0FBYztRQUNqQixTQUFTLEVBQUUsU0FBUztRQUNwQixlQUFlLEVBQUUsU0FBUztRQUMxQixXQUFXLEVBQUUsU0FBUztRQUN0QixZQUFZLEVBQUUsU0FBUztLQUN4QjtJQUNELFlBQVksRUFBRTtRQUNaLEdBQUcsY0FBYztRQUNqQixZQUFZLEVBQUUsU0FBUztRQUN2QixTQUFTLEVBQUUsU0FBUztRQUNwQixlQUFlLEVBQUUsU0FBUztRQUMxQixXQUFXLEVBQUUsU0FBUztRQUN0QixZQUFZLEVBQUUsS0FBSztRQUNuQixVQUFVLEVBQUUsd0NBQXdDO0tBQ3JEO0NBQ3dELENBQUM7QUFFNUQ7Ozs7OztHQU1HO0FBQ0gsTUFBTSxVQUFVLGFBQWEsQ0FBQyxVQUF1QjtJQUNuRCxNQUFNLElBQUksR0FBRyxVQUFVLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUM7SUFDbkYsTUFBTSxTQUFTLEdBQUcsVUFBVSxFQUFFLFNBQVMsSUFBSSxFQUFFLENBQUM7SUFFOUMsTUFBTSxRQUFRLEdBQUcsRUFBRSxHQUFHLGNBQWMsRUFBRSxHQUFHLElBQUksRUFBRSxDQUFDO0lBQ2hELEtBQUssTUFBTSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7UUFDckQsSUFBSSxLQUFLLEtBQUssU0FBUztZQUFFLFFBQVEsQ0FBQyxHQUF5QixDQUFDLEdBQUcsS0FBSyxDQUFDO0lBQ3ZFLENBQUM7SUFDRCxPQUFPLFFBQVEsQ0FBQztBQUNsQixDQUFDO0FBRUQsb0VBQW9FO0FBQ3BFLE1BQU0sVUFBVSxZQUFZLENBQUMsTUFBOEI7SUFDekQsTUFBTSxJQUFJLEdBQTJCLEVBQUUsQ0FBQztJQUN4QyxLQUFLLE1BQU0sQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1FBQ2xELDBFQUEwRTtRQUMxRSxJQUFJLENBQUMsV0FBVyxHQUFHLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUM7SUFDakYsQ0FBQztJQUNELE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSxRQUFRLENBQ3RCLE9BQW1CLEVBQ25CLFVBQWtDLEVBQ2xDLElBQVk7SUFFWixNQUFNLFFBQVEsR0FBRyxVQUFVLEVBQUUsUUFBUSxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDakQsT0FBTyxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxJQUFJLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7QUFDakQsQ0FBQztBQUVELG1GQUFtRjtBQUVuRjs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLGNBQWMsQ0FBQyxVQUF1QjtJQUNwRCxNQUFNLEdBQUcsR0FBaUIsRUFBRSxDQUFDO0lBQzdCLElBQUksVUFBVSxFQUFFLFNBQVMsSUFBSSxVQUFVLENBQUMsU0FBUyxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQ2hFLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztJQUNuRCxDQUFDO0lBQ0QsS0FBSyxNQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLFNBQVMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDO1FBQ3ZFLElBQUksS0FBSyxLQUFLLFNBQVM7WUFBRSxHQUFHLENBQUMsR0FBeUIsQ0FBQyxHQUFHLEtBQUssQ0FBQztJQUNsRSxDQUFDO0lBQ0QsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILE1BQU0sVUFBVSxnQkFBZ0IsQ0FDOUIsVUFBa0MsRUFDbEMsY0FBaUQsRUFDakQsVUFBdUQsRUFBRTtJQUV6RCxPQUFPLHNCQUFzQixDQUFDLFVBQVUsRUFBRSxjQUFjLEVBQUU7UUFDeEQsTUFBTSxFQUFFLGNBQWMsQ0FBQyxVQUFVLENBQUM7UUFDbEMsV0FBVyxFQUFFLEdBQUcsRUFBRSxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDMUQsV0FBVyxFQUFFLE9BQU8sQ0FBQyxXQUFXO1FBQ2hDLElBQUksRUFBRSxPQUFPLENBQUMsSUFBSTtLQUNuQixDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiDCpzEwLjMgdGhlbWluZy5cbiAqXG4gKiBcImFwcGVhcmFuY2UgcHJvcDogZGVzaWduIHRva2VucyAoY29sb3JzLCByYWRpdXMsIGZvbnQsIHNwYWNpbmcpICsgcGVyLWVsZW1lbnRcbiAqIGNsYXNzIG92ZXJyaWRlcyAoZWxlbWVudHM6IHsgZm9ybUJ1dHRvblByaW1hcnk6IFwi4oCmXCIgfSkuIE5vIGlmcmFtZSDigJQgY29tcG9uZW50c1xuICogcmVuZGVyIGluIHRoZSBob3N0IERPTSBzbyBUYWlsd2luZC9DU1MganVzdCB3b3Jrcy5cIlxuICpcbiAqIFJlbmRlcmluZyBpbiB0aGUgaG9zdCBET00gaXMgdGhlIGRlY2lzaW9uIGV2ZXJ5dGhpbmcgZWxzZSBmb2xsb3dzIGZyb20uIEFuXG4gKiBpZnJhbWUgd291bGQgaXNvbGF0ZSBzdHlsZXMgcGVyZmVjdGx5IGFuZCBiZSB1bnVzYWJsZTogaXQgY2Fubm90IGJlIHNpemVkIHRvXG4gKiBpdHMgY29udGVudCByZWxpYWJseSwgaXQgYnJlYWtzIHBhc3N3b3JkIG1hbmFnZXJzLCBpdCBicmVha3MgYXV0b2ZpbGwsIGFuZCBhXG4gKiBUYWlsd2luZCBjbGFzcyB0aGUgY3VzdG9tZXIgd3JpdGVzIGhhcyBubyBlZmZlY3QgaW5zaWRlIGl0LiBTaGFyaW5nIHRoZSBET01cbiAqIG1lYW5zIHRoZSBjdXN0b21lcidzIENTUyByZWFjaGVzIG91ciBtYXJrdXAsIHdoaWNoIGlzIGV4YWN0bHkgd2hhdCB0aGV5IHdhbnRcbiAqIGFuZCB3aGF0IG1ha2VzIGFuIG92ZXJyaWRlIHN5c3RlbSBuZWNlc3NhcnkgcmF0aGVyIHRoYW4gZGVjb3JhdGl2ZS5cbiAqXG4gKiBFbGVtZW50IGNsYXNzZXMgYXJlIEFQUEVOREVEIHRvIG91cnMsIG5ldmVyIHJlcGxhY2luZyB0aGVtLiBBIGN1c3RvbWVyIGFkZGluZ1xuICogYGNsYXNzTmFtZT1cInJvdW5kZWQteGxcImAgd2FudHMgYSByb3VuZGVyIGJ1dHRvbiwgbm90IGFuIHVuc3R5bGVkIG9uZSDigJQgYW5kXG4gKiByZXBsYWNlbWVudCBpcyBhIHN1cHBvcnQgYnVyZGVuIHdoZXJlIGV2ZXJ5IG92ZXJyaWRlIHN0YXJ0cyBieSByZWJ1aWxkaW5nIHRoZVxuICogY29tcG9uZW50J3MgYmFzZSBzdHlsZXMgZnJvbSBzY3JhdGNoLlxuICovXG5cbmltcG9ydCB7XG4gIHJlbmRlckRlc2lnbkFwcGVhcmFuY2UsXG4gIHR5cGUgQXBwZWFyYW5jZVJlbmRlcixcbiAgdHlwZSBEZXNpZ25BcHBlYXJhbmNlLFxuICB0eXBlIERlc2lnbldhcm4sXG4gIHR5cGUgSW5zdGFuY2VEZXNpZ24sXG59IGZyb20gJ0BhdGxhc2F1dGgvZGVzaWduL3J1bnRpbWUnO1xuXG5leHBvcnQgeyBpbnN0YW5jZURlc2lnbkZyb20gfSBmcm9tICdAYXRsYXNhdXRoL2Rlc2lnbi9ydW50aW1lJztcbmV4cG9ydCB0eXBlIHsgQXBwZWFyYW5jZVJlbmRlciwgQXRsYXNEZXNpZ24sIEluc3RhbmNlRGVzaWduLCBQcmVzZXRJZCB9IGZyb20gJ0BhdGxhc2F1dGgvZGVzaWduL3J1bnRpbWUnO1xuXG5leHBvcnQgaW50ZXJmYWNlIERlc2lnblRva2VucyB7XG4gIGNvbG9yUHJpbWFyeT86IHN0cmluZztcbiAgY29sb3JUZXh0Pzogc3RyaW5nO1xuICBjb2xvckJhY2tncm91bmQ/OiBzdHJpbmc7XG4gIGNvbG9yRGFuZ2VyPzogc3RyaW5nO1xuICBjb2xvckJvcmRlcj86IHN0cmluZztcbiAgYm9yZGVyUmFkaXVzPzogc3RyaW5nO1xuICBmb250RmFtaWx5Pzogc3RyaW5nO1xuICBzcGFjaW5nVW5pdD86IHN0cmluZztcbn1cblxuLyoqIEV2ZXJ5IGVsZW1lbnQgYSBjdXN0b21lciBtYXkgdGFyZ2V0LiBOYW1lZCBmb3Igd2hhdCBpdCBJUywgbm90IHdoZXJlIGl0IHNpdHMuICovXG5leHBvcnQgdHlwZSBFbGVtZW50S2V5ID1cbiAgfCAncm9vdCdcbiAgfCAnY2FyZCdcbiAgfCAnaGVhZGVyVGl0bGUnXG4gIHwgJ2hlYWRlclN1YnRpdGxlJ1xuICB8ICdmb3JtRmllbGQnXG4gIHwgJ2Zvcm1GaWVsZExhYmVsJ1xuICB8ICdmb3JtRmllbGRJbnB1dCdcbiAgfCAnZm9ybUZpZWxkRXJyb3InXG4gIHwgJ2Zvcm1CdXR0b25QcmltYXJ5J1xuICB8ICdmb3JtQnV0dG9uU2Vjb25kYXJ5J1xuICB8ICdzb2NpYWxCdXR0b24nXG4gIHwgJ2RpdmlkZXJUZXh0J1xuICB8ICdmb290ZXJBY3Rpb24nXG4gIHwgJ2F2YXRhcidcbiAgfCAnbWVudSdcbiAgfCAnbWVudUl0ZW0nXG4gIHwgJ2JhZGdlJztcblxuZXhwb3J0IGludGVyZmFjZSBBcHBlYXJhbmNlIGV4dGVuZHMgRGVzaWduQXBwZWFyYW5jZSB7XG4gIC8qKiBBIHByZWJ1aWx0IHRva2VuIHRoZW1lIHRvIHN0YXJ0IGZyb20gKHByZS1kZXNpZ24tc3lzdGVtIHRoZW1lcykuICovXG4gIGJhc2VUaGVtZT86IGtleW9mIHR5cGVvZiBUSEVNRVM7XG4gIC8qKlxuICAgKiBMZWdhY3kgZGVzaWduIHRva2Vucy4gV2l0aG91dCBhIGRlc2lnbiB0aGV5IHNldCB0aGUgYC0tYXRsYXMtKmAgdmFyaWFibGVzXG4gICAqIGV4YWN0bHkgYXMgYmVmb3JlOyB3aXRoIG9uZSB0aGV5IG1hcCBvbnRvIGl0LlxuICAgKi9cbiAgdmFyaWFibGVzPzogRGVzaWduVG9rZW5zO1xuICBlbGVtZW50cz86IFBhcnRpYWw8UmVjb3JkPEVsZW1lbnRLZXksIHN0cmluZz4+O1xuICAvLyBGcm9tIERlc2lnbkFwcGVhcmFuY2U6XG4gIC8vICAgcHJlc2V0PzogUHJlc2V0SWQgICAgICAgICAgICBhIGRlc2lnbiBwcmVzZXQgKHJlcGxhY2VzIHRoZSBkYXNoYm9hcmQgZGVzaWduIGFzIHRoZSBiYXNlKVxuICAvLyAgIGRlc2lnbj86IEF0bGFzRGVzaWduICAgICAgICAgc3RydWN0dXJlZCBvdmVycmlkZXMsIGhpZ2hlc3QgcHJlY2VkZW5jZVxuICAvLyAgIGluc3RhbmNlRGVzaWduPzogYm9vbGVhbiAgICAgYXBwbHkgdGhlIGRhc2hib2FyZCBkZXNpZ24gYXV0b21hdGljYWxseSAoZGVmYXVsdCB0cnVlKVxufVxuXG5leHBvcnQgY29uc3QgREVGQVVMVF9UT0tFTlM6IFJlcXVpcmVkPERlc2lnblRva2Vucz4gPSB7XG4gIGNvbG9yUHJpbWFyeTogJyM1YjViZDYnLFxuICBjb2xvclRleHQ6ICcjMWMxYzFmJyxcbiAgY29sb3JCYWNrZ3JvdW5kOiAnI2ZmZmZmZicsXG4gIGNvbG9yRGFuZ2VyOiAnI2Q2NDU0NScsXG4gIGNvbG9yQm9yZGVyOiAnI2U0ZTRlOScsXG4gIGJvcmRlclJhZGl1czogJzhweCcsXG4gIGZvbnRGYW1pbHk6ICd1aS1zYW5zLXNlcmlmLCBzeXN0ZW0tdWksIC1hcHBsZS1zeXN0ZW0sIFwiU2Vnb2UgVUlcIiwgc2Fucy1zZXJpZicsXG4gIHNwYWNpbmdVbml0OiAnNHB4Jyxcbn07XG5cbi8qKlxuICogwqcxMC4zOiBcInByZWJ1aWx0IHRoZW1lcyBzaGlwcGVkIChkZWZhdWx0LCBkYXJrLCBuZW9icnV0YWxpc3QgYXMgYSBkZW1vIG9mIHRoZVxuICogb3ZlcnJpZGUgc3lzdGVtKVwiLiBOZW9icnV0YWxpc3QgZXhpc3RzIHRvIHByb3ZlIHRoZSB0b2tlbiBzZXQgaXMgZXhwcmVzc2l2ZVxuICogZW5vdWdoIGZvciBhIHRoZW1lIHRoYXQgbG9va3Mgbm90aGluZyBsaWtlIHRoZSBkZWZhdWx0IOKAlCBhIHRoZW1pbmcgc3lzdGVtXG4gKiB0aGF0IG9ubHkgcHJvZHVjZXMgdGFzdGVmdWwgdmFyaWF0aW9ucyBvZiBpdHNlbGYgaXMgbm90IGEgdGhlbWluZyBzeXN0ZW0uXG4gKi9cbmV4cG9ydCBjb25zdCBUSEVNRVMgPSB7XG4gIGRlZmF1bHQ6IERFRkFVTFRfVE9LRU5TLFxuICBkYXJrOiB7XG4gICAgLi4uREVGQVVMVF9UT0tFTlMsXG4gICAgY29sb3JUZXh0OiAnI2U2ZTllZicsXG4gICAgY29sb3JCYWNrZ3JvdW5kOiAnIzE0MTcxYycsXG4gICAgY29sb3JCb3JkZXI6ICcjMjQyOTMyJyxcbiAgICBjb2xvclByaW1hcnk6ICcjNmVhOGZlJyxcbiAgfSxcbiAgbmVvYnJ1dGFsaXN0OiB7XG4gICAgLi4uREVGQVVMVF9UT0tFTlMsXG4gICAgY29sb3JQcmltYXJ5OiAnI2ZmZTYwMCcsXG4gICAgY29sb3JUZXh0OiAnIzAwMDAwMCcsXG4gICAgY29sb3JCYWNrZ3JvdW5kOiAnI2ZmZmZmZicsXG4gICAgY29sb3JCb3JkZXI6ICcjMDAwMDAwJyxcbiAgICBib3JkZXJSYWRpdXM6ICcwcHgnLFxuICAgIGZvbnRGYW1pbHk6ICdcIkNvdXJpZXIgTmV3XCIsIHVpLW1vbm9zcGFjZSwgbW9ub3NwYWNlJyxcbiAgfSxcbn0gYXMgY29uc3Qgc2F0aXNmaWVzIFJlY29yZDxzdHJpbmcsIFJlcXVpcmVkPERlc2lnblRva2Vucz4+O1xuXG4vKipcbiAqIFJlc29sdmUgdG9rZW5zOiBkZWZhdWx0cywgdGhlbiB0aGUgYmFzZSB0aGVtZSwgdGhlbiBleHBsaWNpdCB2YXJpYWJsZXMuXG4gKlxuICogTGF0ZXIgd2lucywgYW5kIGB1bmRlZmluZWRgIG5ldmVyIG92ZXJ3cml0ZXMuIEEgY3VzdG9tZXIgc2V0dGluZyBvbmUgdmFyaWFibGVcbiAqIG9uIHRoZSBkYXJrIHRoZW1lIGV4cGVjdHMgdGhlIG90aGVyIGVsZXZlbiB0byBzdGF5IGRhcmssIG5vdCBzaWxlbnRseSByZXZlcnRcbiAqIHRvIHRoZSBsaWdodCBkZWZhdWx0cy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVUb2tlbnMoYXBwZWFyYW5jZT86IEFwcGVhcmFuY2UpOiBSZXF1aXJlZDxEZXNpZ25Ub2tlbnM+IHtcbiAgY29uc3QgYmFzZSA9IGFwcGVhcmFuY2U/LmJhc2VUaGVtZSA/IFRIRU1FU1thcHBlYXJhbmNlLmJhc2VUaGVtZV0gOiBERUZBVUxUX1RPS0VOUztcbiAgY29uc3Qgb3ZlcnJpZGVzID0gYXBwZWFyYW5jZT8udmFyaWFibGVzID8/IHt9O1xuXG4gIGNvbnN0IHJlc29sdmVkID0geyAuLi5ERUZBVUxUX1RPS0VOUywgLi4uYmFzZSB9O1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhvdmVycmlkZXMpKSB7XG4gICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHJlc29sdmVkW2tleSBhcyBrZXlvZiBEZXNpZ25Ub2tlbnNdID0gdmFsdWU7XG4gIH1cbiAgcmV0dXJuIHJlc29sdmVkO1xufVxuXG4vKiogVG9rZW5zIGFzIENTUyBjdXN0b20gcHJvcGVydGllcywgZm9yIHRoZSBob3N0IERPTSB0byBpbmhlcml0LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNzc1ZhcmlhYmxlcyh0b2tlbnM6IFJlcXVpcmVkPERlc2lnblRva2Vucz4pOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgY29uc3QgdmFyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyh0b2tlbnMpKSB7XG4gICAgLy8gY2FtZWxDYXNlIOKGkiAtLWF0bGFzLWtlYmFiLWNhc2UsIHdoaWNoIGlzIHdoYXQgYSBjdXN0b21lciB3cml0ZXMgaW4gQ1NTLlxuICAgIHZhcnNbYC0tYXRsYXMtJHtrZXkucmVwbGFjZSgvW0EtWl0vZywgKGMpID0+IGAtJHtjLnRvTG93ZXJDYXNlKCl9YCl9YF0gPSB2YWx1ZTtcbiAgfVxuICByZXR1cm4gdmFycztcbn1cblxuLyoqXG4gKiBDb21iaW5lIG91ciBiYXNlIGNsYXNzIHdpdGggdGhlIGN1c3RvbWVyJ3Mgb3ZlcnJpZGUuXG4gKlxuICogQXBwZW5kZWQsIG5ldmVyIHJlcGxhY2VkIOKAlCBhIGN1c3RvbWVyIGFkZGluZyBgcm91bmRlZC14bGAgd2FudHMgYSByb3VuZGVyXG4gKiBidXR0b24sIG5vdCBhbiB1bnN0eWxlZCBvbmUuIFRoZWlycyBjb21lcyBsYXN0IHNvIGl0IHdpbnMgb24gZXF1YWxcbiAqIHNwZWNpZmljaXR5LCB3aGljaCBpcyB0aGUgYmVoYXZpb3VyIGFueW9uZSB3cml0aW5nIFRhaWx3aW5kIGV4cGVjdHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjbGFzc0ZvcihcbiAgZWxlbWVudDogRWxlbWVudEtleSxcbiAgYXBwZWFyYW5jZTogQXBwZWFyYW5jZSB8IHVuZGVmaW5lZCxcbiAgYmFzZTogc3RyaW5nLFxuKTogc3RyaW5nIHtcbiAgY29uc3Qgb3ZlcnJpZGUgPSBhcHBlYXJhbmNlPy5lbGVtZW50cz8uW2VsZW1lbnRdO1xuICByZXR1cm4gb3ZlcnJpZGUgPyBgJHtiYXNlfSAke292ZXJyaWRlfWAgOiBiYXNlO1xufVxuXG4vLyAtLS0tIHRoZSBkZXNpZ24gc3lzdGVtIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIFRoZSBsZWdhY3kgdG9rZW5zIHRoZSBkZXZlbG9wZXIgY2hvc2UgRVhQTElDSVRMWTogYSBub24tZGVmYXVsdCBgYmFzZVRoZW1lYFxuICogcGx1cyBgdmFyaWFibGVzYC4gT25seSB0aGVzZSBtYXAgb250byBhIGRlc2lnbiDigJQgdGhlIHRva2VuIGRlZmF1bHRzIG11c3Qgbm90XG4gKiBvdmVyd3JpdGUgdGhlIGRhc2hib2FyZCBkZXNpZ24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleHBsaWNpdFRva2VucyhhcHBlYXJhbmNlPzogQXBwZWFyYW5jZSk6IERlc2lnblRva2VucyB7XG4gIGNvbnN0IG91dDogRGVzaWduVG9rZW5zID0ge307XG4gIGlmIChhcHBlYXJhbmNlPy5iYXNlVGhlbWUgJiYgYXBwZWFyYW5jZS5iYXNlVGhlbWUgIT09ICdkZWZhdWx0Jykge1xuICAgIE9iamVjdC5hc3NpZ24ob3V0LCBUSEVNRVNbYXBwZWFyYW5jZS5iYXNlVGhlbWVdKTtcbiAgfVxuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhhcHBlYXJhbmNlPy52YXJpYWJsZXMgPz8ge30pKSB7XG4gICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIG91dFtrZXkgYXMga2V5b2YgRGVzaWduVG9rZW5zXSA9IHZhbHVlO1xuICB9XG4gIHJldHVybiBvdXQ7XG59XG5cbi8qKlxuICogVHVybiBhbiBgYXBwZWFyYW5jZWAgKCsgdGhlIGluc3RhbmNlJ3MgZGFzaGJvYXJkIGRlc2lnbiBmcm9tIHRoZSBGcm9udGVuZFxuICogQVBJKSBpbnRvIHJvb3QgYXR0cmlidXRlcyBhbmQgYSBzdHlsZXNoZWV0IOKAlCB0aGUgc2FtZSBzZW1hbnRpY3MgYXNcbiAqIGBAYXRsYXNhdXRoL3JlYWN0YC4gUHJlY2VkZW5jZSwgbG93ZXN0IGZpcnN0OiBkYXNoYm9hcmQgZGVzaWduIDwgYHByZXNldGAgPFxuICogYHZhcmlhYmxlc2AgKGFuZCBhIG5vbi1kZWZhdWx0IGBiYXNlVGhlbWVgKSA8IGBkZXNpZ25gLiBXaXRob3V0IGEgZGFzaGJvYXJkXG4gKiBkZXNpZ24gYW5kIHdpdGhvdXQgYHByZXNldGAvYGRlc2lnbmAsIHRoZSBvdXRwdXQgaXMgZXhhY3RseSB0aGVcbiAqIHByZS1kZXNpZ24tc3lzdGVtIG9uZTogdGhlIHRva2VuIHZhcmlhYmxlcywgbm8gc3R5bGVzaGVldCwgbm8gYXR0cmlidXRlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbmRlckFwcGVhcmFuY2UoXG4gIGFwcGVhcmFuY2U6IEFwcGVhcmFuY2UgfCB1bmRlZmluZWQsXG4gIGluc3RhbmNlRGVzaWduOiBJbnN0YW5jZURlc2lnbiB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdGlvbnM6IHsgZnJvbnRlbmRBcGk/OiBzdHJpbmc7IHdhcm4/OiBEZXNpZ25XYXJuIH0gPSB7fSxcbik6IEFwcGVhcmFuY2VSZW5kZXIge1xuICByZXR1cm4gcmVuZGVyRGVzaWduQXBwZWFyYW5jZShhcHBlYXJhbmNlLCBpbnN0YW5jZURlc2lnbiwge1xuICAgIHRva2VuczogZXhwbGljaXRUb2tlbnMoYXBwZWFyYW5jZSksXG4gICAgbGVnYWN5U3R5bGU6ICgpID0+IGNzc1ZhcmlhYmxlcyhyZXNvbHZlVG9rZW5zKGFwcGVhcmFuY2UpKSxcbiAgICBmcm9udGVuZEFwaTogb3B0aW9ucy5mcm9udGVuZEFwaSxcbiAgICB3YXJuOiBvcHRpb25zLndhcm4sXG4gIH0pO1xufVxuIl19
@@ -6,7 +6,7 @@ import { distinctUntilChanged, map } from 'rxjs/operators';
6
6
  import { FapiClient, TokenCache, getProviderToken as fetchProviderToken, msUntilRefresh, readExpiry, readRedirectResult, stripRedirectParams, } from '@atlasauth/js';
7
7
  import { evaluate } from '@atlasauth/authz';
8
8
  import { ATLAS_OPTIONS } from './atlas.config';
9
- import { cssVariables, resolveTokens } from './appearance';
9
+ import { cssVariables, instanceDesignFrom, renderAppearance, resolveTokens, } from './appearance';
10
10
  import { EN_US, withFallback } from './i18n';
11
11
  import * as i0 from "@angular/core";
12
12
  /**
@@ -126,6 +126,33 @@ export class AtlasService {
126
126
  appearanceVariables() {
127
127
  return cssVariables(resolveTokens(this.options.appearance));
128
128
  }
129
+ /**
130
+ * The full appearance render for a root element: inline variables, the
131
+ * `data-atlas-*` attributes and the design stylesheet. Pass the dashboard
132
+ * design (from {@link loadInstanceDesign}) to layer code overrides on it —
133
+ * the same semantics as `@atlasauth/react`.
134
+ */
135
+ appearanceRender(instanceDesign) {
136
+ return renderAppearance(this.options.appearance, instanceDesign ?? null, {
137
+ frontendApi: this.baseUrl,
138
+ });
139
+ }
140
+ /**
141
+ * The design configured in the Atlas dashboard (`GET /v1/appearance`), or null
142
+ * when there is none, it cannot be read, or the app opted out with
143
+ * `appearance.instanceDesign: false`.
144
+ */
145
+ async loadInstanceDesign() {
146
+ if (this.options.appearance?.instanceDesign === false)
147
+ return null;
148
+ try {
149
+ const response = await this.call('/v1/appearance');
150
+ return response.ok ? instanceDesignFrom(await response.json()) : null;
151
+ }
152
+ catch {
153
+ return null;
154
+ }
155
+ }
129
156
  /** A fresh {@link FapiClient} for driving a sign-in/sign-up flow. */
130
157
  createFapiClient() {
131
158
  return new FapiClient({ publishableKey: this.publishableKey, baseUrl: this.baseUrl });
@@ -326,4 +353,4 @@ function decodeClaims(jwt) {
326
353
  return null;
327
354
  }
328
355
  }
329
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXRsYXMuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvYXRsYXMuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsVUFBVSxFQUVWLFdBQVcsRUFFWCxRQUFRLEVBQ1IsTUFBTSxHQUNQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsZUFBZSxFQUFjLGFBQWEsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNsRSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0QsT0FBTyxFQUNMLFVBQVUsRUFDVixVQUFVLEVBQ1YsZ0JBQWdCLElBQUksa0JBQWtCLEVBQ3RDLGNBQWMsRUFDZCxVQUFVLEVBQ1Ysa0JBQWtCLEVBQ2xCLG1CQUFtQixHQUVwQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsUUFBUSxFQUF5QixNQUFNLGtCQUFrQixDQUFDO0FBQ25FLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMvQyxPQUFPLEVBQUUsWUFBWSxFQUFFLGFBQWEsRUFBbUIsTUFBTSxjQUFjLENBQUM7QUFDNUUsT0FBTyxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQWdCLE1BQU0sUUFBUSxDQUFDOztBQVMzRDs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQkc7QUFFSCxNQUFNLE9BQU8sWUFBWTtJQUNOLE9BQU8sR0FBRyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDaEMsVUFBVSxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUNqQyxTQUFTLEdBQUcsaUJBQWlCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBRS9DLE9BQU8sQ0FB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QUFDO3dHQTlVVSxZQUFZOzRHQUFaLFlBQVksY0FEQyxNQUFNOzs0RkFDbkIsWUFBWTtrQkFEeEIsVUFBVTttQkFBQyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUU7O0FBa1ZsQyw2RUFBNkU7QUFDN0UsU0FBUyxZQUFZLENBQUMsR0FBVztJQUMvQixNQUFNLEtBQUssR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzdCLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDcEMsSUFBSSxDQUFDO1FBQ0gsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUNmLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFFLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQ3JDLENBQUM7SUFDckIsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBJbmplY3RhYmxlLFxuICBPbkRlc3Ryb3ksXG4gIFBMQVRGT1JNX0lELFxuICBTaWduYWwsXG4gIGNvbXB1dGVkLFxuICBpbmplY3QsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgaXNQbGF0Zm9ybUJyb3dzZXIgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgdG9TaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUsIGNvbWJpbmVMYXRlc3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge1xuICBGYXBpQ2xpZW50LFxuICBUb2tlbkNhY2hlLFxuICBnZXRQcm92aWRlclRva2VuIGFzIGZldGNoUHJvdmlkZXJUb2tlbixcbiAgbXNVbnRpbFJlZnJlc2gsXG4gIHJlYWRFeHBpcnksXG4gIHJlYWRSZWRpcmVjdFJlc3VsdCxcbiAgc3RyaXBSZWRpcmVjdFBhcmFtcyxcbiAgdHlwZSBQcm92aWRlclRva2VuLFxufSBmcm9tICdAYXRsYXNhdXRoL2pzJztcbmltcG9ydCB7IGV2YWx1YXRlLCB0eXBlIFByb3RlY3RDb25kaXRpb24gfSBmcm9tICdAYXRsYXNhdXRoL2F1dGh6JztcbmltcG9ydCB7IEFUTEFTX09QVElPTlMgfSBmcm9tICcuL2F0bGFzLmNvbmZpZyc7XG5pbXBvcnQgeyBjc3NWYXJpYWJsZXMsIHJlc29sdmVUb2tlbnMsIHR5cGUgQXBwZWFyYW5jZSB9IGZyb20gJy4vYXBwZWFyYW5jZSc7XG5pbXBvcnQgeyBFTl9VUywgd2l0aEZhbGxiYWNrLCB0eXBlIENhdGFsb2cgfSBmcm9tICcuL2kxOG4nO1xuaW1wb3J0IHR5cGUge1xuICBBdGxhc09yZ2FuaXphdGlvbk1lbWJlcnNoaXAsXG4gIEF0bGFzU2Vzc2lvbixcbiAgQXRsYXNVc2VyLFxuICBBdXRoU3RhdHVzLFxuICBTZXNzaW9uQ2xhaW1zLFxufSBmcm9tICcuL3R5cGVzJztcblxuLyoqXG4gKiBgQXRsYXNTZXJ2aWNlYCDigJQgdGhlIEFuZ3VsYXIgcGVlciBvZiBSZWFjdCdzIGA8QXRsYXNQcm92aWRlcj5gICsgaG9va3MuXG4gKlxuICogSXQgaG9sZHMgZXhhY3RseSBvbmUgdGhpbmcgdGhhdCBtYXR0ZXJzIGluIG1lbW9yeTogdGhlIHNob3J0LWxpdmVkIEpXVCwgaW4gYVxuICoge0BsaW5rIFRva2VuQ2FjaGV9LiBOb3QgbG9jYWxTdG9yYWdlLCBub3QgYSBjb29raWUgdGhpcyBjb2RlIHdyaXRlcyDigJQgdGhlXG4gKiByZWZyZXNoIHRva2VuIGlzIEh0dHBPbmx5IHNvIGJyb3dzZXIgc2NyaXB0IG5ldmVyIHRvdWNoZXMgaXQsIGFuZCB0aGUgSldUXG4gKiBsaXZlcyBvbmx5IGFzIGxvbmcgYXMgdGhlIHRhYi4gQW55dGhpbmcgcGVyc2lzdGVkIHdvdWxkIHN1cnZpdmUgdGhlIHRhYiBhbmRcbiAqIGJlY29tZSB0aGUgZmlyc3QgdGhpbmcgYW4gWFNTIHJlYWRzLlxuICpcbiAqIFJlYWN0aXZlIGF1dGggc3RhdGUgaXMgZXhwb3NlZCB0d28gd2F5cyBzbyBjYWxsZXJzIGNhbiBwaWNrIHRoZWlyIGlkaW9tOlxuICogIC0gUnhKUyBvYnNlcnZhYmxlcyAoYHVzZXIkYCwgYHNlc3Npb24kYCwgYGlzU2lnbmVkSW4kYCwg4oCmKSDigJQgdGhlIHByaW1hcnkgQVBJLFxuICogICAgdGhlIGFuYWxvZ3VlIG9mIHRoZSBSZWFjdCBob29rcycgcmV0dXJuIHZhbHVlcy5cbiAqICAtIEFuZ3VsYXIgc2lnbmFscyAoYHVzZXJgLCBgc2Vzc2lvbmAsIGBpc1NpZ25lZEluYCwg4oCmKSDigJQgdGhlIHNhbWUgdmFsdWVzIGFzXG4gKiAgICBgU2lnbmFsPFQ+YCwgZm9yIHRlbXBsYXRlcyBhbmQgYGNvbXB1dGVkKClgLlxuICpcbiAqIFRoZSBpbXBlcmF0aXZlIG1ldGhvZHMgKGBzaWduT3V0YCwgYGdldFRva2VuYCwgYGdldFByb3ZpZGVyVG9rZW5gLFxuICogYHNldEFjdGl2ZU9yZ2FuaXphdGlvbmAsIGByZWxvYWRgKSBtaXJyb3IgdGhlIGFjdGlvbnMgdGhlIGhvb2tzIHJldHVybi5cbiAqL1xuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiAncm9vdCcgfSlcbmV4cG9ydCBjbGFzcyBBdGxhc1NlcnZpY2UgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuICBwcml2YXRlIHJlYWRvbmx5IG9wdGlvbnMgPSBpbmplY3QoQVRMQVNfT1BUSU9OUyk7XG4gIHByaXZhdGUgcmVhZG9ubHkgcGxhdGZvcm1JZCA9IGluamVjdChQTEFURk9STV9JRCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgaXNCcm93c2VyID0gaXNQbGF0Zm9ybUJyb3dzZXIodGhpcy5wbGF0Zm9ybUlkKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IGJhc2VVcmw6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBwdWJsaXNoYWJsZUtleTogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IGRvRmV0Y2g6IHR5cGVvZiBmZXRjaDtcblxuICBwcml2YXRlIHJlYWRvbmx5IGNhY2hlID0gbmV3IFRva2VuQ2FjaGUoKTtcbiAgcHJpdmF0ZSByZWFkb25seSBmYXBpQ2xpZW50OiBGYXBpQ2xpZW50O1xuICBwcml2YXRlIHJlZnJlc2hUaW1lcjogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCBudWxsID0gbnVsbDtcblxuICBwcml2YXRlIHJlYWRvbmx5IGNhdGFsb2c6IENhdGFsb2c7XG5cbiAgLyoqXG4gICAqIEEgc2lnbi1pbiBhdHRlbXB0IGhhbmRlZCBiYWNrIGJ5IGFuIE9BdXRoIHJlZGlyZWN0IHRoYXQgc3RpbGwgbmVlZHMgYSBzZWNvbmRcbiAgICogZmFjdG9yIChubyBzZXNzaW9uIHdhcyBpc3N1ZWQpLiBOdWxsIGluIHRoZSBvcmRpbmFyeSBjYXNlOyB0aGUgYDxhdGxhcy1zaWduLWluPmBcbiAgICogZmxvdyBzZWVkcyBpdHNlbGYgZnJvbSB0aGlzIHNvIHRoZSB1c2VyIHJlc3VtZXMgYXQgdGhlIDJGQSBzdGVwLiBDYXB0dXJlZFxuICAgKiBvbmNlLCBzeW5jaHJvbm91c2x5LCBhdCBjb25zdHJ1Y3Rpb24g4oCUIGJlZm9yZSBhbnkgZmxvdyBjb21wb25lbnQgcmVhZHMgaXQuXG4gICAqL1xuICByZWFkb25seSBwZW5kaW5nQXR0ZW1wdDogeyBpZDogc3RyaW5nOyBzdGF0dXM6IHN0cmluZyB9IHwgbnVsbDtcblxuICAvLyAtLS0gUmVhY3RpdmUgc3RhdGUgKHNvdXJjZSBvZiB0cnV0aCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgcHJpdmF0ZSByZWFkb25seSBfc3RhdHVzID0gbmV3IEJlaGF2aW9yU3ViamVjdDxBdXRoU3RhdHVzPignbG9hZGluZycpO1xuICBwcml2YXRlIHJlYWRvbmx5IF91c2VyID0gbmV3IEJlaGF2aW9yU3ViamVjdDxBdGxhc1VzZXIgfCBudWxsPihudWxsKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfc2Vzc2lvbiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8QXRsYXNTZXNzaW9uIHwgbnVsbD4obnVsbCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2NsYWltcyA9IG5ldyBCZWhhdmlvclN1YmplY3Q8U2Vzc2lvbkNsYWltcyB8IG51bGw+KG51bGwpO1xuICBwcml2YXRlIHJlYWRvbmx5IF9tZW1iZXJzaGlwcyA9IG5ldyBCZWhhdmlvclN1YmplY3Q8QXRsYXNPcmdhbml6YXRpb25NZW1iZXJzaGlwW10+KFtdKTtcblxuICAvKiogVGhlIHRocmVlLXN0YXRlIGF1dGggbGlmZWN5Y2xlOiBgbG9hZGluZ2Ag4oaSIGBzaWduZWRfaW5gIHwgYHNpZ25lZF9vdXRgLiAqL1xuICByZWFkb25seSBzdGF0dXMkOiBPYnNlcnZhYmxlPEF1dGhTdGF0dXM+ID0gdGhpcy5fc3RhdHVzLmFzT2JzZXJ2YWJsZSgpO1xuICByZWFkb25seSB1c2VyJDogT2JzZXJ2YWJsZTxBdGxhc1VzZXIgfCBudWxsPiA9IHRoaXMuX3VzZXIuYXNPYnNlcnZhYmxlKCk7XG4gIHJlYWRvbmx5IHNlc3Npb24kOiBPYnNlcnZhYmxlPEF0bGFzU2Vzc2lvbiB8IG51bGw+ID0gdGhpcy5fc2Vzc2lvbi5hc09ic2VydmFibGUoKTtcbiAgcmVhZG9ubHkgY2xhaW1zJDogT2JzZXJ2YWJsZTxTZXNzaW9uQ2xhaW1zIHwgbnVsbD4gPSB0aGlzLl9jbGFpbXMuYXNPYnNlcnZhYmxlKCk7XG4gIHJlYWRvbmx5IG1lbWJlcnNoaXBzJDogT2JzZXJ2YWJsZTxBdGxhc09yZ2FuaXphdGlvbk1lbWJlcnNoaXBbXT4gPVxuICAgIHRoaXMuX21lbWJlcnNoaXBzLmFzT2JzZXJ2YWJsZSgpO1xuXG4gIC8qKlxuICAgKiBUcnVlIG9uY2UgdGhlIFNESyBoYXMgZmluaXNoZWQgaXRzIGZpcnN0IGJvb3QuIERpc3Rpbmd1aXNoaW5nIFwic3RpbGwgbG9hZGluZ1wiXG4gICAqIGZyb20gXCJzaWduZWQgb3V0XCIgaXMgd2hhdCBsZXRzIGEgdGVtcGxhdGUgYXZvaWQgdGhlIGZsYXNoIG9mIGEgc2lnbi1pbiBmb3JtXG4gICAqIG9uIGV2ZXJ5IHBhZ2UgbG9hZC5cbiAgICovXG4gIHJlYWRvbmx5IGlzTG9hZGVkJDogT2JzZXJ2YWJsZTxib29sZWFuPiA9IHRoaXMuc3RhdHVzJC5waXBlKFxuICAgIG1hcCgocykgPT4gcyAhPT0gJ2xvYWRpbmcnKSxcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICApO1xuXG4gIHJlYWRvbmx5IGlzU2lnbmVkSW4kOiBPYnNlcnZhYmxlPGJvb2xlYW4+ID0gdGhpcy5zdGF0dXMkLnBpcGUoXG4gICAgbWFwKChzKSA9PiBzID09PSAnc2lnbmVkX2luJyksXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgKTtcblxuICAvKiogVGhlIGFjdGl2ZSBvcmdhbml6YXRpb24gbWVtYmVyc2hpcCwgZGVyaXZlZCBmcm9tIHRoZSB0b2tlbidzIGBvcmdfaWRgIGNsYWltLiAqL1xuICByZWFkb25seSBvcmdhbml6YXRpb24kOiBPYnNlcnZhYmxlPEF0bGFzT3JnYW5pemF0aW9uTWVtYmVyc2hpcCB8IG51bGw+ID0gY29tYmluZUxhdGVzdChbXG4gICAgdGhpcy5fbWVtYmVyc2hpcHMsXG4gICAgdGhpcy5fY2xhaW1zLFxuICBdKS5waXBlKFxuICAgIG1hcChcbiAgICAgIChbbWVtYmVyc2hpcHMsIGNsYWltc10pID0+XG4gICAgICAgIG1lbWJlcnNoaXBzLmZpbmQoKG0pID0+IG0ub3JnYW5pemF0aW9uLmlkID09PSBjbGFpbXM/Lm9yZ19pZCkgPz8gbnVsbCxcbiAgICApLFxuICApO1xuXG4gIC8vIC0tLSBTaWduYWwgbWlycm9yIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICByZWFkb25seSBzdGF0dXM6IFNpZ25hbDxBdXRoU3RhdHVzPiA9IHRvU2lnbmFsKHRoaXMuc3RhdHVzJCwgeyBpbml0aWFsVmFsdWU6ICdsb2FkaW5nJyB9KTtcbiAgcmVhZG9ubHkgdXNlcjogU2lnbmFsPEF0bGFzVXNlciB8IG51bGw+ID0gdG9TaWduYWwodGhpcy51c2VyJCwgeyBpbml0aWFsVmFsdWU6IG51bGwgfSk7XG4gIHJlYWRvbmx5IHNlc3Npb246IFNpZ25hbDxBdGxhc1Nlc3Npb24gfCBudWxsPiA9IHRvU2lnbmFsKHRoaXMuc2Vzc2lvbiQsIHsgaW5pdGlhbFZhbHVlOiBudWxsIH0pO1xuICByZWFkb25seSBjbGFpbXM6IFNpZ25hbDxTZXNzaW9uQ2xhaW1zIHwgbnVsbD4gPSB0b1NpZ25hbCh0aGlzLmNsYWltcyQsIHsgaW5pdGlhbFZhbHVlOiBudWxsIH0pO1xuICByZWFkb25seSBtZW1iZXJzaGlwczogU2lnbmFsPEF0bGFzT3JnYW5pemF0aW9uTWVtYmVyc2hpcFtdPiA9IHRvU2lnbmFsKHRoaXMubWVtYmVyc2hpcHMkLCB7XG4gICAgaW5pdGlhbFZhbHVlOiBbXSBhcyBBdGxhc09yZ2FuaXphdGlvbk1lbWJlcnNoaXBbXSxcbiAgfSk7XG4gIHJlYWRvbmx5IGlzTG9hZGVkOiBTaWduYWw8Ym9vbGVhbj4gPSBjb21wdXRlZCgoKSA9PiB0aGlzLnN0YXR1cygpICE9PSAnbG9hZGluZycpO1xuICByZWFkb25seSBpc1NpZ25lZEluOiBTaWduYWw8Ym9vbGVhbj4gPSBjb21wdXRlZCgoKSA9PiB0aGlzLnN0YXR1cygpID09PSAnc2lnbmVkX2luJyk7XG4gIHJlYWRvbmx5IG9yZ2FuaXphdGlvbjogU2lnbmFsPEF0bGFzT3JnYW5pemF0aW9uTWVtYmVyc2hpcCB8IG51bGw+ID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IG9yZ0lkID0gdGhpcy5jbGFpbXMoKT8ub3JnX2lkO1xuICAgIHJldHVybiB0aGlzLm1lbWJlcnNoaXBzKCkuZmluZCgobSkgPT4gbS5vcmdhbml6YXRpb24uaWQgPT09IG9yZ0lkKSA/PyBudWxsO1xuICB9KTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBjb25zdCBvcHRpb25zID0gdGhpcy5vcHRpb25zO1xuICAgIHRoaXMucHVibGlzaGFibGVLZXkgPSBvcHRpb25zLnB1Ymxpc2hhYmxlS2V5O1xuICAgIHRoaXMuYmFzZVVybCA9IG9wdGlvbnMuZnJvbnRlbmRBcGkgPz8gJyc7XG4gICAgdGhpcy5kb0ZldGNoID0gb3B0aW9ucy5mZXRjaEltcGwgPz8gKCguLi5hcmdzOiBQYXJhbWV0ZXJzPHR5cGVvZiBmZXRjaD4pID0+IGZldGNoKC4uLmFyZ3MpKTtcblxuICAgIHRoaXMuY2F0YWxvZyA9IG9wdGlvbnMubG9jYWxpemF0aW9uID8gd2l0aEZhbGxiYWNrKG9wdGlvbnMubG9jYWxpemF0aW9uKSA6IEVOX1VTO1xuXG4gICAgdGhpcy5mYXBpQ2xpZW50ID0gbmV3IEZhcGlDbGllbnQoe1xuICAgICAgcHVibGlzaGFibGVLZXk6IHRoaXMucHVibGlzaGFibGVLZXksXG4gICAgICBiYXNlVXJsOiB0aGlzLmJhc2VVcmwsXG4gICAgICBmZXRjaEltcGw6IHRoaXMuZG9GZXRjaCxcbiAgICB9KTtcblxuICAgIC8vIENhcHR1cmVkIHN5bmNocm9ub3VzbHkgKG5vdCBpbiBhbiBhc3luYyBpbml0KSBzbyBpdCBpcyBhdmFpbGFibGUgYmVmb3JlIGFueVxuICAgIC8vIGZsb3cgY29tcG9uZW50IHJlYWRzIGl0OiBhIG5lZWRzX3NlY29uZF9mYWN0b3IgcmVkaXJlY3QgY2FycmllcyBhIHN0YXR1cyBidXRcbiAgICAvLyBubyB0aWNrZXQsIGFuZCB0aGF0IGlzIHdoYXQgdGhlIDJGQSByZXN1bWUgc2VlZHMgZnJvbS5cbiAgICB0aGlzLnBlbmRpbmdBdHRlbXB0ID0gdGhpcy5pc0Jyb3dzZXIgPyB0aGlzLnJlYWRQZW5kaW5nQXR0ZW1wdCgpIDogbnVsbDtcblxuICAgIC8vIEJvb3Qgb25jZSwgYnJvd3NlciBvbmx5LiBPbiB0aGUgc2VydmVyIHRoZXJlIGlzIG5vIGNvb2tpZSBqYXIgdG8gcmVhZCBhXG4gICAgLy8gc2Vzc2lvbiBmcm9tLCBzbyB3ZSBsZWF2ZSB0aGUgc3RhdGUgYXQgYGxvYWRpbmdgIGFuZCBsZXQgaHlkcmF0aW9uIGJvb3QgaXQuXG4gICAgaWYgKHRoaXMuaXNCcm93c2VyKSB7XG4gICAgICB2b2lkIHRoaXMuYm9vdCgpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuY2xlYXJSZWZyZXNoVGltZXIoKTtcbiAgICB0aGlzLl9zdGF0dXMuY29tcGxldGUoKTtcbiAgICB0aGlzLl91c2VyLmNvbXBsZXRlKCk7XG4gICAgdGhpcy5fc2Vzc2lvbi5jb21wbGV0ZSgpO1xuICAgIHRoaXMuX2NsYWltcy5jb21wbGV0ZSgpO1xuICAgIHRoaXMuX21lbWJlcnNoaXBzLmNvbXBsZXRlKCk7XG4gIH1cblxuICAvLyAtLS0gQ29uZmlndXJhdGlvbiBhY2Nlc3NvcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgZ2V0IGFwcGVhcmFuY2UoKTogQXBwZWFyYW5jZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5hcHBlYXJhbmNlO1xuICB9XG5cbiAgZ2V0IGxvY2FsaXphdGlvbigpOiBDYXRhbG9nIHtcbiAgICByZXR1cm4gdGhpcy5jYXRhbG9nO1xuICB9XG5cbiAgZ2V0IGZyb250ZW5kQXBpKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuYmFzZVVybDtcbiAgfVxuXG4gIC8qKiBUb2tlbnMgYXMgQ1NTIGN1c3RvbSBwcm9wZXJ0aWVzLCBmb3IgYSBob3N0IGVsZW1lbnQgdG8gaW5oZXJpdC4gKi9cbiAgYXBwZWFyYW5jZVZhcmlhYmxlcygpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgICByZXR1cm4gY3NzVmFyaWFibGVzKHJlc29sdmVUb2tlbnModGhpcy5vcHRpb25zLmFwcGVhcmFuY2UpKTtcbiAgfVxuXG4gIC8qKiBBIGZyZXNoIHtAbGluayBGYXBpQ2xpZW50fSBmb3IgZHJpdmluZyBhIHNpZ24taW4vc2lnbi11cCBmbG93LiAqL1xuICBjcmVhdGVGYXBpQ2xpZW50KCk6IEZhcGlDbGllbnQge1xuICAgIHJldHVybiBuZXcgRmFwaUNsaWVudCh7IHB1Ymxpc2hhYmxlS2V5OiB0aGlzLnB1Ymxpc2hhYmxlS2V5LCBiYXNlVXJsOiB0aGlzLmJhc2VVcmwgfSk7XG4gIH1cblxuICAvLyAtLS0gSW1wZXJhdGl2ZSBBUEkgKG1pcnJvcnMgdGhlIFJlYWN0IGhvb2tzJyBhY3Rpb25zKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgLyoqXG4gICAqIFRoZSBjdXJyZW50IHNlc3Npb24ncyBKV1QsIGFsd2F5cyBmcmVzaDogaWYgdGhlIGNhY2hlZCB0b2tlbiBpcyB3aXRoaW4gNXMgb2ZcbiAgICogZXhwaXJ5IGl0IGlzIHJlZnJlc2hlZCBmaXJzdCByYXRoZXIgdGhhbiBoYW5kZWQgb3Zlci4gTnVsbCB3aGVuIHNpZ25lZCBvdXQuXG4gICAqL1xuICBhc3luYyBnZXRUb2tlbigpOiBQcm9taXNlPHN0cmluZyB8IG51bGw+IHtcbiAgICBjb25zdCB1c2FibGUgPSB0aGlzLmNhY2hlLmdldCg1XzAwMCk7XG4gICAgaWYgKHVzYWJsZSkgcmV0dXJuIHVzYWJsZS5qd3Q7XG5cbiAgICBhd2FpdCB0aGlzLnJlZnJlc2goKTtcbiAgICByZXR1cm4gdGhpcy5jYWNoZS5nZXQoNV8wMDApPy5qd3QgPz8gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgc2lnbmVkLWluIHVzZXIncyBPV04gbGl2ZSBhY2Nlc3MgdG9rZW4gYXQgYSBjb25uZWN0ZWQgcHJvdmlkZXIgKEdvb2dsZSxcbiAgICogR2l0SHViLCDigKYpLCBzbyB0aGUgYXBwIGNhbiBjYWxsIHRoYXQgcHJvdmlkZXIncyBBUEkgZnJvbSB0aGUgYnJvd3Nlci4gTnVsbFxuICAgKiB3aGVuIHRoZXJlIGlzIG5vIHVzYWJsZSB0b2tlbiDigJQgbm8gbGlua2VkIGFjY291bnQsIG9yIHRoZSBwcm92aWRlciBncmFudGVkIC9cbiAgICoga2VwdCBub25lLiBUaGUgc2VydmVyIHJlZnJlc2hlcyBhIHN0YWxlIHRva2VuIG9uIHJlYWQ7IHRoZSByZWZyZXNoIHRva2VuIGlzXG4gICAqIG5ldmVyIGV4cG9zZWQuXG4gICAqL1xuICBnZXRQcm92aWRlclRva2VuKHByb3ZpZGVyOiBzdHJpbmcpOiBQcm9taXNlPFByb3ZpZGVyVG9rZW4gfCBudWxsPiB7XG4gICAgcmV0dXJuIGZldGNoUHJvdmlkZXJUb2tlbih0aGlzLmZhcGlDbGllbnQsIHByb3ZpZGVyKTtcbiAgfVxuXG4gIC8qKiBJbXBlcmF0aXZlIGBoYXMoKWAg4oCUIHRoZSBzYW1lIGV2YWx1YXRpb24gYCphdGxhc1Byb3RlY3RgIHJlbmRlcnMgb24uICovXG4gIGhhcyhjb25kaXRpb246IFByb3RlY3RDb25kaXRpb24pOiBib29sZWFuIHtcbiAgICByZXR1cm4gZXZhbHVhdGUodGhpcy5fY2xhaW1zLnZhbHVlLCBjb25kaXRpb24pLmFsbG93ZWQ7XG4gIH1cblxuICAvKiogUmV2b2tlIHRoZSBjdXJyZW50IHNlc3Npb24gc2VydmVyLXNpZGUgYW5kIGRyb3AgYWxsIGxvY2FsIGF1dGggc3RhdGUuICovXG4gIGFzeW5jIHNpZ25PdXQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgY3VycmVudCA9IHRoaXMuY2FjaGUucGVlaygpO1xuICAgIGlmIChjdXJyZW50KSB7XG4gICAgICBhd2FpdCB0aGlzLmNhbGwoYC92MS9jbGllbnQvc2Vzc2lvbnMvJHtjdXJyZW50LnNlc3Npb25JZH0vcmV2b2tlYCwge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIH0pLmNhdGNoKCgpID0+IHVuZGVmaW5lZCk7XG4gICAgfVxuICAgIHRoaXMuY2xlYXJSZWZyZXNoVGltZXIoKTtcbiAgICB0aGlzLmNhY2hlLmNsZWFyKCk7XG4gICAgdGhpcy5fc3RhdHVzLm5leHQoJ3NpZ25lZF9vdXQnKTtcbiAgICB0aGlzLl91c2VyLm5leHQobnVsbCk7XG4gICAgdGhpcy5fc2Vzc2lvbi5uZXh0KG51bGwpO1xuICAgIHRoaXMuX2NsYWltcy5uZXh0KG51bGwpO1xuICAgIHRoaXMuX21lbWJlcnNoaXBzLm5leHQoW10pO1xuICB9XG5cbiAgLyoqXG4gICAqIFN3aXRjaCB0aGUgYWN0aXZlIG9yZ2FuaXphdGlvbiAob3IgYG51bGxgIGZvciB0aGUgcGVyc29uYWwgYWNjb3VudCkuIFRoZVxuICAgKiBuZXcgdG9rZW4gY2FycmllcyB0aGUgbmV3IG9yZyBjbGFpbXMsIHNvIHRoZSBhcHAncyBwZXJtaXNzaW9uIGNoZWNrcyB1cGRhdGVcbiAgICogd2l0aG91dCBhIHJlLWxvZ2luLlxuICAgKi9cbiAgYXN5bmMgc2V0QWN0aXZlT3JnYW5pemF0aW9uKG9yZ2FuaXphdGlvbklkOiBzdHJpbmcgfCBudWxsKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgY3VycmVudCA9IHRoaXMuY2FjaGUucGVlaygpO1xuICAgIGlmICghY3VycmVudCkgcmV0dXJuO1xuXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmNhbGwoYC92MS9jbGllbnQvc2Vzc2lvbnMvJHtjdXJyZW50LnNlc3Npb25JZH0vdG91Y2hgLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgYWN0aXZlX29yZ2FuaXphdGlvbl9pZDogb3JnYW5pemF0aW9uSWQgfSksXG4gICAgfSk7XG4gICAgaWYgKCFyZXNwb25zZS5vaykgcmV0dXJuO1xuXG4gICAgY29uc3QgYm9keSA9IChhd2FpdCByZXNwb25zZS5qc29uKCkpIGFzIHsgand0OiBzdHJpbmcgfTtcbiAgICB0aGlzLmFwcGx5VG9rZW4oYm9keS5qd3QsIGN1cnJlbnQuc2Vzc2lvbklkKTtcbiAgICBhd2FpdCB0aGlzLnJlbG9hZCgpO1xuICB9XG5cbiAgLyoqIFJlLXJlYWQgYC92MS9jbGllbnRgOiByZWZyZXNoIHVzZXIsIHNlc3Npb24sIG1lbWJlcnNoaXBzIGFuZCBzdGF0dXMuICovXG4gIGFzeW5jIHJlbG9hZCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmNhbGwoJy92MS9jbGllbnQnKTtcbiAgICAgIGlmICghcmVzcG9uc2Uub2spIHRocm93IG5ldyBFcnJvcignYm9vdCBmYWlsZWQnKTtcblxuICAgICAgY29uc3QgYm9keSA9IChhd2FpdCByZXNwb25zZS5qc29uKCkpIGFzIHtcbiAgICAgICAgc2Vzc2lvbjogQXRsYXNTZXNzaW9uIHwgbnVsbDtcbiAgICAgICAgdXNlcjogQXRsYXNVc2VyIHwgbnVsbDtcbiAgICAgICAgand0Pzogc3RyaW5nO1xuICAgICAgICBvcmdhbml6YXRpb25fbWVtYmVyc2hpcHM/OiBBdGxhc09yZ2FuaXphdGlvbk1lbWJlcnNoaXBbXTtcbiAgICAgIH07XG5cbiAgICAgIGlmICghYm9keS5zZXNzaW9uIHx8ICFib2R5LnVzZXIpIHtcbiAgICAgICAgdGhpcy5jbGVhclJlZnJlc2hUaW1lcigpO1xuICAgICAgICB0aGlzLmNhY2hlLmNsZWFyKCk7XG4gICAgICAgIHRoaXMuX3N0YXR1cy5uZXh0KCdzaWduZWRfb3V0Jyk7XG4gICAgICAgIHRoaXMuX3VzZXIubmV4dChudWxsKTtcbiAgICAgICAgdGhpcy5fc2Vzc2lvbi5uZXh0KG51bGwpO1xuICAgICAgICB0aGlzLl9jbGFpbXMubmV4dChudWxsKTtcbiAgICAgICAgdGhpcy5fbWVtYmVyc2hpcHMubmV4dChbXSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fdXNlci5uZXh0KGJvZHkudXNlcik7XG4gICAgICB0aGlzLl9zZXNzaW9uLm5leHQoYm9keS5zZXNzaW9uKTtcbiAgICAgIHRoaXMuX21lbWJlcnNoaXBzLm5leHQoYm9keS5vcmdhbml6YXRpb25fbWVtYmVyc2hpcHMgPz8gW10pO1xuICAgICAgaWYgKGJvZHkuand0KSB0aGlzLmFwcGx5VG9rZW4oYm9keS5qd3QsIGJvZHkuc2Vzc2lvbi5pZCk7XG4gICAgICB0aGlzLl9zdGF0dXMubmV4dCgnc2lnbmVkX2luJyk7XG4gICAgICB0aGlzLnNjaGVkdWxlUmVmcmVzaCgpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gQSBmYWlsZWQgYm9vdCBpcyBOT1Qgc2lnbmVkLW91dC4gUmVuZGVyaW5nIGEgc2lnbi1pbiBmb3JtIGJlY2F1c2UgdGhlXG4gICAgICAvLyBuZXR3b3JrIGhpY2N1cGVkIHRocm93cyBhd2F5IGEgcGVyZmVjdGx5IGdvb2Qgc2Vzc2lvbiBhbmQgZm9yY2VzIGFcbiAgICAgIC8vIG5lZWRsZXNzIHJlLWF1dGhlbnRpY2F0aW9uLiBPbmx5IHByb21vdGUgbG9hZGluZyDihpIgc2lnbmVkX291dC5cbiAgICAgIGlmICh0aGlzLl9zdGF0dXMudmFsdWUgPT09ICdsb2FkaW5nJykgdGhpcy5fc3RhdHVzLm5leHQoJ3NpZ25lZF9vdXQnKTtcbiAgICB9XG4gIH1cblxuICAvLyAtLS0gSW50ZXJuYWxzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgLyoqXG4gICAqIMKnNi4zIHN0ZXAgMzogY29tcGxldGUgYSByZWRpcmVjdC1iYXNlZCBzaWduLWluLCB0aGVuIGJvb3QuIEFuIE9BdXRoIG9yXG4gICAqIGhvc3RlZC1wYWdlIGZsb3cgbGFuZHMgYmFjayB3aXRoIGEgb25lLXRpbWUgdGlja2V0IGluIHRoZSBVUkw7IGV4Y2hhbmdlIGl0XG4gICAqIGZvciBjb29raWVzLCBzY3J1YiB0aGUgVVJMIHNvIGEgcmVsb2FkIGNhbm5vdCByZXBsYXkgaXQsIFRIRU4gcmVhZCB0aGVcbiAgICogc2Vzc2lvbi4gQSByZWRpcmVjdCBjYXJyeWluZyBvbmx5IGEgc3RhdHVzIChhIHNlY29uZCBmYWN0b3IgaXMgc3RpbGwgb3dlZClcbiAgICogaGFzIG5vIHRpY2tldCwgc28gbm90aGluZyBpcyBleGNoYW5nZWQgYW5kIHRoZSBhcHAgYm9vdHMgc2lnbmVkLW91dC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgYm9vdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCByZXN1bHQgPSByZWFkUmVkaXJlY3RSZXN1bHQod2luZG93LmxvY2F0aW9uLnNlYXJjaCk7XG5cbiAgICBpZiAocmVzdWx0Py50aWNrZXQpIHtcbiAgICAgIGF3YWl0IHRoaXMuY2FsbCgnL3YxL2NsaWVudC90aWNrZXRzL2V4Y2hhbmdlJywge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBhdHRlbXB0X2lkOiByZXN1bHQuYXR0ZW1wdElkLCB0aWNrZXQ6IHJlc3VsdC50aWNrZXQgfSksXG4gICAgICB9KS5jYXRjaCgoKSA9PiB1bmRlZmluZWQpO1xuICAgIH1cbiAgICBpZiAocmVzdWx0KSB7XG4gICAgICB3aW5kb3cuaGlzdG9yeS5yZXBsYWNlU3RhdGUoe30sIGRvY3VtZW50LnRpdGxlLCBzdHJpcFJlZGlyZWN0UGFyYW1zKHdpbmRvdy5sb2NhdGlvbi5ocmVmKSk7XG4gICAgfVxuICAgIGF3YWl0IHRoaXMucmVsb2FkKCk7XG4gIH1cblxuICBwcml2YXRlIHJlYWRQZW5kaW5nQXR0ZW1wdCgpOiB7IGlkOiBzdHJpbmc7IHN0YXR1czogc3RyaW5nIH0gfCBudWxsIHtcbiAgICBjb25zdCByZXN1bHQgPSByZWFkUmVkaXJlY3RSZXN1bHQod2luZG93LmxvY2F0aW9uLnNlYXJjaCk7XG4gICAgcmV0dXJuIHJlc3VsdD8uc3RhdHVzICYmICFyZXN1bHQudGlja2V0XG4gICAgICA/IHsgaWQ6IHJlc3VsdC5hdHRlbXB0SWQsIHN0YXR1czogcmVzdWx0LnN0YXR1cyB9XG4gICAgICA6IG51bGw7XG4gIH1cblxuICBwcml2YXRlIGNhbGwocGF0aDogc3RyaW5nLCBpbml0PzogUmVxdWVzdEluaXQpOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuZG9GZXRjaChgJHt0aGlzLmJhc2VVcmx9JHtwYXRofWAsIHtcbiAgICAgIC4uLmluaXQsXG4gICAgICAvLyBDb29raWVzIGNhcnJ5IHRoZSBzZXNzaW9uOyBhIHJlcXVlc3Qgd2l0aG91dCB0aGlzIGlzIGluZGlzdGluZ3Vpc2hhYmxlXG4gICAgICAvLyBmcm9tIGJlaW5nIHNpZ25lZCBvdXQuXG4gICAgICBjcmVkZW50aWFsczogJ2luY2x1ZGUnLFxuICAgICAgaGVhZGVyczoge1xuICAgICAgICAneC1wdWJsaXNoYWJsZS1rZXknOiB0aGlzLnB1Ymxpc2hhYmxlS2V5LFxuICAgICAgICAuLi4oaW5pdD8uYm9keSA/IHsgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9IDoge30pLFxuICAgICAgICAuLi5pbml0Py5oZWFkZXJzLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXBwbHlUb2tlbihqd3Q6IHN0cmluZywgc2Vzc2lvbklkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBleHBpcmVzQXQgPSByZWFkRXhwaXJ5KGp3dCk7XG4gICAgaWYgKCFleHBpcmVzQXQpIHJldHVybjtcblxuICAgIHRoaXMuY2FjaGUuc2V0KHsgand0LCBleHBpcmVzQXQsIHNlc3Npb25JZCB9KTtcbiAgICB0aGlzLl9jbGFpbXMubmV4dChkZWNvZGVDbGFpbXMoand0KSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJlZnJlc2goKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgY3VycmVudCA9IHRoaXMuY2FjaGUucGVlaygpO1xuICAgIGlmICghY3VycmVudCkgcmV0dXJuO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5jYWxsKGAvdjEvY2xpZW50L3Nlc3Npb25zLyR7Y3VycmVudC5zZXNzaW9uSWR9L3Rva2Vuc2AsIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICB9KTtcbiAgICAgIGlmICghcmVzcG9uc2Uub2spIHRocm93IG5ldyBFcnJvcigncmVmcmVzaCBmYWlsZWQnKTtcblxuICAgICAgY29uc3QgYm9keSA9IChhd2FpdCByZXNwb25zZS5qc29uKCkpIGFzIHsgand0OiBzdHJpbmc7IHNlc3Npb25faWQ6IHN0cmluZyB9O1xuICAgICAgdGhpcy5hcHBseVRva2VuKGJvZHkuand0LCBib2R5LnNlc3Npb25faWQpO1xuICAgICAgdGhpcy5zY2hlZHVsZVJlZnJlc2goKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIFRoZSBzZXNzaW9uIG1heSBnZW51aW5lbHkgYmUgZ29uZS4gUmUtYm9vdCByYXRoZXIgdGhhbiBndWVzcy5cbiAgICAgIGF3YWl0IHRoaXMucmVsb2FkKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqIMKnNy40OiBwcm9hY3RpdmUsIGppdHRlcmVkIHJlZnJlc2ggc2NoZWR1bGVkIGZyb20gdGhlIHRva2VuJ3Mgb3duIGV4cGlyeS4gKi9cbiAgcHJpdmF0ZSBzY2hlZHVsZVJlZnJlc2goKTogdm9pZCB7XG4gICAgdGhpcy5jbGVhclJlZnJlc2hUaW1lcigpO1xuICAgIGlmICh0aGlzLl9zdGF0dXMudmFsdWUgIT09ICdzaWduZWRfaW4nKSByZXR1cm47XG5cbiAgICBjb25zdCB0b2tlbiA9IHRoaXMuY2FjaGUucGVlaygpO1xuICAgIGlmICghdG9rZW4pIHJldHVybjtcblxuICAgIGNvbnN0IGRlbGF5ID0gbXNVbnRpbFJlZnJlc2goeyB0b2tlbiwgbm93OiBEYXRlLm5vdygpIH0pO1xuICAgIHRoaXMucmVmcmVzaFRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB2b2lkIHRoaXMucmVmcmVzaCgpLCBkZWxheSk7XG4gIH1cblxuICBwcml2YXRlIGNsZWFyUmVmcmVzaFRpbWVyKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnJlZnJlc2hUaW1lcikge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMucmVmcmVzaFRpbWVyKTtcbiAgICAgIHRoaXMucmVmcmVzaFRpbWVyID0gbnVsbDtcbiAgICB9XG4gIH1cbn1cblxuLyoqIERlY29kZSBhIEpXVCBwYXlsb2FkIHdpdGhvdXQgdmVyaWZ5aW5nIGl0IOKAlCBhIHNjaGVkdWxpbmcvVUkgaGludCBvbmx5LiAqL1xuZnVuY3Rpb24gZGVjb2RlQ2xhaW1zKGp3dDogc3RyaW5nKTogU2Vzc2lvbkNsYWltcyB8IG51bGwge1xuICBjb25zdCBwYXJ0cyA9IGp3dC5zcGxpdCgnLicpO1xuICBpZiAocGFydHMubGVuZ3RoICE9PSAzKSByZXR1cm4gbnVsbDtcbiAgdHJ5IHtcbiAgICByZXR1cm4gSlNPTi5wYXJzZShcbiAgICAgIGF0b2IocGFydHNbMV0hLnJlcGxhY2UoLy0vZywgJysnKS5yZXBsYWNlKC9fL2csICcvJykpLFxuICAgICkgYXMgU2Vzc2lvbkNsYWltcztcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cbiJdfQ==
356
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXRsYXMuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvYXRsYXMuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsVUFBVSxFQUVWLFdBQVcsRUFFWCxRQUFRLEVBQ1IsTUFBTSxHQUNQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsZUFBZSxFQUFjLGFBQWEsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNsRSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0QsT0FBTyxFQUNMLFVBQVUsRUFDVixVQUFVLEVBQ1YsZ0JBQWdCLElBQUksa0JBQWtCLEVBQ3RDLGNBQWMsRUFDZCxVQUFVLEVBQ1Ysa0JBQWtCLEVBQ2xCLG1CQUFtQixHQUVwQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsUUFBUSxFQUF5QixNQUFNLGtCQUFrQixDQUFDO0FBQ25FLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMvQyxPQUFPLEVBQ0wsWUFBWSxFQUNaLGtCQUFrQixFQUNsQixnQkFBZ0IsRUFDaEIsYUFBYSxHQUlkLE1BQU0sY0FBYyxDQUFDO0FBQ3RCLE9BQU8sRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFnQixNQUFNLFFBQVEsQ0FBQzs7QUFTM0Q7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUJHO0FBRUgsTUFBTSxPQUFPLFlBQVk7SUFDTixPQUFPLEdBQUcsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQ2hDLFVBQVUsR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDakMsU0FBUyxHQUFHLGlCQUFpQixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUUvQyxPQUFPLENBQVM7SUFDaEIsY0FBYyxDQUFTO0lBQ3ZCLE9BQU8sQ0FBZTtJQUV0QixLQUFLLEdBQUcsSUFBSSxVQUFVLEVBQUUsQ0FBQztJQUN6QixVQUFVLENBQWE7SUFDaEMsWUFBWSxHQUF5QyxJQUFJLENBQUM7SUFFakQsT0FBTyxDQUFVO0lBRWxDOzs7OztPQUtHO0lBQ00sY0FBYyxDQUF3QztJQUUvRCwrRUFBK0U7SUFFOUQsT0FBTyxHQUFHLElBQUksZUFBZSxDQUFhLFNBQVMsQ0FBQyxDQUFDO0lBQ3JELEtBQUssR0FBRyxJQUFJLGVBQWUsQ0FBbUIsSUFBSSxDQUFDLENBQUM7SUFDcEQsUUFBUSxHQUFHLElBQUksZUFBZSxDQUFzQixJQUFJLENBQUMsQ0FBQztJQUMxRCxPQUFPLEdBQUcsSUFBSSxlQUFlLENBQXVCLElBQUksQ0FBQyxDQUFDO0lBQzFELFlBQVksR0FBRyxJQUFJLGVBQWUsQ0FBZ0MsRUFBRSxDQUFDLENBQUM7SUFFdkYsOEVBQThFO0lBQ3JFLE9BQU8sR0FBMkIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUM5RCxLQUFLLEdBQWlDLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDaEUsUUFBUSxHQUFvQyxJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ3pFLE9BQU8sR0FBcUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUN4RSxZQUFZLEdBQ25CLElBQUksQ0FBQyxZQUFZLENBQUMsWUFBWSxFQUFFLENBQUM7SUFFbkM7Ozs7T0FJRztJQUNNLFNBQVMsR0FBd0IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQ3pELEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLFNBQVMsQ0FBQyxFQUMzQixvQkFBb0IsRUFBRSxDQUN2QixDQUFDO0lBRU8sV0FBVyxHQUF3QixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FDM0QsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssV0FBVyxDQUFDLEVBQzdCLG9CQUFvQixFQUFFLENBQ3ZCLENBQUM7SUFFRixtRkFBbUY7SUFDMUUsYUFBYSxHQUFtRCxhQUFhLENBQUM7UUFDckYsSUFBSSxDQUFDLFlBQVk7UUFDakIsSUFBSSxDQUFDLE9BQU87S0FDYixDQUFDLENBQUMsSUFBSSxDQUNMLEdBQUcsQ0FDRCxDQUFDLENBQUMsV0FBVyxFQUFFLE1BQU0sQ0FBQyxFQUFFLEVBQUUsQ0FDeEIsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxFQUFFLEtBQUssTUFBTSxFQUFFLE1BQU0sQ0FBQyxJQUFJLElBQUksQ0FDeEUsQ0FDRixDQUFDO0lBRUYsK0VBQStFO0lBRXRFLE1BQU0sR0FBdUIsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQztJQUNqRixJQUFJLEdBQTZCLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDOUUsT0FBTyxHQUFnQyxRQUFRLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ3ZGLE1BQU0sR0FBaUMsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUN0RixXQUFXLEdBQTBDLFFBQVEsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFO1FBQ3hGLFlBQVksRUFBRSxFQUFtQztLQUNsRCxDQUFDLENBQUM7SUFDTSxRQUFRLEdBQW9CLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEtBQUssU0FBUyxDQUFDLENBQUM7SUFDeEUsVUFBVSxHQUFvQixRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxLQUFLLFdBQVcsQ0FBQyxDQUFDO0lBQzVFLFlBQVksR0FBK0MsUUFBUSxDQUFDLEdBQUcsRUFBRTtRQUNoRixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLEVBQUUsTUFBTSxDQUFDO1FBQ3BDLE9BQU8sSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxFQUFFLEtBQUssS0FBSyxDQUFDLElBQUksSUFBSSxDQUFDO0lBQzdFLENBQUMsQ0FBQyxDQUFDO0lBRUg7UUFDRSxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDO1FBQzdCLElBQUksQ0FBQyxjQUFjLEdBQUcsT0FBTyxDQUFDLGNBQWMsQ0FBQztRQUM3QyxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQyxXQUFXLElBQUksRUFBRSxDQUFDO1FBQ3pDLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDLFNBQVMsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUE4QixFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBRTVGLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO1FBRWpGLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxVQUFVLENBQUM7WUFDL0IsY0FBYyxFQUFFLElBQUksQ0FBQyxjQUFjO1lBQ25DLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTztZQUNyQixTQUFTLEVBQUUsSUFBSSxDQUFDLE9BQU87U0FDeEIsQ0FBQyxDQUFDO1FBRUgsOEVBQThFO1FBQzlFLCtFQUErRTtRQUMvRSx5REFBeUQ7UUFDekQsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBRXhFLDBFQUEwRTtRQUMxRSw4RUFBOEU7UUFDOUUsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDbkIsS0FBSyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDbkIsQ0FBQztJQUNILENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDekIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUN4QixJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ3RCLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDekIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUN4QixJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQy9CLENBQUM7SUFFRCwrRUFBK0U7SUFFL0UsSUFBSSxVQUFVO1FBQ1osT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQztJQUNqQyxDQUFDO0lBRUQsSUFBSSxZQUFZO1FBQ2QsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO0lBQ3RCLENBQUM7SUFFRCxJQUFJLFdBQVc7UUFDYixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUM7SUFDdEIsQ0FBQztJQUVELHNFQUFzRTtJQUN0RSxtQkFBbUI7UUFDakIsT0FBTyxZQUFZLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztJQUM5RCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxnQkFBZ0IsQ0FBQyxjQUFzQztRQUNyRCxPQUFPLGdCQUFnQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLGNBQWMsSUFBSSxJQUFJLEVBQUU7WUFDdkUsV0FBVyxFQUFFLElBQUksQ0FBQyxPQUFPO1NBQzFCLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsS0FBSyxDQUFDLGtCQUFrQjtRQUN0QixJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLGNBQWMsS0FBSyxLQUFLO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDbkUsSUFBSSxDQUFDO1lBQ0gsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7WUFDbkQsT0FBTyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDeEUsQ0FBQztRQUFDLE1BQU0sQ0FBQztZQUNQLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztJQUNILENBQUM7SUFFRCxxRUFBcUU7SUFDckUsZ0JBQWdCO1FBQ2QsT0FBTyxJQUFJLFVBQVUsQ0FBQyxFQUFFLGNBQWMsRUFBRSxJQUFJLENBQUMsY0FBYyxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztJQUN4RixDQUFDO0lBRUQsK0VBQStFO0lBRS9FOzs7T0FHRztJQUNILEtBQUssQ0FBQyxRQUFRO1FBQ1osTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDckMsSUFBSSxNQUFNO1lBQUUsT0FBTyxNQUFNLENBQUMsR0FBRyxDQUFDO1FBRTlCLE1BQU0sSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ3JCLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsR0FBRyxJQUFJLElBQUksQ0FBQztJQUM1QyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsZ0JBQWdCLENBQUMsUUFBZ0I7UUFDL0IsT0FBTyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQ3ZELENBQUM7SUFFRCwyRUFBMkU7SUFDM0UsR0FBRyxDQUFDLFNBQTJCO1FBQzdCLE9BQU8sUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQyxDQUFDLE9BQU8sQ0FBQztJQUN6RCxDQUFDO0lBRUQsNEVBQTRFO0lBQzVFLEtBQUssQ0FBQyxPQUFPO1FBQ1gsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNsQyxJQUFJLE9BQU8sRUFBRSxDQUFDO1lBQ1osTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLHVCQUF1QixPQUFPLENBQUMsU0FBUyxTQUFTLEVBQUU7Z0JBQ2pFLE1BQU0sRUFBRSxNQUFNO2FBQ2YsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUM1QixDQUFDO1FBQ0QsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDekIsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNuQixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUNoQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN0QixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN6QixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN4QixJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUM3QixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILEtBQUssQ0FBQyxxQkFBcUIsQ0FBQyxjQUE2QjtRQUN2RCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ2xDLElBQUksQ0FBQyxPQUFPO1lBQUUsT0FBTztRQUVyQixNQUFNLFFBQVEsR0FBRyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsdUJBQXVCLE9BQU8sQ0FBQyxTQUFTLFFBQVEsRUFBRTtZQUNqRixNQUFNLEVBQUUsTUFBTTtZQUNkLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsc0JBQXNCLEVBQUUsY0FBYyxFQUFFLENBQUM7U0FDakUsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFO1lBQUUsT0FBTztRQUV6QixNQUFNLElBQUksR0FBRyxDQUFDLE1BQU0sUUFBUSxDQUFDLElBQUksRUFBRSxDQUFvQixDQUFDO1FBQ3hELElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDN0MsTUFBTSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7SUFDdEIsQ0FBQztJQUVELDJFQUEyRTtJQUMzRSxLQUFLLENBQUMsTUFBTTtRQUNWLElBQUksQ0FBQztZQUNILE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUMvQyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUU7Z0JBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUVqRCxNQUFNLElBQUksR0FBRyxDQUFDLE1BQU0sUUFBUSxDQUFDLElBQUksRUFBRSxDQUtsQyxDQUFDO1lBRUYsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ2hDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO2dCQUN6QixJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUNuQixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztnQkFDaEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ3RCLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUN6QixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDeEIsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQzNCLE9BQU87WUFDVCxDQUFDO1lBRUQsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzNCLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNqQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsd0JBQXdCLElBQUksRUFBRSxDQUFDLENBQUM7WUFDNUQsSUFBSSxJQUFJLENBQUMsR0FBRztnQkFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUN6RCxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUMvQixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDekIsQ0FBQztRQUFDLE1BQU0sQ0FBQztZQUNQLHdFQUF3RTtZQUN4RSxxRUFBcUU7WUFDckUsaUVBQWlFO1lBQ2pFLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEtBQUssU0FBUztnQkFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUN4RSxDQUFDO0lBQ0gsQ0FBQztJQUVELCtFQUErRTtJQUUvRTs7Ozs7O09BTUc7SUFDSyxLQUFLLENBQUMsSUFBSTtRQUNoQixNQUFNLE1BQU0sR0FBRyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRTFELElBQUksTUFBTSxFQUFFLE1BQU0sRUFBRSxDQUFDO1lBQ25CLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyw2QkFBNkIsRUFBRTtnQkFDN0MsTUFBTSxFQUFFLE1BQU07Z0JBQ2QsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxDQUFDLFNBQVMsRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDO2FBQzlFLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDNUIsQ0FBQztRQUNELElBQUksTUFBTSxFQUFFLENBQUM7WUFDWCxNQUFNLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxFQUFFLEVBQUUsUUFBUSxDQUFDLEtBQUssRUFBRSxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDN0YsQ0FBQztRQUNELE1BQU0sSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQ3RCLENBQUM7SUFFTyxrQkFBa0I7UUFDeEIsTUFBTSxNQUFNLEdBQUcsa0JBQWtCLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUMxRCxPQUFPLE1BQU0sRUFBRSxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTTtZQUNyQyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsTUFBTSxDQUFDLFNBQVMsRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU0sRUFBRTtZQUNqRCxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQ1gsQ0FBQztJQUVPLElBQUksQ0FBQyxJQUFZLEVBQUUsSUFBa0I7UUFDM0MsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLEVBQUUsRUFBRTtZQUM1QyxHQUFHLElBQUk7WUFDUCx5RUFBeUU7WUFDekUseUJBQXlCO1lBQ3pCLFdBQVcsRUFBRSxTQUFTO1lBQ3RCLE9BQU8sRUFBRTtnQkFDUCxtQkFBbUIsRUFBRSxJQUFJLENBQUMsY0FBYztnQkFDeEMsR0FBRyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsY0FBYyxFQUFFLGtCQUFrQixFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDN0QsR0FBRyxJQUFJLEVBQUUsT0FBTzthQUNqQjtTQUNGLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTyxVQUFVLENBQUMsR0FBVyxFQUFFLFNBQWlCO1FBQy9DLE1BQU0sU0FBUyxHQUFHLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNsQyxJQUFJLENBQUMsU0FBUztZQUFFLE9BQU87UUFFdkIsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUM7UUFDOUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUVPLEtBQUssQ0FBQyxPQUFPO1FBQ25CLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDbEMsSUFBSSxDQUFDLE9BQU87WUFBRSxPQUFPO1FBRXJCLElBQUksQ0FBQztZQUNILE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyx1QkFBdUIsT0FBTyxDQUFDLFNBQVMsU0FBUyxFQUFFO2dCQUNsRixNQUFNLEVBQUUsTUFBTTthQUNmLENBQUMsQ0FBQztZQUNILElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRTtnQkFBRSxNQUFNLElBQUksS0FBSyxDQUFDLGdCQUFnQixDQUFDLENBQUM7WUFFcEQsTUFBTSxJQUFJLEdBQUcsQ0FBQyxNQUFNLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBd0MsQ0FBQztZQUM1RSxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQzNDLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN6QixDQUFDO1FBQUMsTUFBTSxDQUFDO1lBQ1AsZ0VBQWdFO1lBQ2hFLE1BQU0sSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ3RCLENBQUM7SUFDSCxDQUFDO0lBRUQsK0VBQStFO0lBQ3ZFLGVBQWU7UUFDckIsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDekIsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssS0FBSyxXQUFXO1lBQUUsT0FBTztRQUUvQyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ2hDLElBQUksQ0FBQyxLQUFLO1lBQUUsT0FBTztRQUVuQixNQUFNLEtBQUssR0FBRyxjQUFjLENBQUMsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDekQsSUFBSSxDQUFDLFlBQVksR0FBRyxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsS0FBSyxJQUFJLENBQUMsT0FBTyxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDbkUsQ0FBQztJQUVPLGlCQUFpQjtRQUN2QixJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUN0QixZQUFZLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQ2hDLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO1FBQzNCLENBQUM7SUFDSCxDQUFDO3dHQXpXVSxZQUFZOzRHQUFaLFlBQVksY0FEQyxNQUFNOzs0RkFDbkIsWUFBWTtrQkFEeEIsVUFBVTttQkFBQyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUU7O0FBNldsQyw2RUFBNkU7QUFDN0UsU0FBUyxZQUFZLENBQUMsR0FBVztJQUMvQixNQUFNLEtBQUssR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzdCLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDcEMsSUFBSSxDQUFDO1FBQ0gsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUNmLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFFLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQ3JDLENBQUM7SUFDckIsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBJbmplY3RhYmxlLFxuICBPbkRlc3Ryb3ksXG4gIFBMQVRGT1JNX0lELFxuICBTaWduYWwsXG4gIGNvbXB1dGVkLFxuICBpbmplY3QsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgaXNQbGF0Zm9ybUJyb3dzZXIgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgdG9TaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUsIGNvbWJpbmVMYXRlc3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge1xuICBGYXBpQ2xpZW50LFxuICBUb2tlbkNhY2hlLFxuICBnZXRQcm92aWRlclRva2VuIGFzIGZldGNoUHJvdmlkZXJUb2tlbixcbiAgbXNVbnRpbFJlZnJlc2gsXG4gIHJlYWRFeHBpcnksXG4gIHJlYWRSZWRpcmVjdFJlc3VsdCxcbiAgc3RyaXBSZWRpcmVjdFBhcmFtcyxcbiAgdHlwZSBQcm92aWRlclRva2VuLFxufSBmcm9tICdAYXRsYXNhdXRoL2pzJztcbmltcG9ydCB7IGV2YWx1YXRlLCB0eXBlIFByb3RlY3RDb25kaXRpb24gfSBmcm9tICdAYXRsYXNhdXRoL2F1dGh6JztcbmltcG9ydCB7IEFUTEFTX09QVElPTlMgfSBmcm9tICcuL2F0bGFzLmNvbmZpZyc7XG5pbXBvcnQge1xuICBjc3NWYXJpYWJsZXMsXG4gIGluc3RhbmNlRGVzaWduRnJvbSxcbiAgcmVuZGVyQXBwZWFyYW5jZSxcbiAgcmVzb2x2ZVRva2VucyxcbiAgdHlwZSBBcHBlYXJhbmNlLFxuICB0eXBlIEFwcGVhcmFuY2VSZW5kZXIsXG4gIHR5cGUgSW5zdGFuY2VEZXNpZ24sXG59IGZyb20gJy4vYXBwZWFyYW5jZSc7XG5pbXBvcnQgeyBFTl9VUywgd2l0aEZhbGxiYWNrLCB0eXBlIENhdGFsb2cgfSBmcm9tICcuL2kxOG4nO1xuaW1wb3J0IHR5cGUge1xuICBBdGxhc09yZ2FuaXphdGlvbk1lbWJlcnNoaXAsXG4gIEF0bGFzU2Vzc2lvbixcbiAgQXRsYXNVc2VyLFxuICBBdXRoU3RhdHVzLFxuICBTZXNzaW9uQ2xhaW1zLFxufSBmcm9tICcuL3R5cGVzJztcblxuLyoqXG4gKiBgQXRsYXNTZXJ2aWNlYCDigJQgdGhlIEFuZ3VsYXIgcGVlciBvZiBSZWFjdCdzIGA8QXRsYXNQcm92aWRlcj5gICsgaG9va3MuXG4gKlxuICogSXQgaG9sZHMgZXhhY3RseSBvbmUgdGhpbmcgdGhhdCBtYXR0ZXJzIGluIG1lbW9yeTogdGhlIHNob3J0LWxpdmVkIEpXVCwgaW4gYVxuICoge0BsaW5rIFRva2VuQ2FjaGV9LiBOb3QgbG9jYWxTdG9yYWdlLCBub3QgYSBjb29raWUgdGhpcyBjb2RlIHdyaXRlcyDigJQgdGhlXG4gKiByZWZyZXNoIHRva2VuIGlzIEh0dHBPbmx5IHNvIGJyb3dzZXIgc2NyaXB0IG5ldmVyIHRvdWNoZXMgaXQsIGFuZCB0aGUgSldUXG4gKiBsaXZlcyBvbmx5IGFzIGxvbmcgYXMgdGhlIHRhYi4gQW55dGhpbmcgcGVyc2lzdGVkIHdvdWxkIHN1cnZpdmUgdGhlIHRhYiBhbmRcbiAqIGJlY29tZSB0aGUgZmlyc3QgdGhpbmcgYW4gWFNTIHJlYWRzLlxuICpcbiAqIFJlYWN0aXZlIGF1dGggc3RhdGUgaXMgZXhwb3NlZCB0d28gd2F5cyBzbyBjYWxsZXJzIGNhbiBwaWNrIHRoZWlyIGlkaW9tOlxuICogIC0gUnhKUyBvYnNlcnZhYmxlcyAoYHVzZXIkYCwgYHNlc3Npb24kYCwgYGlzU2lnbmVkSW4kYCwg4oCmKSDigJQgdGhlIHByaW1hcnkgQVBJLFxuICogICAgdGhlIGFuYWxvZ3VlIG9mIHRoZSBSZWFjdCBob29rcycgcmV0dXJuIHZhbHVlcy5cbiAqICAtIEFuZ3VsYXIgc2lnbmFscyAoYHVzZXJgLCBgc2Vzc2lvbmAsIGBpc1NpZ25lZEluYCwg4oCmKSDigJQgdGhlIHNhbWUgdmFsdWVzIGFzXG4gKiAgICBgU2lnbmFsPFQ+YCwgZm9yIHRlbXBsYXRlcyBhbmQgYGNvbXB1dGVkKClgLlxuICpcbiAqIFRoZSBpbXBlcmF0aXZlIG1ldGhvZHMgKGBzaWduT3V0YCwgYGdldFRva2VuYCwgYGdldFByb3ZpZGVyVG9rZW5gLFxuICogYHNldEFjdGl2ZU9yZ2FuaXphdGlvbmAsIGByZWxvYWRgKSBtaXJyb3IgdGhlIGFjdGlvbnMgdGhlIGhvb2tzIHJldHVybi5cbiAqL1xuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiAncm9vdCcgfSlcbmV4cG9ydCBjbGFzcyBBdGxhc1NlcnZpY2UgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuICBwcml2YXRlIHJlYWRvbmx5IG9wdGlvbnMgPSBpbmplY3QoQVRMQVNfT1BUSU9OUyk7XG4gIHByaXZhdGUgcmVhZG9ubHkgcGxhdGZvcm1JZCA9IGluamVjdChQTEFURk9STV9JRCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgaXNCcm93c2VyID0gaXNQbGF0Zm9ybUJyb3dzZXIodGhpcy5wbGF0Zm9ybUlkKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IGJhc2VVcmw6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBwdWJsaXNoYWJsZUtleTogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IGRvRmV0Y2g6IHR5cGVvZiBmZXRjaDtcblxuICBwcml2YXRlIHJlYWRvbmx5IGNhY2hlID0gbmV3IFRva2VuQ2FjaGUoKTtcbiAgcHJpdmF0ZSByZWFkb25seSBmYXBpQ2xpZW50OiBGYXBpQ2xpZW50O1xuICBwcml2YXRlIHJlZnJlc2hUaW1lcjogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCBudWxsID0gbnVsbDtcblxuICBwcml2YXRlIHJlYWRvbmx5IGNhdGFsb2c6IENhdGFsb2c7XG5cbiAgLyoqXG4gICAqIEEgc2lnbi1pbiBhdHRlbXB0IGhhbmRlZCBiYWNrIGJ5IGFuIE9BdXRoIHJlZGlyZWN0IHRoYXQgc3RpbGwgbmVlZHMgYSBzZWNvbmRcbiAgICogZmFjdG9yIChubyBzZXNzaW9uIHdhcyBpc3N1ZWQpLiBOdWxsIGluIHRoZSBvcmRpbmFyeSBjYXNlOyB0aGUgYDxhdGxhcy1zaWduLWluPmBcbiAgICogZmxvdyBzZWVkcyBpdHNlbGYgZnJvbSB0aGlzIHNvIHRoZSB1c2VyIHJlc3VtZXMgYXQgdGhlIDJGQSBzdGVwLiBDYXB0dXJlZFxuICAgKiBvbmNlLCBzeW5jaHJvbm91c2x5LCBhdCBjb25zdHJ1Y3Rpb24g4oCUIGJlZm9yZSBhbnkgZmxvdyBjb21wb25lbnQgcmVhZHMgaXQuXG4gICAqL1xuICByZWFkb25seSBwZW5kaW5nQXR0ZW1wdDogeyBpZDogc3RyaW5nOyBzdGF0dXM6IHN0cmluZyB9IHwgbnVsbDtcblxuICAvLyAtLS0gUmVhY3RpdmUgc3RhdGUgKHNvdXJjZSBvZiB0cnV0aCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgcHJpdmF0ZSByZWFkb25seSBfc3RhdHVzID0gbmV3IEJlaGF2aW9yU3ViamVjdDxBdXRoU3RhdHVzPignbG9hZGluZycpO1xuICBwcml2YXRlIHJlYWRvbmx5IF91c2VyID0gbmV3IEJlaGF2aW9yU3ViamVjdDxBdGxhc1VzZXIgfCBudWxsPihudWxsKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfc2Vzc2lvbiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8QXRsYXNTZXNzaW9uIHwgbnVsbD4obnVsbCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2NsYWltcyA9IG5ldyBCZWhhdmlvclN1YmplY3Q8U2Vzc2lvbkNsYWltcyB8IG51bGw+KG51bGwpO1xuICBwcml2YXRlIHJlYWRvbmx5IF9tZW1iZXJzaGlwcyA9IG5ldyBCZWhhdmlvclN1YmplY3Q8QXRsYXNPcmdhbml6YXRpb25NZW1iZXJzaGlwW10+KFtdKTtcblxuICAvKiogVGhlIHRocmVlLXN0YXRlIGF1dGggbGlmZWN5Y2xlOiBgbG9hZGluZ2Ag4oaSIGBzaWduZWRfaW5gIHwgYHNpZ25lZF9vdXRgLiAqL1xuICByZWFkb25seSBzdGF0dXMkOiBPYnNlcnZhYmxlPEF1dGhTdGF0dXM+ID0gdGhpcy5fc3RhdHVzLmFzT2JzZXJ2YWJsZSgpO1xuICByZWFkb25seSB1c2VyJDogT2JzZXJ2YWJsZTxBdGxhc1VzZXIgfCBudWxsPiA9IHRoaXMuX3VzZXIuYXNPYnNlcnZhYmxlKCk7XG4gIHJlYWRvbmx5IHNlc3Npb24kOiBPYnNlcnZhYmxlPEF0bGFzU2Vzc2lvbiB8IG51bGw+ID0gdGhpcy5fc2Vzc2lvbi5hc09ic2VydmFibGUoKTtcbiAgcmVhZG9ubHkgY2xhaW1zJDogT2JzZXJ2YWJsZTxTZXNzaW9uQ2xhaW1zIHwgbnVsbD4gPSB0aGlzLl9jbGFpbXMuYXNPYnNlcnZhYmxlKCk7XG4gIHJlYWRvbmx5IG1lbWJlcnNoaXBzJDogT2JzZXJ2YWJsZTxBdGxhc09yZ2FuaXphdGlvbk1lbWJlcnNoaXBbXT4gPVxuICAgIHRoaXMuX21lbWJlcnNoaXBzLmFzT2JzZXJ2YWJsZSgpO1xuXG4gIC8qKlxuICAgKiBUcnVlIG9uY2UgdGhlIFNESyBoYXMgZmluaXNoZWQgaXRzIGZpcnN0IGJvb3QuIERpc3Rpbmd1aXNoaW5nIFwic3RpbGwgbG9hZGluZ1wiXG4gICAqIGZyb20gXCJzaWduZWQgb3V0XCIgaXMgd2hhdCBsZXRzIGEgdGVtcGxhdGUgYXZvaWQgdGhlIGZsYXNoIG9mIGEgc2lnbi1pbiBmb3JtXG4gICAqIG9uIGV2ZXJ5IHBhZ2UgbG9hZC5cbiAgICovXG4gIHJlYWRvbmx5IGlzTG9hZGVkJDogT2JzZXJ2YWJsZTxib29sZWFuPiA9IHRoaXMuc3RhdHVzJC5waXBlKFxuICAgIG1hcCgocykgPT4gcyAhPT0gJ2xvYWRpbmcnKSxcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICApO1xuXG4gIHJlYWRvbmx5IGlzU2lnbmVkSW4kOiBPYnNlcnZhYmxlPGJvb2xlYW4+ID0gdGhpcy5zdGF0dXMkLnBpcGUoXG4gICAgbWFwKChzKSA9PiBzID09PSAnc2lnbmVkX2luJyksXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgKTtcblxuICAvKiogVGhlIGFjdGl2ZSBvcmdhbml6YXRpb24gbWVtYmVyc2hpcCwgZGVyaXZlZCBmcm9tIHRoZSB0b2tlbidzIGBvcmdfaWRgIGNsYWltLiAqL1xuICByZWFkb25seSBvcmdhbml6YXRpb24kOiBPYnNlcnZhYmxlPEF0bGFzT3JnYW5pemF0aW9uTWVtYmVyc2hpcCB8IG51bGw+ID0gY29tYmluZUxhdGVzdChbXG4gICAgdGhpcy5fbWVtYmVyc2hpcHMsXG4gICAgdGhpcy5fY2xhaW1zLFxuICBdKS5waXBlKFxuICAgIG1hcChcbiAgICAgIChbbWVtYmVyc2hpcHMsIGNsYWltc10pID0+XG4gICAgICAgIG1lbWJlcnNoaXBzLmZpbmQoKG0pID0+IG0ub3JnYW5pemF0aW9uLmlkID09PSBjbGFpbXM/Lm9yZ19pZCkgPz8gbnVsbCxcbiAgICApLFxuICApO1xuXG4gIC8vIC0tLSBTaWduYWwgbWlycm9yIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICByZWFkb25seSBzdGF0dXM6IFNpZ25hbDxBdXRoU3RhdHVzPiA9IHRvU2lnbmFsKHRoaXMuc3RhdHVzJCwgeyBpbml0aWFsVmFsdWU6ICdsb2FkaW5nJyB9KTtcbiAgcmVhZG9ubHkgdXNlcjogU2lnbmFsPEF0bGFzVXNlciB8IG51bGw+ID0gdG9TaWduYWwodGhpcy51c2VyJCwgeyBpbml0aWFsVmFsdWU6IG51bGwgfSk7XG4gIHJlYWRvbmx5IHNlc3Npb246IFNpZ25hbDxBdGxhc1Nlc3Npb24gfCBudWxsPiA9IHRvU2lnbmFsKHRoaXMuc2Vzc2lvbiQsIHsgaW5pdGlhbFZhbHVlOiBudWxsIH0pO1xuICByZWFkb25seSBjbGFpbXM6IFNpZ25hbDxTZXNzaW9uQ2xhaW1zIHwgbnVsbD4gPSB0b1NpZ25hbCh0aGlzLmNsYWltcyQsIHsgaW5pdGlhbFZhbHVlOiBudWxsIH0pO1xuICByZWFkb25seSBtZW1iZXJzaGlwczogU2lnbmFsPEF0bGFzT3JnYW5pemF0aW9uTWVtYmVyc2hpcFtdPiA9IHRvU2lnbmFsKHRoaXMubWVtYmVyc2hpcHMkLCB7XG4gICAgaW5pdGlhbFZhbHVlOiBbXSBhcyBBdGxhc09yZ2FuaXphdGlvbk1lbWJlcnNoaXBbXSxcbiAgfSk7XG4gIHJlYWRvbmx5IGlzTG9hZGVkOiBTaWduYWw8Ym9vbGVhbj4gPSBjb21wdXRlZCgoKSA9PiB0aGlzLnN0YXR1cygpICE9PSAnbG9hZGluZycpO1xuICByZWFkb25seSBpc1NpZ25lZEluOiBTaWduYWw8Ym9vbGVhbj4gPSBjb21wdXRlZCgoKSA9PiB0aGlzLnN0YXR1cygpID09PSAnc2lnbmVkX2luJyk7XG4gIHJlYWRvbmx5IG9yZ2FuaXphdGlvbjogU2lnbmFsPEF0bGFzT3JnYW5pemF0aW9uTWVtYmVyc2hpcCB8IG51bGw+ID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IG9yZ0lkID0gdGhpcy5jbGFpbXMoKT8ub3JnX2lkO1xuICAgIHJldHVybiB0aGlzLm1lbWJlcnNoaXBzKCkuZmluZCgobSkgPT4gbS5vcmdhbml6YXRpb24uaWQgPT09IG9yZ0lkKSA/PyBudWxsO1xuICB9KTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBjb25zdCBvcHRpb25zID0gdGhpcy5vcHRpb25zO1xuICAgIHRoaXMucHVibGlzaGFibGVLZXkgPSBvcHRpb25zLnB1Ymxpc2hhYmxlS2V5O1xuICAgIHRoaXMuYmFzZVVybCA9IG9wdGlvbnMuZnJvbnRlbmRBcGkgPz8gJyc7XG4gICAgdGhpcy5kb0ZldGNoID0gb3B0aW9ucy5mZXRjaEltcGwgPz8gKCguLi5hcmdzOiBQYXJhbWV0ZXJzPHR5cGVvZiBmZXRjaD4pID0+IGZldGNoKC4uLmFyZ3MpKTtcblxuICAgIHRoaXMuY2F0YWxvZyA9IG9wdGlvbnMubG9jYWxpemF0aW9uID8gd2l0aEZhbGxiYWNrKG9wdGlvbnMubG9jYWxpemF0aW9uKSA6IEVOX1VTO1xuXG4gICAgdGhpcy5mYXBpQ2xpZW50ID0gbmV3IEZhcGlDbGllbnQoe1xuICAgICAgcHVibGlzaGFibGVLZXk6IHRoaXMucHVibGlzaGFibGVLZXksXG4gICAgICBiYXNlVXJsOiB0aGlzLmJhc2VVcmwsXG4gICAgICBmZXRjaEltcGw6IHRoaXMuZG9GZXRjaCxcbiAgICB9KTtcblxuICAgIC8vIENhcHR1cmVkIHN5bmNocm9ub3VzbHkgKG5vdCBpbiBhbiBhc3luYyBpbml0KSBzbyBpdCBpcyBhdmFpbGFibGUgYmVmb3JlIGFueVxuICAgIC8vIGZsb3cgY29tcG9uZW50IHJlYWRzIGl0OiBhIG5lZWRzX3NlY29uZF9mYWN0b3IgcmVkaXJlY3QgY2FycmllcyBhIHN0YXR1cyBidXRcbiAgICAvLyBubyB0aWNrZXQsIGFuZCB0aGF0IGlzIHdoYXQgdGhlIDJGQSByZXN1bWUgc2VlZHMgZnJvbS5cbiAgICB0aGlzLnBlbmRpbmdBdHRlbXB0ID0gdGhpcy5pc0Jyb3dzZXIgPyB0aGlzLnJlYWRQZW5kaW5nQXR0ZW1wdCgpIDogbnVsbDtcblxuICAgIC8vIEJvb3Qgb25jZSwgYnJvd3NlciBvbmx5LiBPbiB0aGUgc2VydmVyIHRoZXJlIGlzIG5vIGNvb2tpZSBqYXIgdG8gcmVhZCBhXG4gICAgLy8gc2Vzc2lvbiBmcm9tLCBzbyB3ZSBsZWF2ZSB0aGUgc3RhdGUgYXQgYGxvYWRpbmdgIGFuZCBsZXQgaHlkcmF0aW9uIGJvb3QgaXQuXG4gICAgaWYgKHRoaXMuaXNCcm93c2VyKSB7XG4gICAgICB2b2lkIHRoaXMuYm9vdCgpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuY2xlYXJSZWZyZXNoVGltZXIoKTtcbiAgICB0aGlzLl9zdGF0dXMuY29tcGxldGUoKTtcbiAgICB0aGlzLl91c2VyLmNvbXBsZXRlKCk7XG4gICAgdGhpcy5fc2Vzc2lvbi5jb21wbGV0ZSgpO1xuICAgIHRoaXMuX2NsYWltcy5jb21wbGV0ZSgpO1xuICAgIHRoaXMuX21lbWJlcnNoaXBzLmNvbXBsZXRlKCk7XG4gIH1cblxuICAvLyAtLS0gQ29uZmlndXJhdGlvbiBhY2Nlc3NvcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgZ2V0IGFwcGVhcmFuY2UoKTogQXBwZWFyYW5jZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5hcHBlYXJhbmNlO1xuICB9XG5cbiAgZ2V0IGxvY2FsaXphdGlvbigpOiBDYXRhbG9nIHtcbiAgICByZXR1cm4gdGhpcy5jYXRhbG9nO1xuICB9XG5cbiAgZ2V0IGZyb250ZW5kQXBpKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuYmFzZVVybDtcbiAgfVxuXG4gIC8qKiBUb2tlbnMgYXMgQ1NTIGN1c3RvbSBwcm9wZXJ0aWVzLCBmb3IgYSBob3N0IGVsZW1lbnQgdG8gaW5oZXJpdC4gKi9cbiAgYXBwZWFyYW5jZVZhcmlhYmxlcygpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgICByZXR1cm4gY3NzVmFyaWFibGVzKHJlc29sdmVUb2tlbnModGhpcy5vcHRpb25zLmFwcGVhcmFuY2UpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgZnVsbCBhcHBlYXJhbmNlIHJlbmRlciBmb3IgYSByb290IGVsZW1lbnQ6IGlubGluZSB2YXJpYWJsZXMsIHRoZVxuICAgKiBgZGF0YS1hdGxhcy0qYCBhdHRyaWJ1dGVzIGFuZCB0aGUgZGVzaWduIHN0eWxlc2hlZXQuIFBhc3MgdGhlIGRhc2hib2FyZFxuICAgKiBkZXNpZ24gKGZyb20ge0BsaW5rIGxvYWRJbnN0YW5jZURlc2lnbn0pIHRvIGxheWVyIGNvZGUgb3ZlcnJpZGVzIG9uIGl0IOKAlFxuICAgKiB0aGUgc2FtZSBzZW1hbnRpY3MgYXMgYEBhdGxhc2F1dGgvcmVhY3RgLlxuICAgKi9cbiAgYXBwZWFyYW5jZVJlbmRlcihpbnN0YW5jZURlc2lnbj86IEluc3RhbmNlRGVzaWduIHwgbnVsbCk6IEFwcGVhcmFuY2VSZW5kZXIge1xuICAgIHJldHVybiByZW5kZXJBcHBlYXJhbmNlKHRoaXMub3B0aW9ucy5hcHBlYXJhbmNlLCBpbnN0YW5jZURlc2lnbiA/PyBudWxsLCB7XG4gICAgICBmcm9udGVuZEFwaTogdGhpcy5iYXNlVXJsLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBkZXNpZ24gY29uZmlndXJlZCBpbiB0aGUgQXRsYXMgZGFzaGJvYXJkIChgR0VUIC92MS9hcHBlYXJhbmNlYCksIG9yIG51bGxcbiAgICogd2hlbiB0aGVyZSBpcyBub25lLCBpdCBjYW5ub3QgYmUgcmVhZCwgb3IgdGhlIGFwcCBvcHRlZCBvdXQgd2l0aFxuICAgKiBgYXBwZWFyYW5jZS5pbnN0YW5jZURlc2lnbjogZmFsc2VgLlxuICAgKi9cbiAgYXN5bmMgbG9hZEluc3RhbmNlRGVzaWduKCk6IFByb21pc2U8SW5zdGFuY2VEZXNpZ24gfCBudWxsPiB7XG4gICAgaWYgKHRoaXMub3B0aW9ucy5hcHBlYXJhbmNlPy5pbnN0YW5jZURlc2lnbiA9PT0gZmFsc2UpIHJldHVybiBudWxsO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuY2FsbCgnL3YxL2FwcGVhcmFuY2UnKTtcbiAgICAgIHJldHVybiByZXNwb25zZS5vayA/IGluc3RhbmNlRGVzaWduRnJvbShhd2FpdCByZXNwb25zZS5qc29uKCkpIDogbnVsbDtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBBIGZyZXNoIHtAbGluayBGYXBpQ2xpZW50fSBmb3IgZHJpdmluZyBhIHNpZ24taW4vc2lnbi11cCBmbG93LiAqL1xuICBjcmVhdGVGYXBpQ2xpZW50KCk6IEZhcGlDbGllbnQge1xuICAgIHJldHVybiBuZXcgRmFwaUNsaWVudCh7IHB1Ymxpc2hhYmxlS2V5OiB0aGlzLnB1Ymxpc2hhYmxlS2V5LCBiYXNlVXJsOiB0aGlzLmJhc2VVcmwgfSk7XG4gIH1cblxuICAvLyAtLS0gSW1wZXJhdGl2ZSBBUEkgKG1pcnJvcnMgdGhlIFJlYWN0IGhvb2tzJyBhY3Rpb25zKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgLyoqXG4gICAqIFRoZSBjdXJyZW50IHNlc3Npb24ncyBKV1QsIGFsd2F5cyBmcmVzaDogaWYgdGhlIGNhY2hlZCB0b2tlbiBpcyB3aXRoaW4gNXMgb2ZcbiAgICogZXhwaXJ5IGl0IGlzIHJlZnJlc2hlZCBmaXJzdCByYXRoZXIgdGhhbiBoYW5kZWQgb3Zlci4gTnVsbCB3aGVuIHNpZ25lZCBvdXQuXG4gICAqL1xuICBhc3luYyBnZXRUb2tlbigpOiBQcm9taXNlPHN0cmluZyB8IG51bGw+IHtcbiAgICBjb25zdCB1c2FibGUgPSB0aGlzLmNhY2hlLmdldCg1XzAwMCk7XG4gICAgaWYgKHVzYWJsZSkgcmV0dXJuIHVzYWJsZS5qd3Q7XG5cbiAgICBhd2FpdCB0aGlzLnJlZnJlc2goKTtcbiAgICByZXR1cm4gdGhpcy5jYWNoZS5nZXQoNV8wMDApPy5qd3QgPz8gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgc2lnbmVkLWluIHVzZXIncyBPV04gbGl2ZSBhY2Nlc3MgdG9rZW4gYXQgYSBjb25uZWN0ZWQgcHJvdmlkZXIgKEdvb2dsZSxcbiAgICogR2l0SHViLCDigKYpLCBzbyB0aGUgYXBwIGNhbiBjYWxsIHRoYXQgcHJvdmlkZXIncyBBUEkgZnJvbSB0aGUgYnJvd3Nlci4gTnVsbFxuICAgKiB3aGVuIHRoZXJlIGlzIG5vIHVzYWJsZSB0b2tlbiDigJQgbm8gbGlua2VkIGFjY291bnQsIG9yIHRoZSBwcm92aWRlciBncmFudGVkIC9cbiAgICoga2VwdCBub25lLiBUaGUgc2VydmVyIHJlZnJlc2hlcyBhIHN0YWxlIHRva2VuIG9uIHJlYWQ7IHRoZSByZWZyZXNoIHRva2VuIGlzXG4gICAqIG5ldmVyIGV4cG9zZWQuXG4gICAqL1xuICBnZXRQcm92aWRlclRva2VuKHByb3ZpZGVyOiBzdHJpbmcpOiBQcm9taXNlPFByb3ZpZGVyVG9rZW4gfCBudWxsPiB7XG4gICAgcmV0dXJuIGZldGNoUHJvdmlkZXJUb2tlbih0aGlzLmZhcGlDbGllbnQsIHByb3ZpZGVyKTtcbiAgfVxuXG4gIC8qKiBJbXBlcmF0aXZlIGBoYXMoKWAg4oCUIHRoZSBzYW1lIGV2YWx1YXRpb24gYCphdGxhc1Byb3RlY3RgIHJlbmRlcnMgb24uICovXG4gIGhhcyhjb25kaXRpb246IFByb3RlY3RDb25kaXRpb24pOiBib29sZWFuIHtcbiAgICByZXR1cm4gZXZhbHVhdGUodGhpcy5fY2xhaW1zLnZhbHVlLCBjb25kaXRpb24pLmFsbG93ZWQ7XG4gIH1cblxuICAvKiogUmV2b2tlIHRoZSBjdXJyZW50IHNlc3Npb24gc2VydmVyLXNpZGUgYW5kIGRyb3AgYWxsIGxvY2FsIGF1dGggc3RhdGUuICovXG4gIGFzeW5jIHNpZ25PdXQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgY3VycmVudCA9IHRoaXMuY2FjaGUucGVlaygpO1xuICAgIGlmIChjdXJyZW50KSB7XG4gICAgICBhd2FpdCB0aGlzLmNhbGwoYC92MS9jbGllbnQvc2Vzc2lvbnMvJHtjdXJyZW50LnNlc3Npb25JZH0vcmV2b2tlYCwge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIH0pLmNhdGNoKCgpID0+IHVuZGVmaW5lZCk7XG4gICAgfVxuICAgIHRoaXMuY2xlYXJSZWZyZXNoVGltZXIoKTtcbiAgICB0aGlzLmNhY2hlLmNsZWFyKCk7XG4gICAgdGhpcy5fc3RhdHVzLm5leHQoJ3NpZ25lZF9vdXQnKTtcbiAgICB0aGlzLl91c2VyLm5leHQobnVsbCk7XG4gICAgdGhpcy5fc2Vzc2lvbi5uZXh0KG51bGwpO1xuICAgIHRoaXMuX2NsYWltcy5uZXh0KG51bGwpO1xuICAgIHRoaXMuX21lbWJlcnNoaXBzLm5leHQoW10pO1xuICB9XG5cbiAgLyoqXG4gICAqIFN3aXRjaCB0aGUgYWN0aXZlIG9yZ2FuaXphdGlvbiAob3IgYG51bGxgIGZvciB0aGUgcGVyc29uYWwgYWNjb3VudCkuIFRoZVxuICAgKiBuZXcgdG9rZW4gY2FycmllcyB0aGUgbmV3IG9yZyBjbGFpbXMsIHNvIHRoZSBhcHAncyBwZXJtaXNzaW9uIGNoZWNrcyB1cGRhdGVcbiAgICogd2l0aG91dCBhIHJlLWxvZ2luLlxuICAgKi9cbiAgYXN5bmMgc2V0QWN0aXZlT3JnYW5pemF0aW9uKG9yZ2FuaXphdGlvbklkOiBzdHJpbmcgfCBudWxsKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgY3VycmVudCA9IHRoaXMuY2FjaGUucGVlaygpO1xuICAgIGlmICghY3VycmVudCkgcmV0dXJuO1xuXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmNhbGwoYC92MS9jbGllbnQvc2Vzc2lvbnMvJHtjdXJyZW50LnNlc3Npb25JZH0vdG91Y2hgLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgYWN0aXZlX29yZ2FuaXphdGlvbl9pZDogb3JnYW5pemF0aW9uSWQgfSksXG4gICAgfSk7XG4gICAgaWYgKCFyZXNwb25zZS5vaykgcmV0dXJuO1xuXG4gICAgY29uc3QgYm9keSA9IChhd2FpdCByZXNwb25zZS5qc29uKCkpIGFzIHsgand0OiBzdHJpbmcgfTtcbiAgICB0aGlzLmFwcGx5VG9rZW4oYm9keS5qd3QsIGN1cnJlbnQuc2Vzc2lvbklkKTtcbiAgICBhd2FpdCB0aGlzLnJlbG9hZCgpO1xuICB9XG5cbiAgLyoqIFJlLXJlYWQgYC92MS9jbGllbnRgOiByZWZyZXNoIHVzZXIsIHNlc3Npb24sIG1lbWJlcnNoaXBzIGFuZCBzdGF0dXMuICovXG4gIGFzeW5jIHJlbG9hZCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmNhbGwoJy92MS9jbGllbnQnKTtcbiAgICAgIGlmICghcmVzcG9uc2Uub2spIHRocm93IG5ldyBFcnJvcignYm9vdCBmYWlsZWQnKTtcblxuICAgICAgY29uc3QgYm9keSA9IChhd2FpdCByZXNwb25zZS5qc29uKCkpIGFzIHtcbiAgICAgICAgc2Vzc2lvbjogQXRsYXNTZXNzaW9uIHwgbnVsbDtcbiAgICAgICAgdXNlcjogQXRsYXNVc2VyIHwgbnVsbDtcbiAgICAgICAgand0Pzogc3RyaW5nO1xuICAgICAgICBvcmdhbml6YXRpb25fbWVtYmVyc2hpcHM/OiBBdGxhc09yZ2FuaXphdGlvbk1lbWJlcnNoaXBbXTtcbiAgICAgIH07XG5cbiAgICAgIGlmICghYm9keS5zZXNzaW9uIHx8ICFib2R5LnVzZXIpIHtcbiAgICAgICAgdGhpcy5jbGVhclJlZnJlc2hUaW1lcigpO1xuICAgICAgICB0aGlzLmNhY2hlLmNsZWFyKCk7XG4gICAgICAgIHRoaXMuX3N0YXR1cy5uZXh0KCdzaWduZWRfb3V0Jyk7XG4gICAgICAgIHRoaXMuX3VzZXIubmV4dChudWxsKTtcbiAgICAgICAgdGhpcy5fc2Vzc2lvbi5uZXh0KG51bGwpO1xuICAgICAgICB0aGlzLl9jbGFpbXMubmV4dChudWxsKTtcbiAgICAgICAgdGhpcy5fbWVtYmVyc2hpcHMubmV4dChbXSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fdXNlci5uZXh0KGJvZHkudXNlcik7XG4gICAgICB0aGlzLl9zZXNzaW9uLm5leHQoYm9keS5zZXNzaW9uKTtcbiAgICAgIHRoaXMuX21lbWJlcnNoaXBzLm5leHQoYm9keS5vcmdhbml6YXRpb25fbWVtYmVyc2hpcHMgPz8gW10pO1xuICAgICAgaWYgKGJvZHkuand0KSB0aGlzLmFwcGx5VG9rZW4oYm9keS5qd3QsIGJvZHkuc2Vzc2lvbi5pZCk7XG4gICAgICB0aGlzLl9zdGF0dXMubmV4dCgnc2lnbmVkX2luJyk7XG4gICAgICB0aGlzLnNjaGVkdWxlUmVmcmVzaCgpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gQSBmYWlsZWQgYm9vdCBpcyBOT1Qgc2lnbmVkLW91dC4gUmVuZGVyaW5nIGEgc2lnbi1pbiBmb3JtIGJlY2F1c2UgdGhlXG4gICAgICAvLyBuZXR3b3JrIGhpY2N1cGVkIHRocm93cyBhd2F5IGEgcGVyZmVjdGx5IGdvb2Qgc2Vzc2lvbiBhbmQgZm9yY2VzIGFcbiAgICAgIC8vIG5lZWRsZXNzIHJlLWF1dGhlbnRpY2F0aW9uLiBPbmx5IHByb21vdGUgbG9hZGluZyDihpIgc2lnbmVkX291dC5cbiAgICAgIGlmICh0aGlzLl9zdGF0dXMudmFsdWUgPT09ICdsb2FkaW5nJykgdGhpcy5fc3RhdHVzLm5leHQoJ3NpZ25lZF9vdXQnKTtcbiAgICB9XG4gIH1cblxuICAvLyAtLS0gSW50ZXJuYWxzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgLyoqXG4gICAqIMKnNi4zIHN0ZXAgMzogY29tcGxldGUgYSByZWRpcmVjdC1iYXNlZCBzaWduLWluLCB0aGVuIGJvb3QuIEFuIE9BdXRoIG9yXG4gICAqIGhvc3RlZC1wYWdlIGZsb3cgbGFuZHMgYmFjayB3aXRoIGEgb25lLXRpbWUgdGlja2V0IGluIHRoZSBVUkw7IGV4Y2hhbmdlIGl0XG4gICAqIGZvciBjb29raWVzLCBzY3J1YiB0aGUgVVJMIHNvIGEgcmVsb2FkIGNhbm5vdCByZXBsYXkgaXQsIFRIRU4gcmVhZCB0aGVcbiAgICogc2Vzc2lvbi4gQSByZWRpcmVjdCBjYXJyeWluZyBvbmx5IGEgc3RhdHVzIChhIHNlY29uZCBmYWN0b3IgaXMgc3RpbGwgb3dlZClcbiAgICogaGFzIG5vIHRpY2tldCwgc28gbm90aGluZyBpcyBleGNoYW5nZWQgYW5kIHRoZSBhcHAgYm9vdHMgc2lnbmVkLW91dC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgYm9vdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCByZXN1bHQgPSByZWFkUmVkaXJlY3RSZXN1bHQod2luZG93LmxvY2F0aW9uLnNlYXJjaCk7XG5cbiAgICBpZiAocmVzdWx0Py50aWNrZXQpIHtcbiAgICAgIGF3YWl0IHRoaXMuY2FsbCgnL3YxL2NsaWVudC90aWNrZXRzL2V4Y2hhbmdlJywge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBhdHRlbXB0X2lkOiByZXN1bHQuYXR0ZW1wdElkLCB0aWNrZXQ6IHJlc3VsdC50aWNrZXQgfSksXG4gICAgICB9KS5jYXRjaCgoKSA9PiB1bmRlZmluZWQpO1xuICAgIH1cbiAgICBpZiAocmVzdWx0KSB7XG4gICAgICB3aW5kb3cuaGlzdG9yeS5yZXBsYWNlU3RhdGUoe30sIGRvY3VtZW50LnRpdGxlLCBzdHJpcFJlZGlyZWN0UGFyYW1zKHdpbmRvdy5sb2NhdGlvbi5ocmVmKSk7XG4gICAgfVxuICAgIGF3YWl0IHRoaXMucmVsb2FkKCk7XG4gIH1cblxuICBwcml2YXRlIHJlYWRQZW5kaW5nQXR0ZW1wdCgpOiB7IGlkOiBzdHJpbmc7IHN0YXR1czogc3RyaW5nIH0gfCBudWxsIHtcbiAgICBjb25zdCByZXN1bHQgPSByZWFkUmVkaXJlY3RSZXN1bHQod2luZG93LmxvY2F0aW9uLnNlYXJjaCk7XG4gICAgcmV0dXJuIHJlc3VsdD8uc3RhdHVzICYmICFyZXN1bHQudGlja2V0XG4gICAgICA/IHsgaWQ6IHJlc3VsdC5hdHRlbXB0SWQsIHN0YXR1czogcmVzdWx0LnN0YXR1cyB9XG4gICAgICA6IG51bGw7XG4gIH1cblxuICBwcml2YXRlIGNhbGwocGF0aDogc3RyaW5nLCBpbml0PzogUmVxdWVzdEluaXQpOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuZG9GZXRjaChgJHt0aGlzLmJhc2VVcmx9JHtwYXRofWAsIHtcbiAgICAgIC4uLmluaXQsXG4gICAgICAvLyBDb29raWVzIGNhcnJ5IHRoZSBzZXNzaW9uOyBhIHJlcXVlc3Qgd2l0aG91dCB0aGlzIGlzIGluZGlzdGluZ3Vpc2hhYmxlXG4gICAgICAvLyBmcm9tIGJlaW5nIHNpZ25lZCBvdXQuXG4gICAgICBjcmVkZW50aWFsczogJ2luY2x1ZGUnLFxuICAgICAgaGVhZGVyczoge1xuICAgICAgICAneC1wdWJsaXNoYWJsZS1rZXknOiB0aGlzLnB1Ymxpc2hhYmxlS2V5LFxuICAgICAgICAuLi4oaW5pdD8uYm9keSA/IHsgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9IDoge30pLFxuICAgICAgICAuLi5pbml0Py5oZWFkZXJzLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXBwbHlUb2tlbihqd3Q6IHN0cmluZywgc2Vzc2lvbklkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBleHBpcmVzQXQgPSByZWFkRXhwaXJ5KGp3dCk7XG4gICAgaWYgKCFleHBpcmVzQXQpIHJldHVybjtcblxuICAgIHRoaXMuY2FjaGUuc2V0KHsgand0LCBleHBpcmVzQXQsIHNlc3Npb25JZCB9KTtcbiAgICB0aGlzLl9jbGFpbXMubmV4dChkZWNvZGVDbGFpbXMoand0KSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJlZnJlc2goKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgY3VycmVudCA9IHRoaXMuY2FjaGUucGVlaygpO1xuICAgIGlmICghY3VycmVudCkgcmV0dXJuO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5jYWxsKGAvdjEvY2xpZW50L3Nlc3Npb25zLyR7Y3VycmVudC5zZXNzaW9uSWR9L3Rva2Vuc2AsIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICB9KTtcbiAgICAgIGlmICghcmVzcG9uc2Uub2spIHRocm93IG5ldyBFcnJvcigncmVmcmVzaCBmYWlsZWQnKTtcblxuICAgICAgY29uc3QgYm9keSA9IChhd2FpdCByZXNwb25zZS5qc29uKCkpIGFzIHsgand0OiBzdHJpbmc7IHNlc3Npb25faWQ6IHN0cmluZyB9O1xuICAgICAgdGhpcy5hcHBseVRva2VuKGJvZHkuand0LCBib2R5LnNlc3Npb25faWQpO1xuICAgICAgdGhpcy5zY2hlZHVsZVJlZnJlc2goKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIFRoZSBzZXNzaW9uIG1heSBnZW51aW5lbHkgYmUgZ29uZS4gUmUtYm9vdCByYXRoZXIgdGhhbiBndWVzcy5cbiAgICAgIGF3YWl0IHRoaXMucmVsb2FkKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqIMKnNy40OiBwcm9hY3RpdmUsIGppdHRlcmVkIHJlZnJlc2ggc2NoZWR1bGVkIGZyb20gdGhlIHRva2VuJ3Mgb3duIGV4cGlyeS4gKi9cbiAgcHJpdmF0ZSBzY2hlZHVsZVJlZnJlc2goKTogdm9pZCB7XG4gICAgdGhpcy5jbGVhclJlZnJlc2hUaW1lcigpO1xuICAgIGlmICh0aGlzLl9zdGF0dXMudmFsdWUgIT09ICdzaWduZWRfaW4nKSByZXR1cm47XG5cbiAgICBjb25zdCB0b2tlbiA9IHRoaXMuY2FjaGUucGVlaygpO1xuICAgIGlmICghdG9rZW4pIHJldHVybjtcblxuICAgIGNvbnN0IGRlbGF5ID0gbXNVbnRpbFJlZnJlc2goeyB0b2tlbiwgbm93OiBEYXRlLm5vdygpIH0pO1xuICAgIHRoaXMucmVmcmVzaFRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB2b2lkIHRoaXMucmVmcmVzaCgpLCBkZWxheSk7XG4gIH1cblxuICBwcml2YXRlIGNsZWFyUmVmcmVzaFRpbWVyKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnJlZnJlc2hUaW1lcikge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMucmVmcmVzaFRpbWVyKTtcbiAgICAgIHRoaXMucmVmcmVzaFRpbWVyID0gbnVsbDtcbiAgICB9XG4gIH1cbn1cblxuLyoqIERlY29kZSBhIEpXVCBwYXlsb2FkIHdpdGhvdXQgdmVyaWZ5aW5nIGl0IOKAlCBhIHNjaGVkdWxpbmcvVUkgaGludCBvbmx5LiAqL1xuZnVuY3Rpb24gZGVjb2RlQ2xhaW1zKGp3dDogc3RyaW5nKTogU2Vzc2lvbkNsYWltcyB8IG51bGwge1xuICBjb25zdCBwYXJ0cyA9IGp3dC5zcGxpdCgnLicpO1xuICBpZiAocGFydHMubGVuZ3RoICE9PSAzKSByZXR1cm4gbnVsbDtcbiAgdHJ5IHtcbiAgICByZXR1cm4gSlNPTi5wYXJzZShcbiAgICAgIGF0b2IocGFydHNbMV0hLnJlcGxhY2UoLy0vZywgJysnKS5yZXBsYWNlKC9fL2csICcvJykpLFxuICAgICkgYXMgU2Vzc2lvbkNsYWltcztcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cbiJdfQ==
@@ -1,4 +1,6 @@
1
- import { Directive, ElementRef, Renderer2, RendererStyleFlags2, inject, } from '@angular/core';
1
+ import { DOCUMENT, isPlatformBrowser } from '@angular/common';
2
+ import { Directive, ElementRef, PLATFORM_ID, Renderer2, inject } from '@angular/core';
3
+ import { applyAppearanceToDom } from '@atlasauth/design/runtime';
2
4
  import { AtlasService } from '../atlas.service';
3
5
  import * as i0 from "@angular/core";
4
6
  /**
@@ -16,18 +18,29 @@ import * as i0 from "@angular/core";
16
18
  * <router-outlet></router-outlet>
17
19
  * </div>
18
20
  * ```
21
+ *
22
+ * With a design (a code-level `appearance.preset` / `appearance.design`, or
23
+ * the dashboard design, fetched in the browser) the host also gets the stable
24
+ * `data-atlas-*` attributes and the design stylesheet is added to `<head>` once.
19
25
  */
20
26
  export class AtlasRootDirective {
21
27
  atlas = inject(AtlasService);
22
28
  el = inject(ElementRef);
23
29
  renderer = inject(Renderer2);
30
+ document = inject(DOCUMENT);
31
+ platformId = inject(PLATFORM_ID);
24
32
  ngOnInit() {
25
- this.renderer.addClass(this.el.nativeElement, 'atlas-root');
26
- const vars = this.atlas.appearanceVariables();
27
- for (const [name, value] of Object.entries(vars)) {
28
- // DashCase so a `--atlas-*` custom property is written verbatim, not camelCased.
29
- this.renderer.setStyle(this.el.nativeElement, name, value, RendererStyleFlags2.DashCase);
30
- }
33
+ const host = this.el.nativeElement;
34
+ this.renderer.addClass(host, 'atlas-root');
35
+ // Custom properties via `style.setProperty` (written verbatim, never camelCased).
36
+ let applied = applyAppearanceToDom(this.document, host, this.atlas.appearanceRender());
37
+ if (!isPlatformBrowser(this.platformId))
38
+ return;
39
+ void this.atlas.loadInstanceDesign().then((design) => {
40
+ if (!design)
41
+ return;
42
+ applied = applyAppearanceToDom(this.document, host, this.atlas.appearanceRender(design), applied);
43
+ });
31
44
  }
32
45
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AtlasRootDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
33
46
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.3.12", type: AtlasRootDirective, isStandalone: true, selector: "[atlasRoot]", ngImport: i0 });
@@ -39,4 +52,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
39
52
  standalone: true,
40
53
  }]
41
54
  }] });
42
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXRsYXMtcm9vdC5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2RpcmVjdGl2ZXMvYXRsYXMtcm9vdC5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxVQUFVLEVBRVYsU0FBUyxFQUNULG1CQUFtQixFQUNuQixNQUFNLEdBQ1AsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGtCQUFrQixDQUFDOztBQUVoRDs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFLSCxNQUFNLE9BQU8sa0JBQWtCO0lBQ1osS0FBSyxHQUFHLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUM3QixFQUFFLEdBQUcsTUFBTSxDQUEwQixVQUFVLENBQUMsQ0FBQztJQUNqRCxRQUFRLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBRTlDLFFBQVE7UUFDTixJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLGFBQWEsRUFBRSxZQUFZLENBQUMsQ0FBQztRQUM1RCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLG1CQUFtQixFQUFFLENBQUM7UUFDOUMsS0FBSyxNQUFNLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUNqRCxpRkFBaUY7WUFDakYsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxhQUFhLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxtQkFBbUIsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUMzRixDQUFDO0lBQ0gsQ0FBQzt3R0FaVSxrQkFBa0I7NEZBQWxCLGtCQUFrQjs7NEZBQWxCLGtCQUFrQjtrQkFKOUIsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsYUFBYTtvQkFDdkIsVUFBVSxFQUFFLElBQUk7aUJBQ2pCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgRGlyZWN0aXZlLFxuICBFbGVtZW50UmVmLFxuICBPbkluaXQsXG4gIFJlbmRlcmVyMixcbiAgUmVuZGVyZXJTdHlsZUZsYWdzMixcbiAgaW5qZWN0LFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEF0bGFzU2VydmljZSB9IGZyb20gJy4uL2F0bGFzLnNlcnZpY2UnO1xuXG4vKipcbiAqIGBhdGxhc1Jvb3RgIOKAlCBhcHBseSB0aGUgcmVzb2x2ZWQgYXBwZWFyYW5jZSBkZXNpZ24gdG9rZW5zIGFzIGAtLWF0bGFzLSpgIENTU1xuICogY3VzdG9tIHByb3BlcnRpZXMgKGFuZCB0aGUgYGF0bGFzLXJvb3RgIGNsYXNzKSBvbnRvIGl0cyBob3N0IGVsZW1lbnQsIHNvIHRoZVxuICogQXRsYXMgY29tcG9uZW50cyByZW5kZXJlZCBpbnNpZGUgaW5oZXJpdCB0aGVtLlxuICpcbiAqIFJlYWN0IGRvZXMgdGhpcyB3aXRoIHRoZSB3cmFwcGluZyBgPGRpdiBjbGFzc05hbWU9XCJhdGxhcy1yb290XCIgc3R5bGU9e+KApn0+YFxuICogaW5zaWRlIGA8QXRsYXNQcm92aWRlcj5gLiBBbmd1bGFyIGhhcyBubyBzaW5nbGUgd3JhcHBpbmcgZWxlbWVudCwgc28gYVxuICogY29uc3VtZXIgb3B0cyBpbiBieSBwdXR0aW5nIGBhdGxhc1Jvb3RgIG9uIHdoYXRldmVyIGVsZW1lbnQgZW5jbG9zZXMgdGhlXG4gKiBBdGxhcyBVSSAoY29tbW9ubHkgdGhlIGFwcCByb290KTpcbiAqXG4gKiBgYGBodG1sXG4gKiA8ZGl2IGF0bGFzUm9vdD5cbiAqICAgPHJvdXRlci1vdXRsZXQ+PC9yb3V0ZXItb3V0bGV0PlxuICogPC9kaXY+XG4gKiBgYGBcbiAqL1xuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnW2F0bGFzUm9vdF0nLFxuICBzdGFuZGFsb25lOiB0cnVlLFxufSlcbmV4cG9ydCBjbGFzcyBBdGxhc1Jvb3REaXJlY3RpdmUgaW1wbGVtZW50cyBPbkluaXQge1xuICBwcml2YXRlIHJlYWRvbmx5IGF0bGFzID0gaW5qZWN0KEF0bGFzU2VydmljZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgZWwgPSBpbmplY3Q8RWxlbWVudFJlZjxIVE1MRWxlbWVudD4+KEVsZW1lbnRSZWYpO1xuICBwcml2YXRlIHJlYWRvbmx5IHJlbmRlcmVyID0gaW5qZWN0KFJlbmRlcmVyMik7XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQsICdhdGxhcy1yb290Jyk7XG4gICAgY29uc3QgdmFycyA9IHRoaXMuYXRsYXMuYXBwZWFyYW5jZVZhcmlhYmxlcygpO1xuICAgIGZvciAoY29uc3QgW25hbWUsIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyh2YXJzKSkge1xuICAgICAgLy8gRGFzaENhc2Ugc28gYSBgLS1hdGxhcy0qYCBjdXN0b20gcHJvcGVydHkgaXMgd3JpdHRlbiB2ZXJiYXRpbSwgbm90IGNhbWVsQ2FzZWQuXG4gICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuZWwubmF0aXZlRWxlbWVudCwgbmFtZSwgdmFsdWUsIFJlbmRlcmVyU3R5bGVGbGFnczIuRGFzaENhc2UpO1xuICAgIH1cbiAgfVxufVxuIl19
55
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXRsYXMtcm9vdC5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2RpcmVjdGl2ZXMvYXRsYXMtcm9vdC5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzlELE9BQU8sRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFVLFdBQVcsRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzlGLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQzs7QUFFaEQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FtQkc7QUFLSCxNQUFNLE9BQU8sa0JBQWtCO0lBQ1osS0FBSyxHQUFHLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUM3QixFQUFFLEdBQUcsTUFBTSxDQUEwQixVQUFVLENBQUMsQ0FBQztJQUNqRCxRQUFRLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQzdCLFFBQVEsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDNUIsVUFBVSxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUVsRCxRQUFRO1FBQ04sTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUM7UUFDbkMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBQzNDLGtGQUFrRjtRQUNsRixJQUFJLE9BQU8sR0FBRyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLGdCQUFnQixFQUFFLENBQUMsQ0FBQztRQUN2RixJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQztZQUFFLE9BQU87UUFDaEQsS0FBSyxJQUFJLENBQUMsS0FBSyxDQUFDLGtCQUFrQixFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7WUFDbkQsSUFBSSxDQUFDLE1BQU07Z0JBQUUsT0FBTztZQUNwQixPQUFPLEdBQUcsb0JBQW9CLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNwRyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7d0dBakJVLGtCQUFrQjs0RkFBbEIsa0JBQWtCOzs0RkFBbEIsa0JBQWtCO2tCQUo5QixTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxhQUFhO29CQUN2QixVQUFVLEVBQUUsSUFBSTtpQkFDakIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBET0NVTUVOVCwgaXNQbGF0Zm9ybUJyb3dzZXIgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgRGlyZWN0aXZlLCBFbGVtZW50UmVmLCBPbkluaXQsIFBMQVRGT1JNX0lELCBSZW5kZXJlcjIsIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgYXBwbHlBcHBlYXJhbmNlVG9Eb20gfSBmcm9tICdAYXRsYXNhdXRoL2Rlc2lnbi9ydW50aW1lJztcbmltcG9ydCB7IEF0bGFzU2VydmljZSB9IGZyb20gJy4uL2F0bGFzLnNlcnZpY2UnO1xuXG4vKipcbiAqIGBhdGxhc1Jvb3RgIOKAlCBhcHBseSB0aGUgcmVzb2x2ZWQgYXBwZWFyYW5jZSBkZXNpZ24gdG9rZW5zIGFzIGAtLWF0bGFzLSpgIENTU1xuICogY3VzdG9tIHByb3BlcnRpZXMgKGFuZCB0aGUgYGF0bGFzLXJvb3RgIGNsYXNzKSBvbnRvIGl0cyBob3N0IGVsZW1lbnQsIHNvIHRoZVxuICogQXRsYXMgY29tcG9uZW50cyByZW5kZXJlZCBpbnNpZGUgaW5oZXJpdCB0aGVtLlxuICpcbiAqIFJlYWN0IGRvZXMgdGhpcyB3aXRoIHRoZSB3cmFwcGluZyBgPGRpdiBjbGFzc05hbWU9XCJhdGxhcy1yb290XCIgc3R5bGU9e+KApn0+YFxuICogaW5zaWRlIGA8QXRsYXNQcm92aWRlcj5gLiBBbmd1bGFyIGhhcyBubyBzaW5nbGUgd3JhcHBpbmcgZWxlbWVudCwgc28gYVxuICogY29uc3VtZXIgb3B0cyBpbiBieSBwdXR0aW5nIGBhdGxhc1Jvb3RgIG9uIHdoYXRldmVyIGVsZW1lbnQgZW5jbG9zZXMgdGhlXG4gKiBBdGxhcyBVSSAoY29tbW9ubHkgdGhlIGFwcCByb290KTpcbiAqXG4gKiBgYGBodG1sXG4gKiA8ZGl2IGF0bGFzUm9vdD5cbiAqICAgPHJvdXRlci1vdXRsZXQ+PC9yb3V0ZXItb3V0bGV0PlxuICogPC9kaXY+XG4gKiBgYGBcbiAqXG4gKiBXaXRoIGEgZGVzaWduIChhIGNvZGUtbGV2ZWwgYGFwcGVhcmFuY2UucHJlc2V0YCAvIGBhcHBlYXJhbmNlLmRlc2lnbmAsIG9yXG4gKiB0aGUgZGFzaGJvYXJkIGRlc2lnbiwgZmV0Y2hlZCBpbiB0aGUgYnJvd3NlcikgdGhlIGhvc3QgYWxzbyBnZXRzIHRoZSBzdGFibGVcbiAqIGBkYXRhLWF0bGFzLSpgIGF0dHJpYnV0ZXMgYW5kIHRoZSBkZXNpZ24gc3R5bGVzaGVldCBpcyBhZGRlZCB0byBgPGhlYWQ+YCBvbmNlLlxuICovXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdbYXRsYXNSb290XScsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG59KVxuZXhwb3J0IGNsYXNzIEF0bGFzUm9vdERpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYXRsYXMgPSBpbmplY3QoQXRsYXNTZXJ2aWNlKTtcbiAgcHJpdmF0ZSByZWFkb25seSBlbCA9IGluamVjdDxFbGVtZW50UmVmPEhUTUxFbGVtZW50Pj4oRWxlbWVudFJlZik7XG4gIHByaXZhdGUgcmVhZG9ubHkgcmVuZGVyZXIgPSBpbmplY3QoUmVuZGVyZXIyKTtcbiAgcHJpdmF0ZSByZWFkb25seSBkb2N1bWVudCA9IGluamVjdChET0NVTUVOVCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgcGxhdGZvcm1JZCA9IGluamVjdChQTEFURk9STV9JRCk7XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgY29uc3QgaG9zdCA9IHRoaXMuZWwubmF0aXZlRWxlbWVudDtcbiAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKGhvc3QsICdhdGxhcy1yb290Jyk7XG4gICAgLy8gQ3VzdG9tIHByb3BlcnRpZXMgdmlhIGBzdHlsZS5zZXRQcm9wZXJ0eWAgKHdyaXR0ZW4gdmVyYmF0aW0sIG5ldmVyIGNhbWVsQ2FzZWQpLlxuICAgIGxldCBhcHBsaWVkID0gYXBwbHlBcHBlYXJhbmNlVG9Eb20odGhpcy5kb2N1bWVudCwgaG9zdCwgdGhpcy5hdGxhcy5hcHBlYXJhbmNlUmVuZGVyKCkpO1xuICAgIGlmICghaXNQbGF0Zm9ybUJyb3dzZXIodGhpcy5wbGF0Zm9ybUlkKSkgcmV0dXJuO1xuICAgIHZvaWQgdGhpcy5hdGxhcy5sb2FkSW5zdGFuY2VEZXNpZ24oKS50aGVuKChkZXNpZ24pID0+IHtcbiAgICAgIGlmICghZGVzaWduKSByZXR1cm47XG4gICAgICBhcHBsaWVkID0gYXBwbHlBcHBlYXJhbmNlVG9Eb20odGhpcy5kb2N1bWVudCwgaG9zdCwgdGhpcy5hdGxhcy5hcHBlYXJhbmNlUmVuZGVyKGRlc2lnbiksIGFwcGxpZWQpO1xuICAgIH0pO1xuICB9XG59XG4iXX0=