@ruc-lib/drawer 3.1.0 → 3.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.
@@ -0,0 +1,412 @@
1
+ import { Component, Input, Output, EventEmitter, ChangeDetectorRef, HostListener, ViewChild, ViewContainerRef } from '@angular/core';
2
+ import { trigger, state, style, transition, animate } from '@angular/animations';
3
+ import * as i0 from "@angular/core";
4
+ import * as i1 from "@angular/common";
5
+ import * as i2 from "@angular/material/button";
6
+ import * as i3 from "@angular/material/icon";
7
+ import * as i4 from "@angular/material/sidenav";
8
+ import * as i5 from "../../pipes/pipes/safe-html.pipe";
9
+ /**
10
+ * @Component RuclibDrawerComponent
11
+ * @description A highly configurable drawer component that can slide in from any of the four directions (left, right, top, bottom).
12
+ * It uses custom Angular animations for smooth transitions and supports theming.
13
+ */
14
+ export class RuclibDrawerComponent {
15
+ constructor(cdr) {
16
+ this.cdr = cdr;
17
+ /**
18
+ * Input data for configuring the drawer's appearance and behavior.
19
+ * @see RuclibDrawerInput interface for detailed properties.
20
+ */
21
+ this.rucInputData = {};
22
+ /**
23
+ * EventEmitter for various drawer events.
24
+ * Emits objects with `type` (e.g., 'openedStart', 'closedStart', 'openedChange', 'drawerToggle')
25
+ * and `opened` (boolean) and `position` (string) properties.
26
+ */
27
+ this.rucEvent = new EventEmitter();
28
+ /** Reference to the dynamically created component. */
29
+ this.dynamicComponentRef = null;
30
+ /**
31
+ * Current animation state of the drawer ('in' or 'out').
32
+ * @public
33
+ */
34
+ this.drawerAnimationState = 'out';
35
+ /**
36
+ * Current active position of the drawer.
37
+ * @public
38
+ * @default 'left'
39
+ */
40
+ this.currentDrawerPosition = 'left'; // Default
41
+ /**
42
+ * Stores the next position if the drawer is currently open and a new position is requested.
43
+ * Used to sequence close and open animations.
44
+ * @private
45
+ */
46
+ this.pendingDrawerPosition = null;
47
+ /**
48
+ * Flag to indicate if an animation is currently in progress to prevent rapid toggling.
49
+ * @public
50
+ */
51
+ this.isAnimating = false;
52
+ /**
53
+ * Effective animation duration for the drawer, derived from input or default.
54
+ * @public
55
+ * @default '300ms'
56
+ */
57
+ this.effectiveAnimationDuration = '300ms';
58
+ /**
59
+ * Mode of the drawer, primarily for determining backdrop behavior with custom animations.
60
+ * @public
61
+ * @default 'side'
62
+ */
63
+ this.matDrawerMode = 'side';
64
+ /**
65
+ * Actual position ('start' or 'end') used by Angular Material's MatDrawer if it were directly used.
66
+ * Retained for logical consistency in determining layout.
67
+ * @public
68
+ * @default 'start'
69
+ */
70
+ this.matActualPosition = 'start';
71
+ /**
72
+ * Flag indicating if the drawer is in a vertical layout (top/bottom).
73
+ * Helps determine if width or height should be 100%.
74
+ * @public
75
+ */
76
+ this.isVerticalLayout = false;
77
+ /**
78
+ * Effective dimension (width or height) of the drawer panel.
79
+ * @public
80
+ * @default '250px'
81
+ */
82
+ this.effectiveDrawerDimension = '250px';
83
+ }
84
+ /**
85
+ * Angular lifecycle hook that is called after data-bound properties of a directive are initialized.
86
+ */
87
+ ngOnInit() {
88
+ this.applyInputs();
89
+ this.drawerAnimationState = 'out';
90
+ this.loadDynamicContent();
91
+ }
92
+ /**
93
+ * Angular lifecycle hook that is called after Angular has fully initialized a component's view.
94
+ */
95
+ ngAfterViewInit() {
96
+ if (this.rucInputData.initialOpenedState && this.drawerAnimationState === 'out') {
97
+ // Defer state update to the next microtask queue.
98
+ // This helps avoid ExpressionChangedAfterItHasBeenCheckedError when initializing the drawer's open state.
99
+ Promise.resolve().then(() => this.setDrawerOpenState(true));
100
+ }
101
+ }
102
+ /**
103
+ * Angular lifecycle hook that is called when any data-bound property of a directive changes.
104
+ * @param changes - Object containing the changed properties.
105
+ */
106
+ ngOnChanges(changes) {
107
+ if (changes['rucInputData']) {
108
+ const previousRucInputData = changes['rucInputData'].previousValue || {};
109
+ const currentRucInputData = changes['rucInputData'].currentValue || {};
110
+ const oldPosition = previousRucInputData.drawerPosition ?? this.currentDrawerPosition;
111
+ const wasOpen = this.drawerAnimationState === 'in';
112
+ this.currentDrawerPosition = currentRucInputData.drawerPosition ?? 'left';
113
+ this.applyInputs();
114
+ const newPosition = this.currentDrawerPosition;
115
+ const shouldBeOpen = this.rucInputData.initialOpenedState ?? false;
116
+ if (wasOpen && oldPosition !== newPosition) {
117
+ this.pendingDrawerPosition = newPosition;
118
+ this.setDrawerOpenState(false);
119
+ }
120
+ else if (wasOpen !== shouldBeOpen) {
121
+ setTimeout(() => {
122
+ this.setDrawerOpenState(shouldBeOpen);
123
+ });
124
+ }
125
+ else {
126
+ this.loadDynamicContent();
127
+ }
128
+ this.cdr.detectChanges();
129
+ }
130
+ }
131
+ /**
132
+ * Applies input data to component properties, calculating dimensions and positions.
133
+ * @private
134
+ */
135
+ applyInputs() {
136
+ this.matDrawerMode = this.rucInputData.mode ?? 'side';
137
+ this.effectiveAnimationDuration = this.rucInputData.animationDuration || '300ms';
138
+ const getDimension = (inputDimension, defaultDimension) => {
139
+ return (inputDimension && inputDimension.trim() !== '') ? inputDimension : defaultDimension;
140
+ };
141
+ switch (this.currentDrawerPosition) {
142
+ case 'right':
143
+ this.matActualPosition = 'end';
144
+ this.isVerticalLayout = false;
145
+ this.effectiveDrawerDimension = getDimension(this.rucInputData.drawerWidth, '250px');
146
+ break;
147
+ case 'top':
148
+ this.matActualPosition = 'start';
149
+ this.isVerticalLayout = true;
150
+ this.effectiveDrawerDimension = getDimension(this.rucInputData.drawerHeight, '200px');
151
+ break;
152
+ case 'bottom':
153
+ this.matActualPosition = 'end';
154
+ this.isVerticalLayout = true;
155
+ this.effectiveDrawerDimension = getDimension(this.rucInputData.drawerHeight, '200px');
156
+ break;
157
+ case 'left':
158
+ default:
159
+ this.matActualPosition = 'start';
160
+ this.isVerticalLayout = false;
161
+ this.effectiveDrawerDimension = getDimension(this.rucInputData.drawerWidth, '250px');
162
+ break;
163
+ }
164
+ }
165
+ /**
166
+ * Toggles the drawer's open/close state or switches to a new position.
167
+ * @param requestedPosition - The desired position to open the drawer from. If not provided, uses `currentDrawerPosition`.
168
+ */
169
+ toggleDrawer(requestedPosition) {
170
+ if (this.isAnimating && !this.pendingDrawerPosition) {
171
+ return;
172
+ }
173
+ const positionToToggle = requestedPosition || this.currentDrawerPosition;
174
+ const isDrawerOpen = this.drawerAnimationState === 'in';
175
+ const isSamePosition = this.currentDrawerPosition === positionToToggle;
176
+ if (isDrawerOpen) {
177
+ if (isSamePosition) {
178
+ this.setDrawerOpenState(false);
179
+ }
180
+ else {
181
+ this.pendingDrawerPosition = positionToToggle;
182
+ this.setDrawerOpenState(false);
183
+ }
184
+ }
185
+ else {
186
+ if (!isSamePosition) {
187
+ this.currentDrawerPosition = positionToToggle;
188
+ this.applyInputs();
189
+ }
190
+ this.setDrawerOpenState(true);
191
+ }
192
+ }
193
+ /**
194
+ * Sets the drawer's open state and triggers the animation.
195
+ * @param open - Boolean indicating whether to open (true) or close (false) the drawer.
196
+ * @private
197
+ */
198
+ setDrawerOpenState(open) {
199
+ if (this.isAnimating && !this.pendingDrawerPosition && open === (this.drawerAnimationState === 'in')) {
200
+ return;
201
+ }
202
+ this.isAnimating = true;
203
+ this.drawerAnimationState = open ? 'in' : 'out';
204
+ this.rucEvent.emit({
205
+ type: open ? 'openedStart' : 'closedStart',
206
+ opened: open,
207
+ position: this.currentDrawerPosition
208
+ });
209
+ this.cdr.detectChanges();
210
+ }
211
+ /**
212
+ * Callback for when a drawer animation finishes.
213
+ * Manages state transitions, especially when switching between open drawers.
214
+ * @param event - The Angular AnimationEvent.
215
+ */
216
+ onAnimationDone(event) {
217
+ if (event.element.classList.contains('dynamic-drawer')) {
218
+ if (event.toState === 'out') {
219
+ this.rucEvent.emit({ type: 'openedChange', opened: false, position: this.currentDrawerPosition });
220
+ this.rucEvent.emit({ type: 'drawerToggle', opened: false, position: this.currentDrawerPosition });
221
+ if (this.pendingDrawerPosition) {
222
+ this.currentDrawerPosition = this.pendingDrawerPosition;
223
+ this.pendingDrawerPosition = null;
224
+ this.applyInputs();
225
+ setTimeout(() => {
226
+ this.setDrawerOpenState(true);
227
+ });
228
+ return;
229
+ }
230
+ }
231
+ else if (event.toState === 'in') {
232
+ this.rucEvent.emit({ type: 'openedChange', opened: true, position: this.currentDrawerPosition });
233
+ this.rucEvent.emit({ type: 'drawerToggle', opened: true, position: this.currentDrawerPosition });
234
+ }
235
+ this.isAnimating = false;
236
+ this.cdr.detectChanges();
237
+ }
238
+ }
239
+ /**
240
+ * Loads the dynamic component into the drawer if specified in rucInputData.
241
+ * Clears existing dynamic component if any.
242
+ * @private
243
+ */
244
+ loadDynamicContent() {
245
+ this.clearDynamicContent();
246
+ const componentType = this.rucInputData.content?.drawerContentComponent;
247
+ if (componentType && this.drawerComponentHost) {
248
+ this.dynamicComponentRef = this.drawerComponentHost.createComponent(componentType);
249
+ if (this.dynamicComponentRef.instance) {
250
+ this.dynamicComponentRef.changeDetectorRef.detectChanges();
251
+ }
252
+ if (this.rucInputData.drawerContentComponentData && this.dynamicComponentRef.instance) {
253
+ Object.keys(this.rucInputData.drawerContentComponentData).forEach(key => {
254
+ if (key in this.dynamicComponentRef.instance) {
255
+ this.dynamicComponentRef.instance[key] = this.rucInputData.drawerContentComponentData[key];
256
+ }
257
+ });
258
+ this.dynamicComponentRef.changeDetectorRef.detectChanges();
259
+ }
260
+ this.cdr.detectChanges();
261
+ }
262
+ }
263
+ /**
264
+ * Getter for the current animation parameters to be passed to the animation triggers in the template.
265
+ * Includes the current animation state ('in' or 'out') and the effective duration.
266
+ */
267
+ get animationParams() {
268
+ return { value: this.drawerAnimationState, params: { duration: this.effectiveAnimationDuration } };
269
+ }
270
+ /**
271
+ * Getter for the backdrop animation parameters.
272
+ * Typically uses a faster duration than the main drawer animation.
273
+ */
274
+ get backdropAnimationParams() {
275
+ let durationMs = 0;
276
+ if (this.effectiveAnimationDuration.endsWith('ms')) {
277
+ durationMs = parseInt(this.effectiveAnimationDuration, 10);
278
+ }
279
+ else if (this.effectiveAnimationDuration.endsWith('s')) {
280
+ durationMs = parseFloat(this.effectiveAnimationDuration) * 1000;
281
+ }
282
+ else {
283
+ durationMs = parseInt(this.effectiveAnimationDuration, 10) || 300; // Fallback if format is unexpected
284
+ }
285
+ const backdropDurationValue = Math.floor(durationMs / 2); // Ensure integer for ms
286
+ const backdropDuration = backdropDurationValue > 0 ? `${backdropDurationValue}ms` : '150ms'; // Fallback if calculated duration is 0 or less
287
+ return { value: this.drawerAnimationState, params: { duration: backdropDuration } };
288
+ }
289
+ /**
290
+ * Generates an accessible label for the toggle button based on the drawer's state and position.
291
+ * @returns The ARIA label string for the toggle button.
292
+ */
293
+ getToggleButtonAriaLabel() {
294
+ const defaultOpen = `Open ${this.currentDrawerPosition} Drawer`;
295
+ const defaultClose = `Close ${this.currentDrawerPosition} Drawer`;
296
+ const openText = this.rucInputData.toggleButtonText?.open || defaultOpen;
297
+ const closeText = this.rucInputData.toggleButtonText?.close || defaultClose;
298
+ return this.drawerAnimationState === 'in' ? closeText : openText;
299
+ }
300
+ /**
301
+ * Handles clicks on the backdrop.
302
+ * Closes the drawer only if `disableClose` is not true.
303
+ * @public
304
+ */
305
+ handleBackdropClick() {
306
+ if (!(this.rucInputData.disableClose ?? false)) {
307
+ this.toggleDrawer(this.currentDrawerPosition);
308
+ }
309
+ }
310
+ /**
311
+ * Listens for Escape key presses on the document.
312
+ * Closes the drawer if it's open and `disableClose` is not true.
313
+ * @param event - The KeyboardEvent.
314
+ */
315
+ onKeydownHandler(event) {
316
+ if (this.drawerAnimationState === 'in' && !(this.rucInputData.disableClose ?? false)) {
317
+ this.toggleDrawer(this.currentDrawerPosition);
318
+ }
319
+ }
320
+ /**
321
+ * Clears any dynamically loaded component.
322
+ * @private
323
+ */
324
+ clearDynamicContent() {
325
+ if (this.drawerComponentHost) {
326
+ this.drawerComponentHost.clear();
327
+ }
328
+ if (this.dynamicComponentRef) {
329
+ this.dynamicComponentRef.destroy();
330
+ this.dynamicComponentRef = null;
331
+ }
332
+ }
333
+ /**
334
+ * Angular lifecycle hook that is called clear dynamic component content.
335
+ */
336
+ ngOnDestroy() {
337
+ this.clearDynamicContent();
338
+ }
339
+ }
340
+ RuclibDrawerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: RuclibDrawerComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
341
+ RuclibDrawerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: RuclibDrawerComponent, selector: "uxp-ruclib-drawer", inputs: { rucInputData: "rucInputData", customTheme: "customTheme" }, outputs: { rucEvent: "rucEvent" }, host: { listeners: { "document:keydown.escape": "onKeydownHandler($event)" } }, viewQueries: [{ propertyName: "drawerComponentHost", first: true, predicate: ["drawerComponentHost"], descendants: true, read: ViewContainerRef, static: true }], usesOnChanges: true, ngImport: i0, template: "<!-- \r\n Custom Backdrop element.\r\n Visible only when:\r\n - rucInputData.mode is 'over'\r\n - rucInputData.hasBackdrop is true (or undefined, defaulting to true)\r\n - drawerAnimationState is 'in' (drawer is open or opening)\r\n Animates using 'backdropFade' trigger.\r\n Clicking the backdrop will toggle the drawer for the current position.\r\n Background color can be customized via rucInputData.backdropBackgroundColor.\r\n-->\r\n<div class=\"custom-backdrop\"\r\n *ngIf=\"rucInputData.mode === 'over' && (rucInputData.hasBackdrop ?? true) && drawerAnimationState === 'in'\"\r\n [@backdropFade]=\"backdropAnimationParams\"\r\n (click)=\"handleBackdropClick()\"\r\n [style.background-color]=\"rucInputData.hasBackdrop ? rucInputData.backdropBackgroundColor : ''\">\r\n</div>\r\n\r\n<!-- \r\n Custom Dynamic Drawer element.\r\n This is the main panel that slides in and out.\r\n - Applies CSS classes based on currentDrawerPosition and customTheme.\r\n - Dynamically sets width and height based on drawer orientation and input data.\r\n - Uses one of four animation triggers (slideInOutLeft, slideInOutRight, slideInOutTop, slideInOutBottom)\r\n based on currentDrawerPosition. Only the active trigger runs its animation; others are set to an\r\n instant 'out' state to prevent interference.\r\n - Animation completion events are handled by onAnimationDone().\r\n-->\r\n\r\n<div class=\"main\">\r\n <div class=\"dynamic-drawer\"\r\n [ngClass]=\"'drawer-' + currentDrawerPosition + ' ' + (customTheme || '')\"\r\n [style.width]=\"!isVerticalLayout ? effectiveDrawerDimension : '100%'\"\r\n [style.height]=\"isVerticalLayout ? effectiveDrawerDimension : '100%'\"\r\n\r\n [@slideInOutLeft]=\"currentDrawerPosition === 'left' ? animationParams : {value: 'out', params: {duration: '0ms'}}\"\r\n (@slideInOutLeft.done)=\"currentDrawerPosition === 'left' && onAnimationDone($event)\"\r\n\r\n [@slideInOutRight]=\"currentDrawerPosition === 'right' ? animationParams : {value: 'out', params: {duration: '0ms'}}\"\r\n (@slideInOutRight.done)=\"currentDrawerPosition === 'right' && onAnimationDone($event)\"\r\n\r\n [@slideInOutTop]=\"currentDrawerPosition === 'top' ? animationParams : {value: 'out', params: {duration: '0ms'}}\"\r\n (@slideInOutTop.done)=\"currentDrawerPosition === 'top' && onAnimationDone($event)\"\r\n\r\n [@slideInOutBottom]=\"currentDrawerPosition === 'bottom' ? animationParams : {value: 'out', params: {duration: '0ms'}}\"\r\n (@slideInOutBottom.done)=\"currentDrawerPosition === 'bottom' && onAnimationDone($event)\">\r\n\r\n <!-- Wrapper for the content inside the drawer, handles padding and layout. -->\r\n <div class=\"drawer-content-wrapper\">\r\n <!-- Optional title for the drawer. -->\r\n <h2 *ngIf=\"rucInputData.content?.drawerTitle\" class=\"ruclib-drawer-title\">\r\n {{ rucInputData.content?.drawerTitle }}\r\n </h2>\r\n <!-- \r\n Optional close button inside the drawer.\r\n Toggles the drawer for the current position when clicked.\r\n ARIA label provides accessibility.\r\n Dimensions can be customized via rucInputData.closeButtonDimensions.\r\n -->\r\n <button *ngIf=\"rucInputData.showCloseIcon\"\r\n mat-icon-button class=\"ruclib-drawer-close-button\"\r\n (click)=\"toggleDrawer(currentDrawerPosition)\"\r\n [attr.aria-label]=\"'Close ' + currentDrawerPosition + ' drawer'\"\r\n [style.width]=\"rucInputData.closeButtonDimensions?.width\"\r\n [style.height]=\"rucInputData.closeButtonDimensions?.height\">\r\n <!-- Material icon for the close button. Size can be customized. -->\r\n <mat-icon [style.font-size]=\"rucInputData.closeButtonDimensions?.iconSize\">close</mat-icon>\r\n </button>\r\n <!-- Main body content of the drawer. -->\r\n <div class=\"ruclib-drawer-body\">\r\n <!-- Host for dynamically injected component -->\r\n <ng-template #drawerComponentHost></ng-template>\r\n <!-- Fallback to HTML content if no component is provided -->\r\n <div *ngIf=\"!rucInputData.content?.drawerContentComponent\" [innerHTML]=\"rucInputData.content?.drawerBody || '' | safeHtml\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<!-- \r\n Angular Material Drawer Container.\r\n Acts as the main container for the drawer system, especially if 'side' or 'push' modes\r\n were to be implemented with MatDrawer's native behavior. With custom fixed-position animations,\r\n its primary role here is to host the mat-drawer-content.\r\n - Applies 'vertical-layout' class if the drawer is top/bottom.\r\n - MatDrawer's own backdrop is disabled as a custom one is used.\r\n-->\r\n<mat-drawer-container\r\n class=\"ruclib-drawer-container\"\r\n [class.vertical-layout]=\"isVerticalLayout\"\r\n [hasBackdrop]=\"false\"> <!-- MatDrawer's backdrop is not used with custom animation -->\r\n <mat-drawer-content class=\"ruclib-main-content\">\r\n <button [disabled]=\"rucInputData.disableToggleButtonInMainContent\"\r\n mat-raised-button\r\n color=\"primary\"\r\n title=\"Toggle Drawer\"\r\n class=\"drawer-toggle-button\"\r\n [style.width]=\"rucInputData.toggleButtonDimensions?.width\"\r\n [style.height]=\"rucInputData.toggleButtonDimensions?.height\"\r\n [style.padding]=\"rucInputData.toggleButtonDimensions?.padding\"\r\n [style.font-size]=\"rucInputData.toggleButtonDimensions?.fontSize\"\r\n (click)=\"toggleDrawer(currentDrawerPosition)\"\r\n [attr.aria-label]=\"getToggleButtonAriaLabel()\"\r\n [attr.aria-expanded]=\"drawerAnimationState === 'in'\">\r\n <!-- Optional Material icon for the toggle button. Show only if no image URL is provided. -->\r\n <mat-icon *ngIf=\"rucInputData.toggleButtonIcon && !rucInputData.toggleButtonImageUrl\" [style.font-size]=\"rucInputData.toggleButtonDimensions?.iconSize\">{{ rucInputData.toggleButtonIcon }}</mat-icon>\r\n <!-- Optional image for the toggle button. If present, it should fill the button. -->\r\n <img *ngIf=\"rucInputData.toggleButtonImageUrl\"\r\n [src]=\"rucInputData.toggleButtonImageUrl\"\r\n [alt]=\"rucInputData.toggleButtonImageAlt || 'Toggle Drawer'\"\r\n class=\"ruclib-drawer-toggle-image\"\r\n [style.width]=\"rucInputData.toggleButtonDimensions?.width\"\r\n [style.height]=\"rucInputData.toggleButtonDimensions?.height\"\r\n [style.padding]=\"rucInputData.toggleButtonDimensions?.padding\">\r\n <!-- Text for the toggle button. Show only if NO icon AND NO image URL is provided. -->\r\n <span *ngIf=\"!rucInputData.toggleButtonIcon && !rucInputData.toggleButtonImageUrl && (rucInputData.toggleButtonText?.open || rucInputData.toggleButtonText?.close)\">\r\n {{ drawerAnimationState === 'in' ? (rucInputData.toggleButtonText?.close || 'Close') : (rucInputData.toggleButtonText?.open || 'Open') }}\r\n </span>\r\n <!-- Text for the toggle button when an icon (but NO image) IS also present. -->\r\n <span *ngIf=\"rucInputData.toggleButtonIcon && !rucInputData.toggleButtonImageUrl && (rucInputData.toggleButtonText?.open || rucInputData.toggleButtonText?.close)\" class=\"toggle-button-text-with-icon\">\r\n {{ drawerAnimationState === 'in' ? (rucInputData.toggleButtonText?.close || 'Close') : (rucInputData.toggleButtonText?.open || 'Open') }}\r\n </span>\r\n </button>\r\n <!-- Main application content area, rendered from HTML string via safeHtml pipe. -->\r\n <div [innerHTML]=\"rucInputData.content?.mainBody || '' | safeHtml\"></div>\r\n </mat-drawer-content>\r\n</mat-drawer-container>", styles: [".mat-ripple{overflow:hidden;position:relative}.mat-ripple:not(:empty){transform:translateZ(0)}.mat-ripple.mat-ripple-unbounded{overflow:visible}.mat-ripple-element{position:absolute;border-radius:50%;pointer-events:none;transition:opacity,transform 0ms cubic-bezier(0,0,.2,1);transform:scale3d(0,0,0)}.cdk-high-contrast-active .mat-ripple-element{display:none}.cdk-visually-hidden{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;white-space:nowrap;outline:0;-webkit-appearance:none;-moz-appearance:none;left:0}[dir=rtl] .cdk-visually-hidden{left:auto;right:0}.cdk-overlay-container,.cdk-global-overlay-wrapper{pointer-events:none;top:0;left:0;height:100%;width:100%}.cdk-overlay-container{position:fixed;z-index:1000}.cdk-overlay-container:empty{display:none}.cdk-global-overlay-wrapper{display:flex;position:absolute;z-index:1000}.cdk-overlay-pane{position:absolute;pointer-events:auto;box-sizing:border-box;z-index:1000;display:flex;max-width:100%;max-height:100%}.cdk-overlay-backdrop{position:absolute;inset:0;z-index:1000;pointer-events:auto;-webkit-tap-highlight-color:transparent;transition:opacity .4s cubic-bezier(.25,.8,.25,1);opacity:0}.cdk-overlay-backdrop.cdk-overlay-backdrop-showing{opacity:1}.cdk-high-contrast-active .cdk-overlay-backdrop.cdk-overlay-backdrop-showing{opacity:.6}.cdk-overlay-dark-backdrop{background:rgba(0,0,0,.32)}.cdk-overlay-transparent-backdrop{transition:visibility 1ms linear,opacity 1ms linear;visibility:hidden;opacity:1}.cdk-overlay-transparent-backdrop.cdk-overlay-backdrop-showing{opacity:0;visibility:visible}.cdk-overlay-backdrop-noop-animation{transition:none}.cdk-overlay-connected-position-bounding-box{position:absolute;z-index:1000;display:flex;flex-direction:column;min-width:1px;min-height:1px}.cdk-global-scrollblock{position:fixed;width:100%;overflow-y:scroll}textarea.cdk-textarea-autosize{resize:none}textarea.cdk-textarea-autosize-measuring{padding:2px 0!important;box-sizing:content-box!important;height:auto!important;overflow:hidden!important}textarea.cdk-textarea-autosize-measuring-firefox{padding:2px 0!important;box-sizing:content-box!important;height:0!important}@keyframes cdk-text-field-autofill-start{}@keyframes cdk-text-field-autofill-end{}.cdk-text-field-autofill-monitored:-webkit-autofill{animation:cdk-text-field-autofill-start 0s 1ms}.cdk-text-field-autofill-monitored:not(:-webkit-autofill){animation:cdk-text-field-autofill-end 0s 1ms}.mat-focus-indicator{position:relative}.mat-focus-indicator:before{inset:0;position:absolute;box-sizing:border-box;pointer-events:none;display:var(--mat-focus-indicator-display, none);border:var(--mat-focus-indicator-border-width, 3px) var(--mat-focus-indicator-border-style, solid) var(--mat-focus-indicator-border-color, transparent);border-radius:var(--mat-focus-indicator-border-radius, 4px)}.mat-focus-indicator:focus:before{content:\"\"}.cdk-high-contrast-active{--mat-focus-indicator-display: block}.mat-mdc-focus-indicator{position:relative}.mat-mdc-focus-indicator:before{inset:0;position:absolute;box-sizing:border-box;pointer-events:none;display:var(--mat-mdc-focus-indicator-display, none);border:var(--mat-mdc-focus-indicator-border-width, 3px) var(--mat-mdc-focus-indicator-border-style, solid) var(--mat-mdc-focus-indicator-border-color, transparent);border-radius:var(--mat-mdc-focus-indicator-border-radius, 4px)}.mat-mdc-focus-indicator:focus:before{content:\"\"}.cdk-high-contrast-active{--mat-mdc-focus-indicator-display: block}.main{font-size:16px;font-weight:400;line-height:24px;font-family:Roboto,sans-serif;letter-spacing:.03125em}.ruc-custom-theme{font-size:14px;font-weight:400;line-height:20px;font-family:Roboto,sans-serif;letter-spacing:normal}.ruc-custom-theme .mat-mdc-option{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-family:var(--mdc-typography-body1-font-family, var(--mdc-typography-font-family, Roboto, sans-serif));font-size:var(--mdc-typography-body1-font-size, 15px);line-height:var(--mdc-typography-body1-line-height, 24px);font-weight:var(--mdc-typography-body1-font-weight, 400);letter-spacing:var(--mdc-typography-body1-letter-spacing, normal)}.ruc-custom-theme .mat-mdc-card-title{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-family:var(--mdc-typography-headline6-font-family, var(--mdc-typography-font-family, Roboto, sans-serif));font-size:var(--mdc-typography-headline6-font-size, 20px);line-height:var(--mdc-typography-headline6-line-height, 32px);font-weight:var(--mdc-typography-headline6-font-weight, 500);letter-spacing:var(--mdc-typography-headline6-letter-spacing, normal);-webkit-text-decoration:var(--mdc-typography-headline6-text-decoration, inherit);text-decoration:var(--mdc-typography-headline6-text-decoration, inherit);text-transform:var(--mdc-typography-headline6-text-transform, none)}.ruc-custom-theme .mat-mdc-card-subtitle{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-family:var(--mdc-typography-subtitle2-font-family, var(--mdc-typography-font-family, Roboto, sans-serif));font-size:var(--mdc-typography-subtitle2-font-size, 20px);line-height:var(--mdc-typography-subtitle2-line-height, 24px);font-weight:var(--mdc-typography-subtitle2-font-weight, 500);letter-spacing:var(--mdc-typography-subtitle2-letter-spacing, normal);-webkit-text-decoration:var(--mdc-typography-subtitle2-text-decoration, inherit);text-decoration:var(--mdc-typography-subtitle2-text-decoration, inherit);text-transform:var(--mdc-typography-subtitle2-text-transform, none)}.ruc-custom-theme .mat-mdc-tooltip{--mdc-plain-tooltip-supporting-text-font: Roboto, sans-serif;--mdc-plain-tooltip-supporting-text-size: 12px;--mdc-plain-tooltip-supporting-text-weight: 400;--mdc-plain-tooltip-supporting-text-tracking: normal}.ruc-custom-theme .mat-mdc-form-field-infix{min-height:56px}.ruc-custom-theme .mat-mdc-text-field-wrapper .mat-mdc-form-field-flex .mat-mdc-floating-label{top:28px}.ruc-custom-theme .mat-mdc-text-field-wrapper.mdc-text-field--outlined .mdc-notched-outline--upgraded .mdc-floating-label--float-above{--mat-mdc-form-field-label-transform: translateY( -34.75px) scale(var(--mat-mdc-form-field-floating-label-scale, .75));transform:var(--mat-mdc-form-field-label-transform)}.ruc-custom-theme .mat-mdc-text-field-wrapper.mdc-text-field--outlined .mat-mdc-form-field-infix{padding-top:16px;padding-bottom:16px}.ruc-custom-theme .mat-mdc-text-field-wrapper:not(.mdc-text-field--outlined) .mat-mdc-form-field-infix{padding-top:24px;padding-bottom:8px}.ruc-custom-theme .mdc-text-field--no-label:not(.mdc-text-field--outlined):not(.mdc-text-field--textarea) .mat-mdc-form-field-infix{padding-top:16px;padding-bottom:16px}.ruc-custom-theme .mdc-text-field__input,.ruc-custom-theme .mdc-text-field__affix{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-family:var(--mdc-typography-subtitle1-font-family, var(--mdc-typography-font-family, Roboto, sans-serif));font-size:var(--mdc-typography-subtitle1-font-size, 16px);font-weight:var(--mdc-typography-subtitle1-font-weight, 400);letter-spacing:var(--mdc-typography-subtitle1-letter-spacing, normal);-webkit-text-decoration:var(--mdc-typography-subtitle1-text-decoration, inherit);text-decoration:var(--mdc-typography-subtitle1-text-decoration, inherit);text-transform:var(--mdc-typography-subtitle1-text-transform, none)}.ruc-custom-theme .mdc-text-field--textarea .mdc-text-field__input{line-height:1.5rem}.ruc-custom-theme .mdc-floating-label{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-family:var(--mdc-typography-subtitle1-font-family, var(--mdc-typography-font-family, Roboto, sans-serif));font-size:var(--mdc-typography-subtitle1-font-size, 16px);font-weight:var(--mdc-typography-subtitle1-font-weight, 400);letter-spacing:var(--mdc-typography-subtitle1-letter-spacing, normal);-webkit-text-decoration:var(--mdc-typography-subtitle1-text-decoration, inherit);text-decoration:var(--mdc-typography-subtitle1-text-decoration, inherit);text-transform:var(--mdc-typography-subtitle1-text-transform, none)}.ruc-custom-theme .mat-mdc-form-field-subscript-wrapper,.ruc-custom-theme .mat-mdc-form-field-bottom-align:before{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-family:var(--mdc-typography-caption-font-family, var(--mdc-typography-font-family, Roboto, sans-serif));font-size:var(--mdc-typography-caption-font-size, 12px);line-height:var(--mdc-typography-caption-line-height, 20px);font-weight:var(--mdc-typography-caption-font-weight, 400);letter-spacing:var(--mdc-typography-caption-letter-spacing, normal);-webkit-text-decoration:var(--mdc-typography-caption-text-decoration, inherit);text-decoration:var(--mdc-typography-caption-text-decoration, inherit);text-transform:var(--mdc-typography-caption-text-transform, none)}.ruc-custom-theme .mat-mdc-form-field,.ruc-custom-theme .mat-mdc-floating-label{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-family:var(--mdc-typography-body1-font-family, var(--mdc-typography-font-family, Roboto, sans-serif));font-size:var(--mdc-typography-body1-font-size, 15px);line-height:var(--mdc-typography-body1-line-height, 24px);font-weight:var(--mdc-typography-body1-font-weight, 400);letter-spacing:var(--mdc-typography-body1-letter-spacing, normal);-webkit-text-decoration:var(--mdc-typography-body1-text-decoration, inherit);text-decoration:var(--mdc-typography-body1-text-decoration, inherit);text-transform:var(--mdc-typography-body1-text-transform, none)}.ruc-custom-theme .mat-mdc-form-field .mdc-text-field--outlined .mdc-floating-label--float-above{font-size:calc(15px * var(--mat-mdc-form-field-floating-label-scale, .75))}.ruc-custom-theme .mat-mdc-form-field .mdc-text-field--outlined .mdc-notched-outline--upgraded .mdc-floating-label--float-above{font-size:15px}.ruc-custom-theme .mat-mdc-select-panel{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-family:var(--mdc-typography-subtitle1-font-family, var(--mdc-typography-font-family, Roboto, sans-serif));font-size:var(--mdc-typography-subtitle1-font-size, 16px);line-height:var(--mdc-typography-subtitle1-line-height, 28px);font-weight:var(--mdc-typography-subtitle1-font-weight, 400);letter-spacing:var(--mdc-typography-subtitle1-letter-spacing, normal);-webkit-text-decoration:var(--mdc-typography-subtitle1-text-decoration, inherit);text-decoration:var(--mdc-typography-subtitle1-text-decoration, inherit);text-transform:var(--mdc-typography-subtitle1-text-transform, none);line-height:24px}.ruc-custom-theme .mat-mdc-select{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-family:var(--mdc-typography-body1-font-family, var(--mdc-typography-font-family, Roboto, sans-serif));font-size:var(--mdc-typography-body1-font-size, 15px);line-height:var(--mdc-typography-body1-line-height, 24px);font-weight:var(--mdc-typography-body1-font-weight, 400);letter-spacing:var(--mdc-typography-body1-letter-spacing, normal);-webkit-text-decoration:var(--mdc-typography-body1-text-decoration, inherit);text-decoration:var(--mdc-typography-body1-text-decoration, inherit);text-transform:var(--mdc-typography-body1-text-transform, none)}.ruc-custom-theme .mat-mdc-autocomplete-panel{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-family:var(--mdc-typography-subtitle1-font-family, var(--mdc-typography-font-family, Roboto, sans-serif));font-size:var(--mdc-typography-subtitle1-font-size, 16px);line-height:var(--mdc-typography-subtitle1-line-height, 28px);font-weight:var(--mdc-typography-subtitle1-font-weight, 400);letter-spacing:var(--mdc-typography-subtitle1-letter-spacing, normal);-webkit-text-decoration:var(--mdc-typography-subtitle1-text-decoration, inherit);text-decoration:var(--mdc-typography-subtitle1-text-decoration, inherit);text-transform:var(--mdc-typography-subtitle1-text-transform, none);line-height:24px}.ruc-custom-theme .mat-mdc-dialog-container{--mdc-dialog-subhead-font: Roboto, sans-serif;--mdc-dialog-subhead-line-height: 32px;--mdc-dialog-subhead-size: 20px;--mdc-dialog-subhead-weight: 500;--mdc-dialog-subhead-tracking: normal;--mdc-dialog-supporting-text-font: Roboto, sans-serif;--mdc-dialog-supporting-text-line-height: 24px;--mdc-dialog-supporting-text-size: 15px;--mdc-dialog-supporting-text-weight: 400;--mdc-dialog-supporting-text-tracking: normal}.ruc-custom-theme .mat-mdc-chip{height:32px}.ruc-custom-theme .mat-mdc-standard-chip{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-family:var(--mdc-typography-body2-font-family, var(--mdc-typography-font-family, Roboto, sans-serif));font-size:var(--mdc-typography-body2-font-size, 14px);line-height:var(--mdc-typography-body2-line-height, 20px);font-weight:var(--mdc-typography-body2-font-weight, 400);letter-spacing:var(--mdc-typography-body2-letter-spacing, normal);-webkit-text-decoration:var(--mdc-typography-body2-text-decoration, inherit);text-decoration:var(--mdc-typography-body2-text-decoration, inherit);text-transform:var(--mdc-typography-body2-text-transform, none)}.ruc-custom-theme .mat-mdc-slide-toggle{--mdc-switch-state-layer-size: 48px}.ruc-custom-theme .mat-mdc-radio-button .mdc-radio{padding:10px}.ruc-custom-theme .mat-mdc-radio-button .mdc-radio .mdc-radio__background:before{top:-10px;left:-10px;width:40px;height:40px}.ruc-custom-theme .mat-mdc-radio-button .mdc-radio .mdc-radio__native-control{top:0;right:0;left:0;width:40px;height:40px}.ruc-custom-theme .mat-mdc-slider{--mdc-slider-label-label-text-font: Roboto, sans-serif;--mdc-slider-label-label-text-size: 20px;--mdc-slider-label-label-text-line-height: 24px;--mdc-slider-label-label-text-tracking: normal;--mdc-slider-label-label-text-weight: 500}.ruc-custom-theme .mat-mdc-menu-content{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-family:var(--mdc-typography-subtitle1-font-family, var(--mdc-typography-font-family, Roboto, sans-serif));font-size:var(--mdc-typography-subtitle1-font-size, 16px);line-height:var(--mdc-typography-subtitle1-line-height, 28px);font-weight:var(--mdc-typography-subtitle1-font-weight, 400);letter-spacing:var(--mdc-typography-subtitle1-letter-spacing, normal);-webkit-text-decoration:var(--mdc-typography-subtitle1-text-decoration, inherit);text-decoration:var(--mdc-typography-subtitle1-text-decoration, inherit);text-transform:var(--mdc-typography-subtitle1-text-transform, none);line-height:24px}.ruc-custom-theme .mat-mdc-menu-content,.ruc-custom-theme .mat-mdc-menu-content .mat-mdc-menu-item .mdc-list-item__primary-text{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-family:var(--mdc-typography-body1-font-family, var(--mdc-typography-font-family, Roboto, sans-serif));font-size:var(--mdc-typography-body1-font-size, 15px);line-height:var(--mdc-typography-body1-line-height, 24px);font-weight:var(--mdc-typography-body1-font-weight, 400);letter-spacing:var(--mdc-typography-body1-letter-spacing, normal);-webkit-text-decoration:var(--mdc-typography-body1-text-decoration, inherit);text-decoration:var(--mdc-typography-body1-text-decoration, inherit);text-transform:var(--mdc-typography-body1-text-transform, none)}.ruc-custom-theme .mat-mdc-list-base{--mdc-list-list-item-one-line-container-height: 48px;--mdc-list-list-item-two-line-container-height: 64px;--mdc-list-list-item-three-line-container-height: 88px}.ruc-custom-theme .mat-mdc-list-item.mdc-list-item--with-leading-avatar.mdc-list-item--with-one-line,.ruc-custom-theme .mat-mdc-list-item.mdc-list-item--with-leading-checkbox.mdc-list-item--with-one-line,.ruc-custom-theme .mat-mdc-list-item.mdc-list-item--with-leading-icon.mdc-list-item--with-one-line{height:56px}.ruc-custom-theme .mat-mdc-list-item.mdc-list-item--with-leading-avatar.mdc-list-item--with-two-lines,.ruc-custom-theme .mat-mdc-list-item.mdc-list-item--with-leading-checkbox.mdc-list-item--with-two-lines,.ruc-custom-theme .mat-mdc-list-item.mdc-list-item--with-leading-icon.mdc-list-item--with-two-lines{height:72px}.ruc-custom-theme .mat-mdc-list-base{--mdc-list-list-item-label-text-font: Roboto, sans-serif;--mdc-list-list-item-label-text-line-height: 24px;--mdc-list-list-item-label-text-size: 15px;--mdc-list-list-item-label-text-tracking: normal;--mdc-list-list-item-label-text-weight: 400;--mdc-list-list-item-supporting-text-font: Roboto, sans-serif;--mdc-list-list-item-supporting-text-line-height: 20px;--mdc-list-list-item-supporting-text-size: 14px;--mdc-list-list-item-supporting-text-tracking: normal;--mdc-list-list-item-supporting-text-weight: 400;--mdc-list-list-item-trailing-supporting-text-font: Roboto, sans-serif;--mdc-list-list-item-trailing-supporting-text-line-height: 20px;--mdc-list-list-item-trailing-supporting-text-size: 12px;--mdc-list-list-item-trailing-supporting-text-tracking: normal;--mdc-list-list-item-trailing-supporting-text-weight: 400}.ruc-custom-theme .mdc-list-group__subheader{font-size:16px;font-weight:400;line-height:28px;font-family:Roboto,sans-serif;letter-spacing:normal}.ruc-custom-theme .mat-mdc-paginator .mat-mdc-form-field-infix{min-height:40px}.ruc-custom-theme .mat-mdc-paginator .mat-mdc-text-field-wrapper .mat-mdc-form-field-flex .mat-mdc-floating-label{top:20px}.ruc-custom-theme .mat-mdc-paginator .mat-mdc-text-field-wrapper.mdc-text-field--outlined .mdc-notched-outline--upgraded .mdc-floating-label--float-above{--mat-mdc-form-field-label-transform: translateY( -26.75px) scale(var(--mat-mdc-form-field-floating-label-scale, .75));transform:var(--mat-mdc-form-field-label-transform)}.ruc-custom-theme .mat-mdc-paginator .mat-mdc-text-field-wrapper.mdc-text-field--outlined .mat-mdc-form-field-infix{padding-top:8px;padding-bottom:8px}.ruc-custom-theme .mat-mdc-paginator .mat-mdc-text-field-wrapper:not(.mdc-text-field--outlined) .mat-mdc-form-field-infix{padding-top:8px;padding-bottom:8px}.ruc-custom-theme .mat-mdc-paginator .mdc-text-field--no-label:not(.mdc-text-field--outlined):not(.mdc-text-field--textarea) .mat-mdc-form-field-infix{padding-top:8px;padding-bottom:8px}.ruc-custom-theme .mat-mdc-paginator .mat-mdc-text-field-wrapper:not(.mdc-text-field--outlined) .mat-mdc-floating-label{display:none}.ruc-custom-theme .mat-mdc-paginator-container{min-height:56px}.ruc-custom-theme .mat-mdc-paginator{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-family:var(--mdc-typography-caption-font-family, var(--mdc-typography-font-family, Roboto, sans-serif));font-size:var(--mdc-typography-caption-font-size, 12px);line-height:var(--mdc-typography-caption-line-height, 20px);font-weight:var(--mdc-typography-caption-font-weight, 400);letter-spacing:var(--mdc-typography-caption-letter-spacing, normal);-webkit-text-decoration:var(--mdc-typography-caption-text-decoration, inherit);text-decoration:var(--mdc-typography-caption-text-decoration, inherit);text-transform:var(--mdc-typography-caption-text-transform, none)}.ruc-custom-theme .mat-mdc-paginator .mat-mdc-select-value{font-size:12px}.ruc-custom-theme .mat-mdc-tab-header .mdc-tab{height:48px}.ruc-custom-theme .mdc-tab{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-family:var(--mdc-typography-button-font-family, var(--mdc-typography-font-family, Roboto, sans-serif));font-size:var(--mdc-typography-button-font-size, 20px);line-height:var(--mdc-typography-button-line-height, 60px);font-weight:var(--mdc-typography-button-font-weight, 500);letter-spacing:var(--mdc-typography-button-letter-spacing, normal);-webkit-text-decoration:var(--mdc-typography-button-text-decoration, none);text-decoration:var(--mdc-typography-button-text-decoration, none);text-transform:var(--mdc-typography-button-text-transform, none)}.ruc-custom-theme .mat-mdc-checkbox .mdc-checkbox{padding:calc((var(--mdc-checkbox-ripple-size, 40px) - 18px) / 2);margin:calc((var(--mdc-checkbox-touch-target-size, 40px) - 40px) / 2)}.ruc-custom-theme .mat-mdc-checkbox .mdc-checkbox .mdc-checkbox__background{top:calc((var(--mdc-checkbox-ripple-size, 40px) - 18px) / 2);left:calc((var(--mdc-checkbox-ripple-size, 40px) - 18px) / 2)}.ruc-custom-theme .mat-mdc-checkbox .mdc-checkbox .mdc-checkbox__native-control{top:calc((40px - var(--mdc-checkbox-touch-target-size, 40px)) / 2);right:calc((40px - var(--mdc-checkbox-touch-target-size, 40px)) / 2);left:calc((40px - var(--mdc-checkbox-touch-target-size, 40px)) / 2);width:var(--mdc-checkbox-touch-target-size, 40px);height:var(--mdc-checkbox-touch-target-size, 40px)}@media all and (-ms-high-contrast: none){.ruc-custom-theme .mdc-checkbox .mdc-checkbox__focus-ring{display:none}}.ruc-custom-theme .mdc-form-field{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-family:var(--mdc-typography-body2-font-family, var(--mdc-typography-font-family, Roboto, sans-serif));font-size:var(--mdc-typography-body2-font-size, 14px);line-height:var(--mdc-typography-body2-line-height, 20px);font-weight:var(--mdc-typography-body2-font-weight, 400);letter-spacing:var(--mdc-typography-body2-letter-spacing, normal);-webkit-text-decoration:var(--mdc-typography-body2-text-decoration, inherit);text-decoration:var(--mdc-typography-body2-text-decoration, inherit);text-transform:var(--mdc-typography-body2-text-transform, none)}.ruc-custom-theme .mat-mdc-button.mat-mdc-button-base,.ruc-custom-theme .mat-mdc-raised-button.mat-mdc-button-base,.ruc-custom-theme .mat-mdc-unelevated-button.mat-mdc-button-base,.ruc-custom-theme .mat-mdc-outlined-button.mat-mdc-button-base{height:36px}.ruc-custom-theme .mdc-button{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-family:var(--mdc-typography-button-font-family, var(--mdc-typography-font-family, Roboto, sans-serif));font-size:var(--mdc-typography-button-font-size, 20px);line-height:var(--mdc-typography-button-line-height, 60px);font-weight:var(--mdc-typography-button-font-weight, 500);letter-spacing:var(--mdc-typography-button-letter-spacing, normal);-webkit-text-decoration:var(--mdc-typography-button-text-decoration, none);text-decoration:var(--mdc-typography-button-text-decoration, none);text-transform:var(--mdc-typography-button-text-transform, none)}.ruc-custom-theme .mat-mdc-icon-button.mat-mdc-button-base{width:48px;height:48px;padding:12px}.ruc-custom-theme .mat-mdc-icon-button.mat-mdc-button-base .mdc-icon-button__focus-ring{max-height:48px;max-width:48px}.ruc-custom-theme .mat-mdc-icon-button.mat-mdc-button-base.mdc-icon-button--reduced-size .mdc-icon-button__ripple{width:40px;height:40px;margin:4px}.ruc-custom-theme .mat-mdc-icon-button.mat-mdc-button-base.mdc-icon-button--reduced-size .mdc-icon-button__focus-ring{max-height:40px;max-width:40px}.ruc-custom-theme .mat-mdc-icon-button.mat-mdc-button-base .mdc-icon-button__touch{position:absolute;top:50%;height:48px;left:50%;width:48px;transform:translate(-50%,-50%)}.ruc-custom-theme .mdc-fab--extended{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-family:var(--mdc-typography-button-font-family, var(--mdc-typography-font-family, Roboto, sans-serif));font-size:var(--mdc-typography-button-font-size, 20px);line-height:var(--mdc-typography-button-line-height, 60px);font-weight:var(--mdc-typography-button-font-weight, 500);letter-spacing:var(--mdc-typography-button-letter-spacing, normal);-webkit-text-decoration:var(--mdc-typography-button-text-decoration, none);text-decoration:var(--mdc-typography-button-text-decoration, none);text-transform:var(--mdc-typography-button-text-transform, none)}.ruc-custom-theme .mat-mdc-snack-bar-container{--mdc-snackbar-supporting-text-font: Roboto, sans-serif;--mdc-snackbar-supporting-text-line-height: 20px;--mdc-snackbar-supporting-text-size: 14px;--mdc-snackbar-supporting-text-weight: 400}.ruc-custom-theme .mat-mdc-table .mdc-data-table__row{height:52px}.ruc-custom-theme .mat-mdc-table .mdc-data-table__pagination{min-height:52px}.ruc-custom-theme .mat-mdc-table .mdc-data-table__header-row{height:56px}.ruc-custom-theme .mdc-data-table__content,.ruc-custom-theme .mdc-data-table__cell{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-family:var(--mdc-typography-body2-font-family, var(--mdc-typography-font-family, Roboto, sans-serif));font-size:var(--mdc-typography-body2-font-size, 14px);line-height:var(--mdc-typography-body2-line-height, 20px);font-weight:var(--mdc-typography-body2-font-weight, 400);letter-spacing:var(--mdc-typography-body2-letter-spacing, normal);-webkit-text-decoration:var(--mdc-typography-body2-text-decoration, inherit);text-decoration:var(--mdc-typography-body2-text-decoration, inherit);text-transform:var(--mdc-typography-body2-text-transform, none)}.ruc-custom-theme .mdc-data-table__header-cell{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-family:var(--mdc-typography-subtitle2-font-family, var(--mdc-typography-font-family, Roboto, sans-serif));font-size:var(--mdc-typography-subtitle2-font-size, 20px);line-height:var(--mdc-typography-subtitle2-line-height, 24px);font-weight:var(--mdc-typography-subtitle2-font-weight, 500);letter-spacing:var(--mdc-typography-subtitle2-letter-spacing, normal);-webkit-text-decoration:var(--mdc-typography-subtitle2-text-decoration, inherit);text-decoration:var(--mdc-typography-subtitle2-text-decoration, inherit);text-transform:var(--mdc-typography-subtitle2-text-transform, none)}.ruc-custom-theme .mat-badge{position:relative}.ruc-custom-theme .mat-badge.mat-badge{overflow:visible}.ruc-custom-theme .mat-badge-hidden .mat-badge-content{display:none}.ruc-custom-theme .mat-badge-content{position:absolute;text-align:center;display:inline-block;border-radius:50%;transition:transform .2s ease-in-out;transform:scale(.6);overflow:hidden;white-space:nowrap;text-overflow:ellipsis;pointer-events:none}.ruc-custom-theme .ng-animate-disabled .mat-badge-content,.ruc-custom-theme .mat-badge-content._mat-animation-noopable{transition:none}.ruc-custom-theme .mat-badge-content.mat-badge-active{transform:none}.ruc-custom-theme .mat-badge-small .mat-badge-content{width:16px;height:16px;line-height:16px}.ruc-custom-theme .mat-badge-small.mat-badge-above .mat-badge-content{top:-8px}.ruc-custom-theme .mat-badge-small.mat-badge-below .mat-badge-content{bottom:-8px}.ruc-custom-theme .mat-badge-small.mat-badge-before .mat-badge-content{left:-16px}[dir=rtl] .ruc-custom-theme .mat-badge-small.mat-badge-before .mat-badge-content{left:auto;right:-16px}.ruc-custom-theme .mat-badge-small.mat-badge-after .mat-badge-content{right:-16px}[dir=rtl] .ruc-custom-theme .mat-badge-small.mat-badge-after .mat-badge-content{right:auto;left:-16px}.ruc-custom-theme .mat-badge-small.mat-badge-overlap.mat-badge-before .mat-badge-content{left:-8px}[dir=rtl] .ruc-custom-theme .mat-badge-small.mat-badge-overlap.mat-badge-before .mat-badge-content{left:auto;right:-8px}.ruc-custom-theme .mat-badge-small.mat-badge-overlap.mat-badge-after .mat-badge-content{right:-8px}[dir=rtl] .ruc-custom-theme .mat-badge-small.mat-badge-overlap.mat-badge-after .mat-badge-content{right:auto;left:-8px}.ruc-custom-theme .mat-badge-medium .mat-badge-content{width:22px;height:22px;line-height:22px}.ruc-custom-theme .mat-badge-medium.mat-badge-above .mat-badge-content{top:-11px}.ruc-custom-theme .mat-badge-medium.mat-badge-below .mat-badge-content{bottom:-11px}.ruc-custom-theme .mat-badge-medium.mat-badge-before .mat-badge-content{left:-22px}[dir=rtl] .ruc-custom-theme .mat-badge-medium.mat-badge-before .mat-badge-content{left:auto;right:-22px}.ruc-custom-theme .mat-badge-medium.mat-badge-after .mat-badge-content{right:-22px}[dir=rtl] .ruc-custom-theme .mat-badge-medium.mat-badge-after .mat-badge-content{right:auto;left:-22px}.ruc-custom-theme .mat-badge-medium.mat-badge-overlap.mat-badge-before .mat-badge-content{left:-11px}[dir=rtl] .ruc-custom-theme .mat-badge-medium.mat-badge-overlap.mat-badge-before .mat-badge-content{left:auto;right:-11px}.ruc-custom-theme .mat-badge-medium.mat-badge-overlap.mat-badge-after .mat-badge-content{right:-11px}[dir=rtl] .ruc-custom-theme .mat-badge-medium.mat-badge-overlap.mat-badge-after .mat-badge-content{right:auto;left:-11px}.ruc-custom-theme .mat-badge-large .mat-badge-content{width:28px;height:28px;line-height:28px}.ruc-custom-theme .mat-badge-large.mat-badge-above .mat-badge-content{top:-14px}.ruc-custom-theme .mat-badge-large.mat-badge-below .mat-badge-content{bottom:-14px}.ruc-custom-theme .mat-badge-large.mat-badge-before .mat-badge-content{left:-28px}[dir=rtl] .ruc-custom-theme .mat-badge-large.mat-badge-before .mat-badge-content{left:auto;right:-28px}.ruc-custom-theme .mat-badge-large.mat-badge-after .mat-badge-content{right:-28px}[dir=rtl] .ruc-custom-theme .mat-badge-large.mat-badge-after .mat-badge-content{right:auto;left:-28px}.ruc-custom-theme .mat-badge-large.mat-badge-overlap.mat-badge-before .mat-badge-content{left:-14px}[dir=rtl] .ruc-custom-theme .mat-badge-large.mat-badge-overlap.mat-badge-before .mat-badge-content{left:auto;right:-14px}.ruc-custom-theme .mat-badge-large.mat-badge-overlap.mat-badge-after .mat-badge-content{right:-14px}[dir=rtl] .ruc-custom-theme .mat-badge-large.mat-badge-overlap.mat-badge-after .mat-badge-content{right:auto;left:-14px}.ruc-custom-theme .mat-badge-content{font-weight:600;font-size:12px;font-family:Roboto,sans-serif}.ruc-custom-theme .mat-badge-small .mat-badge-content{font-size:9px}.ruc-custom-theme .mat-badge-large .mat-badge-content{font-size:24px}.ruc-custom-theme .mat-bottom-sheet-container{font-size:14px;font-weight:400;line-height:20px;font-family:Roboto,sans-serif;letter-spacing:normal}.ruc-custom-theme .mat-button-toggle-appearance-standard .mat-button-toggle-label-content{line-height:48px}.ruc-custom-theme .mat-button-toggle{font-family:Roboto,sans-serif}.ruc-custom-theme .mat-calendar-controls .mat-mdc-icon-button.mat-mdc-button-base{width:40px;height:40px;padding:8px}.ruc-custom-theme .mat-calendar-controls .mat-mdc-icon-button.mat-mdc-button-base .mdc-icon-button__focus-ring{max-height:40px;max-width:40px}.ruc-custom-theme .mat-calendar-controls .mat-mdc-icon-button.mat-mdc-button-base.mdc-icon-button--reduced-size .mdc-icon-button__ripple{width:40px;height:40px;margin:0}.ruc-custom-theme .mat-calendar-controls .mat-mdc-icon-button.mat-mdc-button-base.mdc-icon-button--reduced-size .mdc-icon-button__focus-ring{max-height:40px;max-width:40px}.ruc-custom-theme .mat-calendar-controls .mat-mdc-icon-button.mat-mdc-button-base .mdc-icon-button__touch{position:absolute;top:50%;height:40px;left:50%;width:40px;transform:translate(-50%,-50%)}.ruc-custom-theme .mat-calendar-controls .mat-mdc-icon-button.mat-mdc-button-base .mat-mdc-button-touch-target{display:none}.ruc-custom-theme .mat-calendar{font-family:Roboto,sans-serif}.ruc-custom-theme .mat-calendar-body{font-size:13px}.ruc-custom-theme .mat-calendar-body-label,.ruc-custom-theme .mat-calendar-period-button{font-size:20px;font-weight:500}.ruc-custom-theme .mat-calendar-table-header th{font-size:11px;font-weight:400}.ruc-custom-theme .mat-expansion-panel-header{height:48px}.ruc-custom-theme .mat-expansion-panel-header.mat-expanded{height:64px}.ruc-custom-theme .mat-expansion-panel-header{font-family:Roboto,sans-serif;font-size:15px;font-weight:400}.ruc-custom-theme .mat-expansion-panel-content{font-size:14px;font-weight:400;line-height:20px;font-family:Roboto,sans-serif;letter-spacing:normal}.ruc-custom-theme .mat-grid-tile-header,.ruc-custom-theme .mat-grid-tile-footer{font-size:14px}.ruc-custom-theme .mat-grid-tile-header .mat-line,.ruc-custom-theme .mat-grid-tile-footer .mat-line{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block;box-sizing:border-box}.ruc-custom-theme .mat-grid-tile-header .mat-line:nth-child(n+2),.ruc-custom-theme .mat-grid-tile-footer .mat-line:nth-child(n+2){font-size:12px}.ruc-custom-theme .mat-horizontal-stepper-header{height:72px}.ruc-custom-theme .mat-stepper-label-position-bottom .mat-horizontal-stepper-header,.ruc-custom-theme .mat-vertical-stepper-header{padding:24px}.ruc-custom-theme .mat-stepper-vertical-line:before{top:-16px;bottom:-16px}.ruc-custom-theme .mat-stepper-label-position-bottom .mat-horizontal-stepper-header:after,.ruc-custom-theme .mat-stepper-label-position-bottom .mat-horizontal-stepper-header:before{top:36px}.ruc-custom-theme .mat-stepper-label-position-bottom .mat-stepper-horizontal-line{top:36px}.ruc-custom-theme .mat-stepper-vertical,.ruc-custom-theme .mat-stepper-horizontal{font-family:Roboto,sans-serif}.ruc-custom-theme .mat-step-label{font-size:14px;font-weight:400}.ruc-custom-theme .mat-step-sub-label-error{font-weight:400}.ruc-custom-theme .mat-step-label-error{font-size:20px}.ruc-custom-theme .mat-step-label-selected{font-size:20px;font-weight:500}.ruc-custom-theme .mat-toolbar-multiple-rows{min-height:64px}.ruc-custom-theme .mat-toolbar-row,.ruc-custom-theme .mat-toolbar-single-row{height:64px}@media (max-width: 599px){.ruc-custom-theme .mat-toolbar-multiple-rows{min-height:56px}.ruc-custom-theme .mat-toolbar-row,.ruc-custom-theme .mat-toolbar-single-row{height:56px}}.ruc-custom-theme .mat-toolbar,.ruc-custom-theme .mat-toolbar h1,.ruc-custom-theme .mat-toolbar h2,.ruc-custom-theme .mat-toolbar h3,.ruc-custom-theme .mat-toolbar h4,.ruc-custom-theme .mat-toolbar h5,.ruc-custom-theme .mat-toolbar h6{font-size:20px;font-weight:500;line-height:32px;font-family:Roboto,sans-serif;letter-spacing:normal;margin:0}.ruc-custom-theme .mat-tree-node{min-height:48px}.ruc-custom-theme .mat-tree{font-family:Roboto,sans-serif}.ruc-custom-theme .mat-tree-node,.ruc-custom-theme .mat-nested-tree-node{font-weight:400;font-size:14px}:host{display:block;position:relative;overflow:hidden}.custom-backdrop{position:absolute;inset:0;background-color:#000;z-index:999;visibility:hidden}.ruclib-drawer-container{width:100%;height:400px;border:1px solid #ccc;position:relative;overflow:hidden}.drawer-content-wrapper{padding:16px;position:relative;box-sizing:border-box;height:100%;display:flex;flex-direction:column}.ruclib-drawer-title{margin-top:0;margin-bottom:16px;font-size:1.5em;flex-shrink:0}.ruclib-drawer-close-button{position:absolute;top:8px;right:8px;padding:5px 0 0!important;flex-shrink:0}.ruclib-drawer-body{flex-grow:1;overflow-y:auto;word-break:break-word}.dynamic-drawer{background-color:var(--mat-sidenav-content-background-color, white);position:absolute;box-sizing:border-box;box-shadow:0 2px 10px #0003;z-index:1000;overflow:hidden}.dynamic-drawer.drawer-left{top:0;bottom:0;left:0}.dynamic-drawer.drawer-right{top:0;bottom:0;right:0}.dynamic-drawer.drawer-top{top:0;left:0;right:0}.dynamic-drawer.drawer-bottom{bottom:0;left:0;right:0}.dynamic-drawer.light-theme{background-color:#fff;color:#000000de}.dynamic-drawer.light-theme .ruclib-drawer-title{color:#000000de}.dynamic-drawer.light-theme .ruclib-drawer-close-button .mat-icon{color:#0000008a}.dynamic-drawer.dark-theme{background-color:#424242;color:#fff}.dynamic-drawer.dark-theme .ruclib-drawer-title,.dynamic-drawer.dark-theme .ruclib-drawer-close-button .mat-icon{color:#fff}.dynamic-drawer.custom-theme-one{background-color:#fff;color:#000000de}.dynamic-drawer.custom-theme-one .ruclib-drawer-title{color:#000000de}.dynamic-drawer.custom-theme-one .ruclib-drawer-close-button .mat-icon{color:#0000008a}.dynamic-drawer.custom-theme-two{background-color:#424242;color:#fff}.dynamic-drawer.custom-theme-two .ruclib-drawer-title,.dynamic-drawer.custom-theme-two .ruclib-drawer-close-button .mat-icon{color:#fff}.ruclib-drawer-toggle-image{object-fit:contain;display:block}.drawer-toggle-button{margin-bottom:15px;display:inline-flex;align-items:center;justify-content:center;gap:8px}.ruclib-main-content{padding:16px;display:flex;flex-direction:column;align-items:flex-start}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i2.MatIconButton, selector: "button[mat-icon-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i3.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i4.MatDrawerContainer, selector: "mat-drawer-container", inputs: ["autosize", "hasBackdrop"], outputs: ["backdropClick"], exportAs: ["matDrawerContainer"] }, { kind: "component", type: i4.MatDrawerContent, selector: "mat-drawer-content" }, { kind: "pipe", type: i5.SafeHtmlPipe, name: "safeHtml" }], animations: [
342
+ trigger('backdropFade', [
343
+ state('out', style({ opacity: 0, visibility: 'hidden' })),
344
+ state('in', style({ opacity: 0.6, visibility: 'visible' })),
345
+ transition('out => in', animate('{{duration}} ease-in')),
346
+ transition('in => out', animate('{{duration}} ease-out')),
347
+ ]),
348
+ trigger('slideInOutLeft', [
349
+ state('out', style({ transform: 'translateX(-100%)', visibility: 'hidden' })),
350
+ state('in', style({ transform: 'translateX(0)', visibility: 'visible' })),
351
+ transition('out <=> in', animate('{{duration}} ease-in-out')),
352
+ ]),
353
+ trigger('slideInOutRight', [
354
+ state('out', style({ transform: 'translateX(100%)', visibility: 'hidden' })),
355
+ state('in', style({ transform: 'translateX(0)', visibility: 'visible' })),
356
+ transition('out <=> in', animate('{{duration}} ease-in-out')),
357
+ ]),
358
+ trigger('slideInOutTop', [
359
+ state('out', style({ transform: 'translateY(-100%)', visibility: 'hidden' })),
360
+ state('in', style({ transform: 'translateY(0%)', visibility: 'visible' })),
361
+ transition('out <=> in', animate('{{duration}} ease-in-out')),
362
+ ]),
363
+ trigger('slideInOutBottom', [
364
+ state('out', style({ transform: 'translateY(100%)', visibility: 'hidden' })),
365
+ state('in', style({ transform: 'translateY(0%)', visibility: 'visible' })),
366
+ transition('out <=> in', animate('{{duration}} ease-in-out')),
367
+ ])
368
+ ] });
369
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: RuclibDrawerComponent, decorators: [{
370
+ type: Component,
371
+ args: [{ selector: 'uxp-ruclib-drawer', animations: [
372
+ trigger('backdropFade', [
373
+ state('out', style({ opacity: 0, visibility: 'hidden' })),
374
+ state('in', style({ opacity: 0.6, visibility: 'visible' })),
375
+ transition('out => in', animate('{{duration}} ease-in')),
376
+ transition('in => out', animate('{{duration}} ease-out')),
377
+ ]),
378
+ trigger('slideInOutLeft', [
379
+ state('out', style({ transform: 'translateX(-100%)', visibility: 'hidden' })),
380
+ state('in', style({ transform: 'translateX(0)', visibility: 'visible' })),
381
+ transition('out <=> in', animate('{{duration}} ease-in-out')),
382
+ ]),
383
+ trigger('slideInOutRight', [
384
+ state('out', style({ transform: 'translateX(100%)', visibility: 'hidden' })),
385
+ state('in', style({ transform: 'translateX(0)', visibility: 'visible' })),
386
+ transition('out <=> in', animate('{{duration}} ease-in-out')),
387
+ ]),
388
+ trigger('slideInOutTop', [
389
+ state('out', style({ transform: 'translateY(-100%)', visibility: 'hidden' })),
390
+ state('in', style({ transform: 'translateY(0%)', visibility: 'visible' })),
391
+ transition('out <=> in', animate('{{duration}} ease-in-out')),
392
+ ]),
393
+ trigger('slideInOutBottom', [
394
+ state('out', style({ transform: 'translateY(100%)', visibility: 'hidden' })),
395
+ state('in', style({ transform: 'translateY(0%)', visibility: 'visible' })),
396
+ transition('out <=> in', animate('{{duration}} ease-in-out')),
397
+ ])
398
+ ], template: "<!-- \r\n Custom Backdrop element.\r\n Visible only when:\r\n - rucInputData.mode is 'over'\r\n - rucInputData.hasBackdrop is true (or undefined, defaulting to true)\r\n - drawerAnimationState is 'in' (drawer is open or opening)\r\n Animates using 'backdropFade' trigger.\r\n Clicking the backdrop will toggle the drawer for the current position.\r\n Background color can be customized via rucInputData.backdropBackgroundColor.\r\n-->\r\n<div class=\"custom-backdrop\"\r\n *ngIf=\"rucInputData.mode === 'over' && (rucInputData.hasBackdrop ?? true) && drawerAnimationState === 'in'\"\r\n [@backdropFade]=\"backdropAnimationParams\"\r\n (click)=\"handleBackdropClick()\"\r\n [style.background-color]=\"rucInputData.hasBackdrop ? rucInputData.backdropBackgroundColor : ''\">\r\n</div>\r\n\r\n<!-- \r\n Custom Dynamic Drawer element.\r\n This is the main panel that slides in and out.\r\n - Applies CSS classes based on currentDrawerPosition and customTheme.\r\n - Dynamically sets width and height based on drawer orientation and input data.\r\n - Uses one of four animation triggers (slideInOutLeft, slideInOutRight, slideInOutTop, slideInOutBottom)\r\n based on currentDrawerPosition. Only the active trigger runs its animation; others are set to an\r\n instant 'out' state to prevent interference.\r\n - Animation completion events are handled by onAnimationDone().\r\n-->\r\n\r\n<div class=\"main\">\r\n <div class=\"dynamic-drawer\"\r\n [ngClass]=\"'drawer-' + currentDrawerPosition + ' ' + (customTheme || '')\"\r\n [style.width]=\"!isVerticalLayout ? effectiveDrawerDimension : '100%'\"\r\n [style.height]=\"isVerticalLayout ? effectiveDrawerDimension : '100%'\"\r\n\r\n [@slideInOutLeft]=\"currentDrawerPosition === 'left' ? animationParams : {value: 'out', params: {duration: '0ms'}}\"\r\n (@slideInOutLeft.done)=\"currentDrawerPosition === 'left' && onAnimationDone($event)\"\r\n\r\n [@slideInOutRight]=\"currentDrawerPosition === 'right' ? animationParams : {value: 'out', params: {duration: '0ms'}}\"\r\n (@slideInOutRight.done)=\"currentDrawerPosition === 'right' && onAnimationDone($event)\"\r\n\r\n [@slideInOutTop]=\"currentDrawerPosition === 'top' ? animationParams : {value: 'out', params: {duration: '0ms'}}\"\r\n (@slideInOutTop.done)=\"currentDrawerPosition === 'top' && onAnimationDone($event)\"\r\n\r\n [@slideInOutBottom]=\"currentDrawerPosition === 'bottom' ? animationParams : {value: 'out', params: {duration: '0ms'}}\"\r\n (@slideInOutBottom.done)=\"currentDrawerPosition === 'bottom' && onAnimationDone($event)\">\r\n\r\n <!-- Wrapper for the content inside the drawer, handles padding and layout. -->\r\n <div class=\"drawer-content-wrapper\">\r\n <!-- Optional title for the drawer. -->\r\n <h2 *ngIf=\"rucInputData.content?.drawerTitle\" class=\"ruclib-drawer-title\">\r\n {{ rucInputData.content?.drawerTitle }}\r\n </h2>\r\n <!-- \r\n Optional close button inside the drawer.\r\n Toggles the drawer for the current position when clicked.\r\n ARIA label provides accessibility.\r\n Dimensions can be customized via rucInputData.closeButtonDimensions.\r\n -->\r\n <button *ngIf=\"rucInputData.showCloseIcon\"\r\n mat-icon-button class=\"ruclib-drawer-close-button\"\r\n (click)=\"toggleDrawer(currentDrawerPosition)\"\r\n [attr.aria-label]=\"'Close ' + currentDrawerPosition + ' drawer'\"\r\n [style.width]=\"rucInputData.closeButtonDimensions?.width\"\r\n [style.height]=\"rucInputData.closeButtonDimensions?.height\">\r\n <!-- Material icon for the close button. Size can be customized. -->\r\n <mat-icon [style.font-size]=\"rucInputData.closeButtonDimensions?.iconSize\">close</mat-icon>\r\n </button>\r\n <!-- Main body content of the drawer. -->\r\n <div class=\"ruclib-drawer-body\">\r\n <!-- Host for dynamically injected component -->\r\n <ng-template #drawerComponentHost></ng-template>\r\n <!-- Fallback to HTML content if no component is provided -->\r\n <div *ngIf=\"!rucInputData.content?.drawerContentComponent\" [innerHTML]=\"rucInputData.content?.drawerBody || '' | safeHtml\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<!-- \r\n Angular Material Drawer Container.\r\n Acts as the main container for the drawer system, especially if 'side' or 'push' modes\r\n were to be implemented with MatDrawer's native behavior. With custom fixed-position animations,\r\n its primary role here is to host the mat-drawer-content.\r\n - Applies 'vertical-layout' class if the drawer is top/bottom.\r\n - MatDrawer's own backdrop is disabled as a custom one is used.\r\n-->\r\n<mat-drawer-container\r\n class=\"ruclib-drawer-container\"\r\n [class.vertical-layout]=\"isVerticalLayout\"\r\n [hasBackdrop]=\"false\"> <!-- MatDrawer's backdrop is not used with custom animation -->\r\n <mat-drawer-content class=\"ruclib-main-content\">\r\n <button [disabled]=\"rucInputData.disableToggleButtonInMainContent\"\r\n mat-raised-button\r\n color=\"primary\"\r\n title=\"Toggle Drawer\"\r\n class=\"drawer-toggle-button\"\r\n [style.width]=\"rucInputData.toggleButtonDimensions?.width\"\r\n [style.height]=\"rucInputData.toggleButtonDimensions?.height\"\r\n [style.padding]=\"rucInputData.toggleButtonDimensions?.padding\"\r\n [style.font-size]=\"rucInputData.toggleButtonDimensions?.fontSize\"\r\n (click)=\"toggleDrawer(currentDrawerPosition)\"\r\n [attr.aria-label]=\"getToggleButtonAriaLabel()\"\r\n [attr.aria-expanded]=\"drawerAnimationState === 'in'\">\r\n <!-- Optional Material icon for the toggle button. Show only if no image URL is provided. -->\r\n <mat-icon *ngIf=\"rucInputData.toggleButtonIcon && !rucInputData.toggleButtonImageUrl\" [style.font-size]=\"rucInputData.toggleButtonDimensions?.iconSize\">{{ rucInputData.toggleButtonIcon }}</mat-icon>\r\n <!-- Optional image for the toggle button. If present, it should fill the button. -->\r\n <img *ngIf=\"rucInputData.toggleButtonImageUrl\"\r\n [src]=\"rucInputData.toggleButtonImageUrl\"\r\n [alt]=\"rucInputData.toggleButtonImageAlt || 'Toggle Drawer'\"\r\n class=\"ruclib-drawer-toggle-image\"\r\n [style.width]=\"rucInputData.toggleButtonDimensions?.width\"\r\n [style.height]=\"rucInputData.toggleButtonDimensions?.height\"\r\n [style.padding]=\"rucInputData.toggleButtonDimensions?.padding\">\r\n <!-- Text for the toggle button. Show only if NO icon AND NO image URL is provided. -->\r\n <span *ngIf=\"!rucInputData.toggleButtonIcon && !rucInputData.toggleButtonImageUrl && (rucInputData.toggleButtonText?.open || rucInputData.toggleButtonText?.close)\">\r\n {{ drawerAnimationState === 'in' ? (rucInputData.toggleButtonText?.close || 'Close') : (rucInputData.toggleButtonText?.open || 'Open') }}\r\n </span>\r\n <!-- Text for the toggle button when an icon (but NO image) IS also present. -->\r\n <span *ngIf=\"rucInputData.toggleButtonIcon && !rucInputData.toggleButtonImageUrl && (rucInputData.toggleButtonText?.open || rucInputData.toggleButtonText?.close)\" class=\"toggle-button-text-with-icon\">\r\n {{ drawerAnimationState === 'in' ? (rucInputData.toggleButtonText?.close || 'Close') : (rucInputData.toggleButtonText?.open || 'Open') }}\r\n </span>\r\n </button>\r\n <!-- Main application content area, rendered from HTML string via safeHtml pipe. -->\r\n <div [innerHTML]=\"rucInputData.content?.mainBody || '' | safeHtml\"></div>\r\n </mat-drawer-content>\r\n</mat-drawer-container>", styles: [".mat-ripple{overflow:hidden;position:relative}.mat-ripple:not(:empty){transform:translateZ(0)}.mat-ripple.mat-ripple-unbounded{overflow:visible}.mat-ripple-element{position:absolute;border-radius:50%;pointer-events:none;transition:opacity,transform 0ms cubic-bezier(0,0,.2,1);transform:scale3d(0,0,0)}.cdk-high-contrast-active .mat-ripple-element{display:none}.cdk-visually-hidden{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;white-space:nowrap;outline:0;-webkit-appearance:none;-moz-appearance:none;left:0}[dir=rtl] .cdk-visually-hidden{left:auto;right:0}.cdk-overlay-container,.cdk-global-overlay-wrapper{pointer-events:none;top:0;left:0;height:100%;width:100%}.cdk-overlay-container{position:fixed;z-index:1000}.cdk-overlay-container:empty{display:none}.cdk-global-overlay-wrapper{display:flex;position:absolute;z-index:1000}.cdk-overlay-pane{position:absolute;pointer-events:auto;box-sizing:border-box;z-index:1000;display:flex;max-width:100%;max-height:100%}.cdk-overlay-backdrop{position:absolute;inset:0;z-index:1000;pointer-events:auto;-webkit-tap-highlight-color:transparent;transition:opacity .4s cubic-bezier(.25,.8,.25,1);opacity:0}.cdk-overlay-backdrop.cdk-overlay-backdrop-showing{opacity:1}.cdk-high-contrast-active .cdk-overlay-backdrop.cdk-overlay-backdrop-showing{opacity:.6}.cdk-overlay-dark-backdrop{background:rgba(0,0,0,.32)}.cdk-overlay-transparent-backdrop{transition:visibility 1ms linear,opacity 1ms linear;visibility:hidden;opacity:1}.cdk-overlay-transparent-backdrop.cdk-overlay-backdrop-showing{opacity:0;visibility:visible}.cdk-overlay-backdrop-noop-animation{transition:none}.cdk-overlay-connected-position-bounding-box{position:absolute;z-index:1000;display:flex;flex-direction:column;min-width:1px;min-height:1px}.cdk-global-scrollblock{position:fixed;width:100%;overflow-y:scroll}textarea.cdk-textarea-autosize{resize:none}textarea.cdk-textarea-autosize-measuring{padding:2px 0!important;box-sizing:content-box!important;height:auto!important;overflow:hidden!important}textarea.cdk-textarea-autosize-measuring-firefox{padding:2px 0!important;box-sizing:content-box!important;height:0!important}@keyframes cdk-text-field-autofill-start{}@keyframes cdk-text-field-autofill-end{}.cdk-text-field-autofill-monitored:-webkit-autofill{animation:cdk-text-field-autofill-start 0s 1ms}.cdk-text-field-autofill-monitored:not(:-webkit-autofill){animation:cdk-text-field-autofill-end 0s 1ms}.mat-focus-indicator{position:relative}.mat-focus-indicator:before{inset:0;position:absolute;box-sizing:border-box;pointer-events:none;display:var(--mat-focus-indicator-display, none);border:var(--mat-focus-indicator-border-width, 3px) var(--mat-focus-indicator-border-style, solid) var(--mat-focus-indicator-border-color, transparent);border-radius:var(--mat-focus-indicator-border-radius, 4px)}.mat-focus-indicator:focus:before{content:\"\"}.cdk-high-contrast-active{--mat-focus-indicator-display: block}.mat-mdc-focus-indicator{position:relative}.mat-mdc-focus-indicator:before{inset:0;position:absolute;box-sizing:border-box;pointer-events:none;display:var(--mat-mdc-focus-indicator-display, none);border:var(--mat-mdc-focus-indicator-border-width, 3px) var(--mat-mdc-focus-indicator-border-style, solid) var(--mat-mdc-focus-indicator-border-color, transparent);border-radius:var(--mat-mdc-focus-indicator-border-radius, 4px)}.mat-mdc-focus-indicator:focus:before{content:\"\"}.cdk-high-contrast-active{--mat-mdc-focus-indicator-display: block}.main{font-size:16px;font-weight:400;line-height:24px;font-family:Roboto,sans-serif;letter-spacing:.03125em}.ruc-custom-theme{font-size:14px;font-weight:400;line-height:20px;font-family:Roboto,sans-serif;letter-spacing:normal}.ruc-custom-theme .mat-mdc-option{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-family:var(--mdc-typography-body1-font-family, var(--mdc-typography-font-family, Roboto, sans-serif));font-size:var(--mdc-typography-body1-font-size, 15px);line-height:var(--mdc-typography-body1-line-height, 24px);font-weight:var(--mdc-typography-body1-font-weight, 400);letter-spacing:var(--mdc-typography-body1-letter-spacing, normal)}.ruc-custom-theme .mat-mdc-card-title{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-family:var(--mdc-typography-headline6-font-family, var(--mdc-typography-font-family, Roboto, sans-serif));font-size:var(--mdc-typography-headline6-font-size, 20px);line-height:var(--mdc-typography-headline6-line-height, 32px);font-weight:var(--mdc-typography-headline6-font-weight, 500);letter-spacing:var(--mdc-typography-headline6-letter-spacing, normal);-webkit-text-decoration:var(--mdc-typography-headline6-text-decoration, inherit);text-decoration:var(--mdc-typography-headline6-text-decoration, inherit);text-transform:var(--mdc-typography-headline6-text-transform, none)}.ruc-custom-theme .mat-mdc-card-subtitle{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-family:var(--mdc-typography-subtitle2-font-family, var(--mdc-typography-font-family, Roboto, sans-serif));font-size:var(--mdc-typography-subtitle2-font-size, 20px);line-height:var(--mdc-typography-subtitle2-line-height, 24px);font-weight:var(--mdc-typography-subtitle2-font-weight, 500);letter-spacing:var(--mdc-typography-subtitle2-letter-spacing, normal);-webkit-text-decoration:var(--mdc-typography-subtitle2-text-decoration, inherit);text-decoration:var(--mdc-typography-subtitle2-text-decoration, inherit);text-transform:var(--mdc-typography-subtitle2-text-transform, none)}.ruc-custom-theme .mat-mdc-tooltip{--mdc-plain-tooltip-supporting-text-font: Roboto, sans-serif;--mdc-plain-tooltip-supporting-text-size: 12px;--mdc-plain-tooltip-supporting-text-weight: 400;--mdc-plain-tooltip-supporting-text-tracking: normal}.ruc-custom-theme .mat-mdc-form-field-infix{min-height:56px}.ruc-custom-theme .mat-mdc-text-field-wrapper .mat-mdc-form-field-flex .mat-mdc-floating-label{top:28px}.ruc-custom-theme .mat-mdc-text-field-wrapper.mdc-text-field--outlined .mdc-notched-outline--upgraded .mdc-floating-label--float-above{--mat-mdc-form-field-label-transform: translateY( -34.75px) scale(var(--mat-mdc-form-field-floating-label-scale, .75));transform:var(--mat-mdc-form-field-label-transform)}.ruc-custom-theme .mat-mdc-text-field-wrapper.mdc-text-field--outlined .mat-mdc-form-field-infix{padding-top:16px;padding-bottom:16px}.ruc-custom-theme .mat-mdc-text-field-wrapper:not(.mdc-text-field--outlined) .mat-mdc-form-field-infix{padding-top:24px;padding-bottom:8px}.ruc-custom-theme .mdc-text-field--no-label:not(.mdc-text-field--outlined):not(.mdc-text-field--textarea) .mat-mdc-form-field-infix{padding-top:16px;padding-bottom:16px}.ruc-custom-theme .mdc-text-field__input,.ruc-custom-theme .mdc-text-field__affix{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-family:var(--mdc-typography-subtitle1-font-family, var(--mdc-typography-font-family, Roboto, sans-serif));font-size:var(--mdc-typography-subtitle1-font-size, 16px);font-weight:var(--mdc-typography-subtitle1-font-weight, 400);letter-spacing:var(--mdc-typography-subtitle1-letter-spacing, normal);-webkit-text-decoration:var(--mdc-typography-subtitle1-text-decoration, inherit);text-decoration:var(--mdc-typography-subtitle1-text-decoration, inherit);text-transform:var(--mdc-typography-subtitle1-text-transform, none)}.ruc-custom-theme .mdc-text-field--textarea .mdc-text-field__input{line-height:1.5rem}.ruc-custom-theme .mdc-floating-label{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-family:var(--mdc-typography-subtitle1-font-family, var(--mdc-typography-font-family, Roboto, sans-serif));font-size:var(--mdc-typography-subtitle1-font-size, 16px);font-weight:var(--mdc-typography-subtitle1-font-weight, 400);letter-spacing:var(--mdc-typography-subtitle1-letter-spacing, normal);-webkit-text-decoration:var(--mdc-typography-subtitle1-text-decoration, inherit);text-decoration:var(--mdc-typography-subtitle1-text-decoration, inherit);text-transform:var(--mdc-typography-subtitle1-text-transform, none)}.ruc-custom-theme .mat-mdc-form-field-subscript-wrapper,.ruc-custom-theme .mat-mdc-form-field-bottom-align:before{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-family:var(--mdc-typography-caption-font-family, var(--mdc-typography-font-family, Roboto, sans-serif));font-size:var(--mdc-typography-caption-font-size, 12px);line-height:var(--mdc-typography-caption-line-height, 20px);font-weight:var(--mdc-typography-caption-font-weight, 400);letter-spacing:var(--mdc-typography-caption-letter-spacing, normal);-webkit-text-decoration:var(--mdc-typography-caption-text-decoration, inherit);text-decoration:var(--mdc-typography-caption-text-decoration, inherit);text-transform:var(--mdc-typography-caption-text-transform, none)}.ruc-custom-theme .mat-mdc-form-field,.ruc-custom-theme .mat-mdc-floating-label{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-family:var(--mdc-typography-body1-font-family, var(--mdc-typography-font-family, Roboto, sans-serif));font-size:var(--mdc-typography-body1-font-size, 15px);line-height:var(--mdc-typography-body1-line-height, 24px);font-weight:var(--mdc-typography-body1-font-weight, 400);letter-spacing:var(--mdc-typography-body1-letter-spacing, normal);-webkit-text-decoration:var(--mdc-typography-body1-text-decoration, inherit);text-decoration:var(--mdc-typography-body1-text-decoration, inherit);text-transform:var(--mdc-typography-body1-text-transform, none)}.ruc-custom-theme .mat-mdc-form-field .mdc-text-field--outlined .mdc-floating-label--float-above{font-size:calc(15px * var(--mat-mdc-form-field-floating-label-scale, .75))}.ruc-custom-theme .mat-mdc-form-field .mdc-text-field--outlined .mdc-notched-outline--upgraded .mdc-floating-label--float-above{font-size:15px}.ruc-custom-theme .mat-mdc-select-panel{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-family:var(--mdc-typography-subtitle1-font-family, var(--mdc-typography-font-family, Roboto, sans-serif));font-size:var(--mdc-typography-subtitle1-font-size, 16px);line-height:var(--mdc-typography-subtitle1-line-height, 28px);font-weight:var(--mdc-typography-subtitle1-font-weight, 400);letter-spacing:var(--mdc-typography-subtitle1-letter-spacing, normal);-webkit-text-decoration:var(--mdc-typography-subtitle1-text-decoration, inherit);text-decoration:var(--mdc-typography-subtitle1-text-decoration, inherit);text-transform:var(--mdc-typography-subtitle1-text-transform, none);line-height:24px}.ruc-custom-theme .mat-mdc-select{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-family:var(--mdc-typography-body1-font-family, var(--mdc-typography-font-family, Roboto, sans-serif));font-size:var(--mdc-typography-body1-font-size, 15px);line-height:var(--mdc-typography-body1-line-height, 24px);font-weight:var(--mdc-typography-body1-font-weight, 400);letter-spacing:var(--mdc-typography-body1-letter-spacing, normal);-webkit-text-decoration:var(--mdc-typography-body1-text-decoration, inherit);text-decoration:var(--mdc-typography-body1-text-decoration, inherit);text-transform:var(--mdc-typography-body1-text-transform, none)}.ruc-custom-theme .mat-mdc-autocomplete-panel{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-family:var(--mdc-typography-subtitle1-font-family, var(--mdc-typography-font-family, Roboto, sans-serif));font-size:var(--mdc-typography-subtitle1-font-size, 16px);line-height:var(--mdc-typography-subtitle1-line-height, 28px);font-weight:var(--mdc-typography-subtitle1-font-weight, 400);letter-spacing:var(--mdc-typography-subtitle1-letter-spacing, normal);-webkit-text-decoration:var(--mdc-typography-subtitle1-text-decoration, inherit);text-decoration:var(--mdc-typography-subtitle1-text-decoration, inherit);text-transform:var(--mdc-typography-subtitle1-text-transform, none);line-height:24px}.ruc-custom-theme .mat-mdc-dialog-container{--mdc-dialog-subhead-font: Roboto, sans-serif;--mdc-dialog-subhead-line-height: 32px;--mdc-dialog-subhead-size: 20px;--mdc-dialog-subhead-weight: 500;--mdc-dialog-subhead-tracking: normal;--mdc-dialog-supporting-text-font: Roboto, sans-serif;--mdc-dialog-supporting-text-line-height: 24px;--mdc-dialog-supporting-text-size: 15px;--mdc-dialog-supporting-text-weight: 400;--mdc-dialog-supporting-text-tracking: normal}.ruc-custom-theme .mat-mdc-chip{height:32px}.ruc-custom-theme .mat-mdc-standard-chip{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-family:var(--mdc-typography-body2-font-family, var(--mdc-typography-font-family, Roboto, sans-serif));font-size:var(--mdc-typography-body2-font-size, 14px);line-height:var(--mdc-typography-body2-line-height, 20px);font-weight:var(--mdc-typography-body2-font-weight, 400);letter-spacing:var(--mdc-typography-body2-letter-spacing, normal);-webkit-text-decoration:var(--mdc-typography-body2-text-decoration, inherit);text-decoration:var(--mdc-typography-body2-text-decoration, inherit);text-transform:var(--mdc-typography-body2-text-transform, none)}.ruc-custom-theme .mat-mdc-slide-toggle{--mdc-switch-state-layer-size: 48px}.ruc-custom-theme .mat-mdc-radio-button .mdc-radio{padding:10px}.ruc-custom-theme .mat-mdc-radio-button .mdc-radio .mdc-radio__background:before{top:-10px;left:-10px;width:40px;height:40px}.ruc-custom-theme .mat-mdc-radio-button .mdc-radio .mdc-radio__native-control{top:0;right:0;left:0;width:40px;height:40px}.ruc-custom-theme .mat-mdc-slider{--mdc-slider-label-label-text-font: Roboto, sans-serif;--mdc-slider-label-label-text-size: 20px;--mdc-slider-label-label-text-line-height: 24px;--mdc-slider-label-label-text-tracking: normal;--mdc-slider-label-label-text-weight: 500}.ruc-custom-theme .mat-mdc-menu-content{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-family:var(--mdc-typography-subtitle1-font-family, var(--mdc-typography-font-family, Roboto, sans-serif));font-size:var(--mdc-typography-subtitle1-font-size, 16px);line-height:var(--mdc-typography-subtitle1-line-height, 28px);font-weight:var(--mdc-typography-subtitle1-font-weight, 400);letter-spacing:var(--mdc-typography-subtitle1-letter-spacing, normal);-webkit-text-decoration:var(--mdc-typography-subtitle1-text-decoration, inherit);text-decoration:var(--mdc-typography-subtitle1-text-decoration, inherit);text-transform:var(--mdc-typography-subtitle1-text-transform, none);line-height:24px}.ruc-custom-theme .mat-mdc-menu-content,.ruc-custom-theme .mat-mdc-menu-content .mat-mdc-menu-item .mdc-list-item__primary-text{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-family:var(--mdc-typography-body1-font-family, var(--mdc-typography-font-family, Roboto, sans-serif));font-size:var(--mdc-typography-body1-font-size, 15px);line-height:var(--mdc-typography-body1-line-height, 24px);font-weight:var(--mdc-typography-body1-font-weight, 400);letter-spacing:var(--mdc-typography-body1-letter-spacing, normal);-webkit-text-decoration:var(--mdc-typography-body1-text-decoration, inherit);text-decoration:var(--mdc-typography-body1-text-decoration, inherit);text-transform:var(--mdc-typography-body1-text-transform, none)}.ruc-custom-theme .mat-mdc-list-base{--mdc-list-list-item-one-line-container-height: 48px;--mdc-list-list-item-two-line-container-height: 64px;--mdc-list-list-item-three-line-container-height: 88px}.ruc-custom-theme .mat-mdc-list-item.mdc-list-item--with-leading-avatar.mdc-list-item--with-one-line,.ruc-custom-theme .mat-mdc-list-item.mdc-list-item--with-leading-checkbox.mdc-list-item--with-one-line,.ruc-custom-theme .mat-mdc-list-item.mdc-list-item--with-leading-icon.mdc-list-item--with-one-line{height:56px}.ruc-custom-theme .mat-mdc-list-item.mdc-list-item--with-leading-avatar.mdc-list-item--with-two-lines,.ruc-custom-theme .mat-mdc-list-item.mdc-list-item--with-leading-checkbox.mdc-list-item--with-two-lines,.ruc-custom-theme .mat-mdc-list-item.mdc-list-item--with-leading-icon.mdc-list-item--with-two-lines{height:72px}.ruc-custom-theme .mat-mdc-list-base{--mdc-list-list-item-label-text-font: Roboto, sans-serif;--mdc-list-list-item-label-text-line-height: 24px;--mdc-list-list-item-label-text-size: 15px;--mdc-list-list-item-label-text-tracking: normal;--mdc-list-list-item-label-text-weight: 400;--mdc-list-list-item-supporting-text-font: Roboto, sans-serif;--mdc-list-list-item-supporting-text-line-height: 20px;--mdc-list-list-item-supporting-text-size: 14px;--mdc-list-list-item-supporting-text-tracking: normal;--mdc-list-list-item-supporting-text-weight: 400;--mdc-list-list-item-trailing-supporting-text-font: Roboto, sans-serif;--mdc-list-list-item-trailing-supporting-text-line-height: 20px;--mdc-list-list-item-trailing-supporting-text-size: 12px;--mdc-list-list-item-trailing-supporting-text-tracking: normal;--mdc-list-list-item-trailing-supporting-text-weight: 400}.ruc-custom-theme .mdc-list-group__subheader{font-size:16px;font-weight:400;line-height:28px;font-family:Roboto,sans-serif;letter-spacing:normal}.ruc-custom-theme .mat-mdc-paginator .mat-mdc-form-field-infix{min-height:40px}.ruc-custom-theme .mat-mdc-paginator .mat-mdc-text-field-wrapper .mat-mdc-form-field-flex .mat-mdc-floating-label{top:20px}.ruc-custom-theme .mat-mdc-paginator .mat-mdc-text-field-wrapper.mdc-text-field--outlined .mdc-notched-outline--upgraded .mdc-floating-label--float-above{--mat-mdc-form-field-label-transform: translateY( -26.75px) scale(var(--mat-mdc-form-field-floating-label-scale, .75));transform:var(--mat-mdc-form-field-label-transform)}.ruc-custom-theme .mat-mdc-paginator .mat-mdc-text-field-wrapper.mdc-text-field--outlined .mat-mdc-form-field-infix{padding-top:8px;padding-bottom:8px}.ruc-custom-theme .mat-mdc-paginator .mat-mdc-text-field-wrapper:not(.mdc-text-field--outlined) .mat-mdc-form-field-infix{padding-top:8px;padding-bottom:8px}.ruc-custom-theme .mat-mdc-paginator .mdc-text-field--no-label:not(.mdc-text-field--outlined):not(.mdc-text-field--textarea) .mat-mdc-form-field-infix{padding-top:8px;padding-bottom:8px}.ruc-custom-theme .mat-mdc-paginator .mat-mdc-text-field-wrapper:not(.mdc-text-field--outlined) .mat-mdc-floating-label{display:none}.ruc-custom-theme .mat-mdc-paginator-container{min-height:56px}.ruc-custom-theme .mat-mdc-paginator{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-family:var(--mdc-typography-caption-font-family, var(--mdc-typography-font-family, Roboto, sans-serif));font-size:var(--mdc-typography-caption-font-size, 12px);line-height:var(--mdc-typography-caption-line-height, 20px);font-weight:var(--mdc-typography-caption-font-weight, 400);letter-spacing:var(--mdc-typography-caption-letter-spacing, normal);-webkit-text-decoration:var(--mdc-typography-caption-text-decoration, inherit);text-decoration:var(--mdc-typography-caption-text-decoration, inherit);text-transform:var(--mdc-typography-caption-text-transform, none)}.ruc-custom-theme .mat-mdc-paginator .mat-mdc-select-value{font-size:12px}.ruc-custom-theme .mat-mdc-tab-header .mdc-tab{height:48px}.ruc-custom-theme .mdc-tab{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-family:var(--mdc-typography-button-font-family, var(--mdc-typography-font-family, Roboto, sans-serif));font-size:var(--mdc-typography-button-font-size, 20px);line-height:var(--mdc-typography-button-line-height, 60px);font-weight:var(--mdc-typography-button-font-weight, 500);letter-spacing:var(--mdc-typography-button-letter-spacing, normal);-webkit-text-decoration:var(--mdc-typography-button-text-decoration, none);text-decoration:var(--mdc-typography-button-text-decoration, none);text-transform:var(--mdc-typography-button-text-transform, none)}.ruc-custom-theme .mat-mdc-checkbox .mdc-checkbox{padding:calc((var(--mdc-checkbox-ripple-size, 40px) - 18px) / 2);margin:calc((var(--mdc-checkbox-touch-target-size, 40px) - 40px) / 2)}.ruc-custom-theme .mat-mdc-checkbox .mdc-checkbox .mdc-checkbox__background{top:calc((var(--mdc-checkbox-ripple-size, 40px) - 18px) / 2);left:calc((var(--mdc-checkbox-ripple-size, 40px) - 18px) / 2)}.ruc-custom-theme .mat-mdc-checkbox .mdc-checkbox .mdc-checkbox__native-control{top:calc((40px - var(--mdc-checkbox-touch-target-size, 40px)) / 2);right:calc((40px - var(--mdc-checkbox-touch-target-size, 40px)) / 2);left:calc((40px - var(--mdc-checkbox-touch-target-size, 40px)) / 2);width:var(--mdc-checkbox-touch-target-size, 40px);height:var(--mdc-checkbox-touch-target-size, 40px)}@media all and (-ms-high-contrast: none){.ruc-custom-theme .mdc-checkbox .mdc-checkbox__focus-ring{display:none}}.ruc-custom-theme .mdc-form-field{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-family:var(--mdc-typography-body2-font-family, var(--mdc-typography-font-family, Roboto, sans-serif));font-size:var(--mdc-typography-body2-font-size, 14px);line-height:var(--mdc-typography-body2-line-height, 20px);font-weight:var(--mdc-typography-body2-font-weight, 400);letter-spacing:var(--mdc-typography-body2-letter-spacing, normal);-webkit-text-decoration:var(--mdc-typography-body2-text-decoration, inherit);text-decoration:var(--mdc-typography-body2-text-decoration, inherit);text-transform:var(--mdc-typography-body2-text-transform, none)}.ruc-custom-theme .mat-mdc-button.mat-mdc-button-base,.ruc-custom-theme .mat-mdc-raised-button.mat-mdc-button-base,.ruc-custom-theme .mat-mdc-unelevated-button.mat-mdc-button-base,.ruc-custom-theme .mat-mdc-outlined-button.mat-mdc-button-base{height:36px}.ruc-custom-theme .mdc-button{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-family:var(--mdc-typography-button-font-family, var(--mdc-typography-font-family, Roboto, sans-serif));font-size:var(--mdc-typography-button-font-size, 20px);line-height:var(--mdc-typography-button-line-height, 60px);font-weight:var(--mdc-typography-button-font-weight, 500);letter-spacing:var(--mdc-typography-button-letter-spacing, normal);-webkit-text-decoration:var(--mdc-typography-button-text-decoration, none);text-decoration:var(--mdc-typography-button-text-decoration, none);text-transform:var(--mdc-typography-button-text-transform, none)}.ruc-custom-theme .mat-mdc-icon-button.mat-mdc-button-base{width:48px;height:48px;padding:12px}.ruc-custom-theme .mat-mdc-icon-button.mat-mdc-button-base .mdc-icon-button__focus-ring{max-height:48px;max-width:48px}.ruc-custom-theme .mat-mdc-icon-button.mat-mdc-button-base.mdc-icon-button--reduced-size .mdc-icon-button__ripple{width:40px;height:40px;margin:4px}.ruc-custom-theme .mat-mdc-icon-button.mat-mdc-button-base.mdc-icon-button--reduced-size .mdc-icon-button__focus-ring{max-height:40px;max-width:40px}.ruc-custom-theme .mat-mdc-icon-button.mat-mdc-button-base .mdc-icon-button__touch{position:absolute;top:50%;height:48px;left:50%;width:48px;transform:translate(-50%,-50%)}.ruc-custom-theme .mdc-fab--extended{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-family:var(--mdc-typography-button-font-family, var(--mdc-typography-font-family, Roboto, sans-serif));font-size:var(--mdc-typography-button-font-size, 20px);line-height:var(--mdc-typography-button-line-height, 60px);font-weight:var(--mdc-typography-button-font-weight, 500);letter-spacing:var(--mdc-typography-button-letter-spacing, normal);-webkit-text-decoration:var(--mdc-typography-button-text-decoration, none);text-decoration:var(--mdc-typography-button-text-decoration, none);text-transform:var(--mdc-typography-button-text-transform, none)}.ruc-custom-theme .mat-mdc-snack-bar-container{--mdc-snackbar-supporting-text-font: Roboto, sans-serif;--mdc-snackbar-supporting-text-line-height: 20px;--mdc-snackbar-supporting-text-size: 14px;--mdc-snackbar-supporting-text-weight: 400}.ruc-custom-theme .mat-mdc-table .mdc-data-table__row{height:52px}.ruc-custom-theme .mat-mdc-table .mdc-data-table__pagination{min-height:52px}.ruc-custom-theme .mat-mdc-table .mdc-data-table__header-row{height:56px}.ruc-custom-theme .mdc-data-table__content,.ruc-custom-theme .mdc-data-table__cell{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-family:var(--mdc-typography-body2-font-family, var(--mdc-typography-font-family, Roboto, sans-serif));font-size:var(--mdc-typography-body2-font-size, 14px);line-height:var(--mdc-typography-body2-line-height, 20px);font-weight:var(--mdc-typography-body2-font-weight, 400);letter-spacing:var(--mdc-typography-body2-letter-spacing, normal);-webkit-text-decoration:var(--mdc-typography-body2-text-decoration, inherit);text-decoration:var(--mdc-typography-body2-text-decoration, inherit);text-transform:var(--mdc-typography-body2-text-transform, none)}.ruc-custom-theme .mdc-data-table__header-cell{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-family:var(--mdc-typography-subtitle2-font-family, var(--mdc-typography-font-family, Roboto, sans-serif));font-size:var(--mdc-typography-subtitle2-font-size, 20px);line-height:var(--mdc-typography-subtitle2-line-height, 24px);font-weight:var(--mdc-typography-subtitle2-font-weight, 500);letter-spacing:var(--mdc-typography-subtitle2-letter-spacing, normal);-webkit-text-decoration:var(--mdc-typography-subtitle2-text-decoration, inherit);text-decoration:var(--mdc-typography-subtitle2-text-decoration, inherit);text-transform:var(--mdc-typography-subtitle2-text-transform, none)}.ruc-custom-theme .mat-badge{position:relative}.ruc-custom-theme .mat-badge.mat-badge{overflow:visible}.ruc-custom-theme .mat-badge-hidden .mat-badge-content{display:none}.ruc-custom-theme .mat-badge-content{position:absolute;text-align:center;display:inline-block;border-radius:50%;transition:transform .2s ease-in-out;transform:scale(.6);overflow:hidden;white-space:nowrap;text-overflow:ellipsis;pointer-events:none}.ruc-custom-theme .ng-animate-disabled .mat-badge-content,.ruc-custom-theme .mat-badge-content._mat-animation-noopable{transition:none}.ruc-custom-theme .mat-badge-content.mat-badge-active{transform:none}.ruc-custom-theme .mat-badge-small .mat-badge-content{width:16px;height:16px;line-height:16px}.ruc-custom-theme .mat-badge-small.mat-badge-above .mat-badge-content{top:-8px}.ruc-custom-theme .mat-badge-small.mat-badge-below .mat-badge-content{bottom:-8px}.ruc-custom-theme .mat-badge-small.mat-badge-before .mat-badge-content{left:-16px}[dir=rtl] .ruc-custom-theme .mat-badge-small.mat-badge-before .mat-badge-content{left:auto;right:-16px}.ruc-custom-theme .mat-badge-small.mat-badge-after .mat-badge-content{right:-16px}[dir=rtl] .ruc-custom-theme .mat-badge-small.mat-badge-after .mat-badge-content{right:auto;left:-16px}.ruc-custom-theme .mat-badge-small.mat-badge-overlap.mat-badge-before .mat-badge-content{left:-8px}[dir=rtl] .ruc-custom-theme .mat-badge-small.mat-badge-overlap.mat-badge-before .mat-badge-content{left:auto;right:-8px}.ruc-custom-theme .mat-badge-small.mat-badge-overlap.mat-badge-after .mat-badge-content{right:-8px}[dir=rtl] .ruc-custom-theme .mat-badge-small.mat-badge-overlap.mat-badge-after .mat-badge-content{right:auto;left:-8px}.ruc-custom-theme .mat-badge-medium .mat-badge-content{width:22px;height:22px;line-height:22px}.ruc-custom-theme .mat-badge-medium.mat-badge-above .mat-badge-content{top:-11px}.ruc-custom-theme .mat-badge-medium.mat-badge-below .mat-badge-content{bottom:-11px}.ruc-custom-theme .mat-badge-medium.mat-badge-before .mat-badge-content{left:-22px}[dir=rtl] .ruc-custom-theme .mat-badge-medium.mat-badge-before .mat-badge-content{left:auto;right:-22px}.ruc-custom-theme .mat-badge-medium.mat-badge-after .mat-badge-content{right:-22px}[dir=rtl] .ruc-custom-theme .mat-badge-medium.mat-badge-after .mat-badge-content{right:auto;left:-22px}.ruc-custom-theme .mat-badge-medium.mat-badge-overlap.mat-badge-before .mat-badge-content{left:-11px}[dir=rtl] .ruc-custom-theme .mat-badge-medium.mat-badge-overlap.mat-badge-before .mat-badge-content{left:auto;right:-11px}.ruc-custom-theme .mat-badge-medium.mat-badge-overlap.mat-badge-after .mat-badge-content{right:-11px}[dir=rtl] .ruc-custom-theme .mat-badge-medium.mat-badge-overlap.mat-badge-after .mat-badge-content{right:auto;left:-11px}.ruc-custom-theme .mat-badge-large .mat-badge-content{width:28px;height:28px;line-height:28px}.ruc-custom-theme .mat-badge-large.mat-badge-above .mat-badge-content{top:-14px}.ruc-custom-theme .mat-badge-large.mat-badge-below .mat-badge-content{bottom:-14px}.ruc-custom-theme .mat-badge-large.mat-badge-before .mat-badge-content{left:-28px}[dir=rtl] .ruc-custom-theme .mat-badge-large.mat-badge-before .mat-badge-content{left:auto;right:-28px}.ruc-custom-theme .mat-badge-large.mat-badge-after .mat-badge-content{right:-28px}[dir=rtl] .ruc-custom-theme .mat-badge-large.mat-badge-after .mat-badge-content{right:auto;left:-28px}.ruc-custom-theme .mat-badge-large.mat-badge-overlap.mat-badge-before .mat-badge-content{left:-14px}[dir=rtl] .ruc-custom-theme .mat-badge-large.mat-badge-overlap.mat-badge-before .mat-badge-content{left:auto;right:-14px}.ruc-custom-theme .mat-badge-large.mat-badge-overlap.mat-badge-after .mat-badge-content{right:-14px}[dir=rtl] .ruc-custom-theme .mat-badge-large.mat-badge-overlap.mat-badge-after .mat-badge-content{right:auto;left:-14px}.ruc-custom-theme .mat-badge-content{font-weight:600;font-size:12px;font-family:Roboto,sans-serif}.ruc-custom-theme .mat-badge-small .mat-badge-content{font-size:9px}.ruc-custom-theme .mat-badge-large .mat-badge-content{font-size:24px}.ruc-custom-theme .mat-bottom-sheet-container{font-size:14px;font-weight:400;line-height:20px;font-family:Roboto,sans-serif;letter-spacing:normal}.ruc-custom-theme .mat-button-toggle-appearance-standard .mat-button-toggle-label-content{line-height:48px}.ruc-custom-theme .mat-button-toggle{font-family:Roboto,sans-serif}.ruc-custom-theme .mat-calendar-controls .mat-mdc-icon-button.mat-mdc-button-base{width:40px;height:40px;padding:8px}.ruc-custom-theme .mat-calendar-controls .mat-mdc-icon-button.mat-mdc-button-base .mdc-icon-button__focus-ring{max-height:40px;max-width:40px}.ruc-custom-theme .mat-calendar-controls .mat-mdc-icon-button.mat-mdc-button-base.mdc-icon-button--reduced-size .mdc-icon-button__ripple{width:40px;height:40px;margin:0}.ruc-custom-theme .mat-calendar-controls .mat-mdc-icon-button.mat-mdc-button-base.mdc-icon-button--reduced-size .mdc-icon-button__focus-ring{max-height:40px;max-width:40px}.ruc-custom-theme .mat-calendar-controls .mat-mdc-icon-button.mat-mdc-button-base .mdc-icon-button__touch{position:absolute;top:50%;height:40px;left:50%;width:40px;transform:translate(-50%,-50%)}.ruc-custom-theme .mat-calendar-controls .mat-mdc-icon-button.mat-mdc-button-base .mat-mdc-button-touch-target{display:none}.ruc-custom-theme .mat-calendar{font-family:Roboto,sans-serif}.ruc-custom-theme .mat-calendar-body{font-size:13px}.ruc-custom-theme .mat-calendar-body-label,.ruc-custom-theme .mat-calendar-period-button{font-size:20px;font-weight:500}.ruc-custom-theme .mat-calendar-table-header th{font-size:11px;font-weight:400}.ruc-custom-theme .mat-expansion-panel-header{height:48px}.ruc-custom-theme .mat-expansion-panel-header.mat-expanded{height:64px}.ruc-custom-theme .mat-expansion-panel-header{font-family:Roboto,sans-serif;font-size:15px;font-weight:400}.ruc-custom-theme .mat-expansion-panel-content{font-size:14px;font-weight:400;line-height:20px;font-family:Roboto,sans-serif;letter-spacing:normal}.ruc-custom-theme .mat-grid-tile-header,.ruc-custom-theme .mat-grid-tile-footer{font-size:14px}.ruc-custom-theme .mat-grid-tile-header .mat-line,.ruc-custom-theme .mat-grid-tile-footer .mat-line{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block;box-sizing:border-box}.ruc-custom-theme .mat-grid-tile-header .mat-line:nth-child(n+2),.ruc-custom-theme .mat-grid-tile-footer .mat-line:nth-child(n+2){font-size:12px}.ruc-custom-theme .mat-horizontal-stepper-header{height:72px}.ruc-custom-theme .mat-stepper-label-position-bottom .mat-horizontal-stepper-header,.ruc-custom-theme .mat-vertical-stepper-header{padding:24px}.ruc-custom-theme .mat-stepper-vertical-line:before{top:-16px;bottom:-16px}.ruc-custom-theme .mat-stepper-label-position-bottom .mat-horizontal-stepper-header:after,.ruc-custom-theme .mat-stepper-label-position-bottom .mat-horizontal-stepper-header:before{top:36px}.ruc-custom-theme .mat-stepper-label-position-bottom .mat-stepper-horizontal-line{top:36px}.ruc-custom-theme .mat-stepper-vertical,.ruc-custom-theme .mat-stepper-horizontal{font-family:Roboto,sans-serif}.ruc-custom-theme .mat-step-label{font-size:14px;font-weight:400}.ruc-custom-theme .mat-step-sub-label-error{font-weight:400}.ruc-custom-theme .mat-step-label-error{font-size:20px}.ruc-custom-theme .mat-step-label-selected{font-size:20px;font-weight:500}.ruc-custom-theme .mat-toolbar-multiple-rows{min-height:64px}.ruc-custom-theme .mat-toolbar-row,.ruc-custom-theme .mat-toolbar-single-row{height:64px}@media (max-width: 599px){.ruc-custom-theme .mat-toolbar-multiple-rows{min-height:56px}.ruc-custom-theme .mat-toolbar-row,.ruc-custom-theme .mat-toolbar-single-row{height:56px}}.ruc-custom-theme .mat-toolbar,.ruc-custom-theme .mat-toolbar h1,.ruc-custom-theme .mat-toolbar h2,.ruc-custom-theme .mat-toolbar h3,.ruc-custom-theme .mat-toolbar h4,.ruc-custom-theme .mat-toolbar h5,.ruc-custom-theme .mat-toolbar h6{font-size:20px;font-weight:500;line-height:32px;font-family:Roboto,sans-serif;letter-spacing:normal;margin:0}.ruc-custom-theme .mat-tree-node{min-height:48px}.ruc-custom-theme .mat-tree{font-family:Roboto,sans-serif}.ruc-custom-theme .mat-tree-node,.ruc-custom-theme .mat-nested-tree-node{font-weight:400;font-size:14px}:host{display:block;position:relative;overflow:hidden}.custom-backdrop{position:absolute;inset:0;background-color:#000;z-index:999;visibility:hidden}.ruclib-drawer-container{width:100%;height:400px;border:1px solid #ccc;position:relative;overflow:hidden}.drawer-content-wrapper{padding:16px;position:relative;box-sizing:border-box;height:100%;display:flex;flex-direction:column}.ruclib-drawer-title{margin-top:0;margin-bottom:16px;font-size:1.5em;flex-shrink:0}.ruclib-drawer-close-button{position:absolute;top:8px;right:8px;padding:5px 0 0!important;flex-shrink:0}.ruclib-drawer-body{flex-grow:1;overflow-y:auto;word-break:break-word}.dynamic-drawer{background-color:var(--mat-sidenav-content-background-color, white);position:absolute;box-sizing:border-box;box-shadow:0 2px 10px #0003;z-index:1000;overflow:hidden}.dynamic-drawer.drawer-left{top:0;bottom:0;left:0}.dynamic-drawer.drawer-right{top:0;bottom:0;right:0}.dynamic-drawer.drawer-top{top:0;left:0;right:0}.dynamic-drawer.drawer-bottom{bottom:0;left:0;right:0}.dynamic-drawer.light-theme{background-color:#fff;color:#000000de}.dynamic-drawer.light-theme .ruclib-drawer-title{color:#000000de}.dynamic-drawer.light-theme .ruclib-drawer-close-button .mat-icon{color:#0000008a}.dynamic-drawer.dark-theme{background-color:#424242;color:#fff}.dynamic-drawer.dark-theme .ruclib-drawer-title,.dynamic-drawer.dark-theme .ruclib-drawer-close-button .mat-icon{color:#fff}.dynamic-drawer.custom-theme-one{background-color:#fff;color:#000000de}.dynamic-drawer.custom-theme-one .ruclib-drawer-title{color:#000000de}.dynamic-drawer.custom-theme-one .ruclib-drawer-close-button .mat-icon{color:#0000008a}.dynamic-drawer.custom-theme-two{background-color:#424242;color:#fff}.dynamic-drawer.custom-theme-two .ruclib-drawer-title,.dynamic-drawer.custom-theme-two .ruclib-drawer-close-button .mat-icon{color:#fff}.ruclib-drawer-toggle-image{object-fit:contain;display:block}.drawer-toggle-button{margin-bottom:15px;display:inline-flex;align-items:center;justify-content:center;gap:8px}.ruclib-main-content{padding:16px;display:flex;flex-direction:column;align-items:flex-start}\n"] }]
399
+ }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { rucInputData: [{
400
+ type: Input
401
+ }], customTheme: [{
402
+ type: Input
403
+ }], rucEvent: [{
404
+ type: Output
405
+ }], drawerComponentHost: [{
406
+ type: ViewChild,
407
+ args: ['drawerComponentHost', { read: ViewContainerRef, static: true }]
408
+ }], onKeydownHandler: [{
409
+ type: HostListener,
410
+ args: ['document:keydown.escape', ['$event']]
411
+ }] } });
412
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVjbGliLWRyYXdlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3J1Y2xpYi1kcmF3ZXIvcnVjbGliLWRyYXdlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9zcmMvbGliL3J1Y2xpYi1kcmF3ZXIvcnVjbGliLWRyYXdlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBb0MsTUFBTSxFQUFFLFlBQVksRUFBaUIsaUJBQWlCLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBMkIsTUFBTSxlQUFlLENBQUM7QUFDL00sT0FBTyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQWtCLE1BQU0scUJBQXFCLENBQUM7Ozs7Ozs7QUFJakc7Ozs7R0FJRztBQWtDSCxNQUFNLE9BQU8scUJBQXFCO0lBK0VoQyxZQUNVLEdBQXNCO1FBQXRCLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBL0VoQzs7O1dBR0c7UUFDTSxpQkFBWSxHQUFzQixFQUFFLENBQUM7UUFNOUM7Ozs7V0FJRztRQUNPLGFBQVEsR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO1FBSzdDLHNEQUFzRDtRQUM5Qyx3QkFBbUIsR0FBNkIsSUFBSSxDQUFDO1FBRTdEOzs7V0FHRztRQUNJLHlCQUFvQixHQUFpQixLQUFLLENBQUM7UUFDbEQ7Ozs7V0FJRztRQUNJLDBCQUFxQixHQUF3QyxNQUFNLENBQUMsQ0FBQyxVQUFVO1FBQ3RGOzs7O1dBSUc7UUFDSywwQkFBcUIsR0FBK0MsSUFBSSxDQUFDO1FBQ2pGOzs7V0FHRztRQUNJLGdCQUFXLEdBQVksS0FBSyxDQUFDO1FBQ3BDOzs7O1dBSUc7UUFDSSwrQkFBMEIsR0FBVyxPQUFPLENBQUM7UUFFcEQ7Ozs7V0FJRztRQUNJLGtCQUFhLEdBQWtCLE1BQU0s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QUFFLG1CQUFtQixFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDOzRCQUM3RSxLQUFLLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQzs0QkFDMUUsVUFBVSxDQUFDLFlBQVksRUFBRSxPQUFPLENBQUMsMEJBQTBCLENBQUMsQ0FBQzt5QkFDOUQsQ0FBQzt3QkFDRixPQUFPLENBQUMsa0JBQWtCLEVBQUU7NEJBQzFCLEtBQUssQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLEVBQUUsU0FBUyxFQUFFLGtCQUFrQixFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDOzRCQUM1RSxLQUFLLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQzs0QkFDMUUsVUFBVSxDQUFDLFlBQVksRUFBRSxPQUFPLENBQUMsMEJBQTBCLENBQUMsQ0FBQzt5QkFDOUQsQ0FBQztxQkFDSDt3R0FPUSxZQUFZO3NCQUFwQixLQUFLO2dCQUtHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBTUksUUFBUTtzQkFBakIsTUFBTTtnQkFHcUUsbUJBQW1CO3NCQUE5RixTQUFTO3VCQUFDLHFCQUFxQixFQUFFLEVBQUUsSUFBSSxFQUFFLGdCQUFnQixFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBdVQxRSxnQkFBZ0I7c0JBRGYsWUFBWTt1QkFBQyx5QkFBeUIsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE9uSW5pdCwgT25DaGFuZ2VzLCBTaW1wbGVDaGFuZ2VzLCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgQWZ0ZXJWaWV3SW5pdCwgQ2hhbmdlRGV0ZWN0b3JSZWYsIEhvc3RMaXN0ZW5lciwgVmlld0NoaWxkLCBWaWV3Q29udGFpbmVyUmVmLCBDb21wb25lbnRSZWYsIE9uRGVzdHJveSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyB0cmlnZ2VyLCBzdGF0ZSwgc3R5bGUsIHRyYW5zaXRpb24sIGFuaW1hdGUsIEFuaW1hdGlvbkV2ZW50IH0gZnJvbSAnQGFuZ3VsYXIvYW5pbWF0aW9ucyc7XHJcbmltcG9ydCB7IE1hdERyYXdlck1vZGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zaWRlbmF2JztcclxuaW1wb3J0IHsgUnVjbGliRHJhd2VySW5wdXQgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2UvZHJhd2VyJztcclxuXHJcbi8qKlxyXG4gKiBAQ29tcG9uZW50IFJ1Y2xpYkRyYXdlckNvbXBvbmVudFxyXG4gKiBAZGVzY3JpcHRpb24gQSBoaWdobHkgY29uZmlndXJhYmxlIGRyYXdlciBjb21wb25lbnQgdGhhdCBjYW4gc2xpZGUgaW4gZnJvbSBhbnkgb2YgdGhlIGZvdXIgZGlyZWN0aW9ucyAobGVmdCwgcmlnaHQsIHRvcCwgYm90dG9tKS5cclxuICogSXQgdXNlcyBjdXN0b20gQW5ndWxhciBhbmltYXRpb25zIGZvciBzbW9vdGggdHJhbnNpdGlvbnMgYW5kIHN1cHBvcnRzIHRoZW1pbmcuXHJcbiAqL1xyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ3V4cC1ydWNsaWItZHJhd2VyJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vcnVjbGliLWRyYXdlci5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vcnVjbGliLWRyYXdlci5jb21wb25lbnQuc2NzcyddLFxyXG4gIGFuaW1hdGlvbnM6IFtcclxuICAgIHRyaWdnZXIoJ2JhY2tkcm9wRmFkZScsIFtcclxuICAgICAgc3RhdGUoJ291dCcsIHN0eWxlKHsgb3BhY2l0eTogMCwgdmlzaWJpbGl0eTogJ2hpZGRlbicgfSkpLFxyXG4gICAgICBzdGF0ZSgnaW4nLCBzdHlsZSh7IG9wYWNpdHk6IDAuNiwgdmlzaWJpbGl0eTogJ3Zpc2libGUnIH0pKSxcclxuICAgICAgdHJhbnNpdGlvbignb3V0ID0+IGluJywgYW5pbWF0ZSgne3tkdXJhdGlvbn19IGVhc2UtaW4nKSksXHJcbiAgICAgIHRyYW5zaXRpb24oJ2luID0+IG91dCcsIGFuaW1hdGUoJ3t7ZHVyYXRpb259fSBlYXNlLW91dCcpKSxcclxuICAgIF0pLFxyXG4gICAgdHJpZ2dlcignc2xpZGVJbk91dExlZnQnLCBbXHJcbiAgICAgIHN0YXRlKCdvdXQnLCBzdHlsZSh7IHRyYW5zZm9ybTogJ3RyYW5zbGF0ZVgoLTEwMCUpJywgdmlzaWJpbGl0eTogJ2hpZGRlbicgfSkpLFxyXG4gICAgICBzdGF0ZSgnaW4nLCBzdHlsZSh7IHRyYW5zZm9ybTogJ3RyYW5zbGF0ZVgoMCknLCB2aXNpYmlsaXR5OiAndmlzaWJsZScgfSkpLFxyXG4gICAgICB0cmFuc2l0aW9uKCdvdXQgPD0+IGluJywgYW5pbWF0ZSgne3tkdXJhdGlvbn19IGVhc2UtaW4tb3V0JykpLFxyXG4gICAgXSksXHJcbiAgICB0cmlnZ2VyKCdzbGlkZUluT3V0UmlnaHQnLCBbXHJcbiAgICAgIHN0YXRlKCdvdXQnLCBzdHlsZSh7IHRyYW5zZm9ybTogJ3RyYW5zbGF0ZVgoMTAwJSknLCB2aXNpYmlsaXR5OiAnaGlkZGVuJyB9KSksXHJcbiAgICAgIHN0YXRlKCdpbicsIHN0eWxlKHsgdHJhbnNmb3JtOiAndHJhbnNsYXRlWCgwKScsIHZpc2liaWxpdHk6ICd2aXNpYmxlJyB9KSksXHJcbiAgICAgIHRyYW5zaXRpb24oJ291dCA8PT4gaW4nLCBhbmltYXRlKCd7e2R1cmF0aW9ufX0gZWFzZS1pbi1vdXQnKSksXHJcbiAgICBdKSxcclxuICAgIHRyaWdnZXIoJ3NsaWRlSW5PdXRUb3AnLCBbXHJcbiAgICAgIHN0YXRlKCdvdXQnLCBzdHlsZSh7IHRyYW5zZm9ybTogJ3RyYW5zbGF0ZVkoLTEwMCUpJywgdmlzaWJpbGl0eTogJ2hpZGRlbicgfSkpLFxyXG4gICAgICBzdGF0ZSgnaW4nLCBzdHlsZSh7IHRyYW5zZm9ybTogJ3RyYW5zbGF0ZVkoMCUpJywgdmlzaWJpbGl0eTogJ3Zpc2libGUnIH0pKSxcclxuICAgICAgdHJhbnNpdGlvbignb3V0IDw9PiBpbicsIGFuaW1hdGUoJ3t7ZHVyYXRpb259fSBlYXNlLWluLW91dCcpKSxcclxuICAgIF0pLFxyXG4gICAgdHJpZ2dlcignc2xpZGVJbk91dEJvdHRvbScsIFtcclxuICAgICAgc3RhdGUoJ291dCcsIHN0eWxlKHsgdHJhbnNmb3JtOiAndHJhbnNsYXRlWSgxMDAlKScsIHZpc2liaWxpdHk6ICdoaWRkZW4nIH0pKSxcclxuICAgICAgc3RhdGUoJ2luJywgc3R5bGUoeyB0cmFuc2Zvcm06ICd0cmFuc2xhdGVZKDAlKScsIHZpc2liaWxpdHk6ICd2aXNpYmxlJyB9KSksXHJcbiAgICAgIHRyYW5zaXRpb24oJ291dCA8PT4gaW4nLCBhbmltYXRlKCd7e2R1cmF0aW9ufX0gZWFzZS1pbi1vdXQnKSksXHJcbiAgICBdKVxyXG4gIF1cclxufSlcclxuZXhwb3J0IGNsYXNzIFJ1Y2xpYkRyYXdlckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xyXG4gIC8qKlxyXG4gICAqIElucHV0IGRhdGEgZm9yIGNvbmZpZ3VyaW5nIHRoZSBkcmF3ZXIncyBhcHBlYXJhbmNlIGFuZCBiZWhhdmlvci5cclxuICAgKiBAc2VlIFJ1Y2xpYkRyYXdlcklucHV0IGludGVyZmFjZSBmb3IgZGV0YWlsZWQgcHJvcGVydGllcy5cclxuICAgKi9cclxuICBASW5wdXQoKSBydWNJbnB1dERhdGE6IFJ1Y2xpYkRyYXdlcklucHV0ID0ge307XHJcbiAgLyoqXHJcbiAgICogT3B0aW9uYWwgY3VzdG9tIHRoZW1lIGNsYXNzIHRvIGJlIGFwcGxpZWQgdG8gdGhlIGRyYXdlciBwYW5lbC5cclxuICAgKiBAZXhhbXBsZSAnZGFyay10aGVtZScsICdjdXN0b20tdGhlbWUtb25lJ1xyXG4gICAqL1xyXG4gIEBJbnB1dCgpIGN1c3RvbVRoZW1lOiBzdHJpbmcgfCB1bmRlZmluZWQ7XHJcbiAgLyoqXHJcbiAgICogRXZlbnRFbWl0dGVyIGZvciB2YXJpb3VzIGRyYXdlciBldmVudHMuXHJcbiAgICogRW1pdHMgb2JqZWN0cyB3aXRoIGB0eXBlYCAoZS5nLiwgJ29wZW5lZFN0YXJ0JywgJ2Nsb3NlZFN0YXJ0JywgJ29wZW5lZENoYW5nZScsICdkcmF3ZXJUb2dnbGUnKVxyXG4gICAqIGFuZCBgb3BlbmVkYCAoYm9vbGVhbikgYW5kIGBwb3NpdGlvbmAgKHN0cmluZykgcHJvcGVydGllcy5cclxuICAgKi9cclxuICBAT3V0cHV0KCkgcnVjRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuXHJcbiAgLyoqIFZpZXdDb250YWluZXJSZWYgdG8gaG9zdCB0aGUgZHluYW1pY2FsbHkgbG9hZGVkIGNvbXBvbmVudC4gKi9cclxuICBAVmlld0NoaWxkKCdkcmF3ZXJDb21wb25lbnRIb3N0JywgeyByZWFkOiBWaWV3Q29udGFpbmVyUmVmLCBzdGF0aWM6IHRydWUgfSkgZHJhd2VyQ29tcG9uZW50SG9zdCE6IFZpZXdDb250YWluZXJSZWY7XHJcblxyXG4gIC8qKiBSZWZlcmVuY2UgdG8gdGhlIGR5bmFtaWNhbGx5IGNyZWF0ZWQgY29tcG9uZW50LiAqL1xyXG4gIHByaXZhdGUgZHluYW1pY0NvbXBvbmVudFJlZjogQ29tcG9uZW50UmVmPGFueT4gfCBudWxsID0gbnVsbDtcclxuXHJcbiAgLyoqXHJcbiAgICogQ3VycmVudCBhbmltYXRpb24gc3RhdGUgb2YgdGhlIGRyYXdlciAoJ2luJyBvciAnb3V0JykuXHJcbiAgICogQHB1YmxpY1xyXG4gICAqL1xyXG4gIHB1YmxpYyBkcmF3ZXJBbmltYXRpb25TdGF0ZTogJ2luJyB8ICdvdXQnID0gJ291dCc7XHJcbiAgLyoqXHJcbiAgICogQ3VycmVudCBhY3RpdmUgcG9zaXRpb24gb2YgdGhlIGRyYXdlci5cclxuICAgKiBAcHVibGljXHJcbiAgICogQGRlZmF1bHQgJ2xlZnQnXHJcbiAgICovXHJcbiAgcHVibGljIGN1cnJlbnREcmF3ZXJQb3NpdGlvbjogJ2xlZnQnIHwgJ3JpZ2h0JyB8ICd0b3AnIHwgJ2JvdHRvbScgPSAnbGVmdCc7IC8vIERlZmF1bHRcclxuICAvKipcclxuICAgKiBTdG9yZXMgdGhlIG5leHQgcG9zaXRpb24gaWYgdGhlIGRyYXdlciBpcyBjdXJyZW50bHkgb3BlbiBhbmQgYSBuZXcgcG9zaXRpb24gaXMgcmVxdWVzdGVkLlxyXG4gICAqIFVzZWQgdG8gc2VxdWVuY2UgY2xvc2UgYW5kIG9wZW4gYW5pbWF0aW9ucy5cclxuICAgKiBAcHJpdmF0ZVxyXG4gICAqL1xyXG4gIHByaXZhdGUgcGVuZGluZ0RyYXdlclBvc2l0aW9uOiAnbGVmdCcgfCAncmlnaHQnIHwgJ3RvcCcgfCAnYm90dG9tJyB8IG51bGwgPSBudWxsO1xyXG4gIC8qKlxyXG4gICAqIEZsYWcgdG8gaW5kaWNhdGUgaWYgYW4gYW5pbWF0aW9uIGlzIGN1cnJlbnRseSBpbiBwcm9ncmVzcyB0byBwcmV2ZW50IHJhcGlkIHRvZ2dsaW5nLlxyXG4gICAqIEBwdWJsaWNcclxuICAgKi9cclxuICBwdWJsaWMgaXNBbmltYXRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAvKipcclxuICAgKiBFZmZlY3RpdmUgYW5pbWF0aW9uIGR1cmF0aW9uIGZvciB0aGUgZHJhd2VyLCBkZXJpdmVkIGZyb20gaW5wdXQgb3IgZGVmYXVsdC5cclxuICAgKiBAcHVibGljXHJcbiAgICogQGRlZmF1bHQgJzMwMG1zJ1xyXG4gICAqL1xyXG4gIHB1YmxpYyBlZmZlY3RpdmVBbmltYXRpb25EdXJhdGlvbjogc3RyaW5nID0gJzMwMG1zJztcclxuXHJcbiAgLyoqXHJcbiAgICogTW9kZSBvZiB0aGUgZHJhd2VyLCBwcmltYXJpbHkgZm9yIGRldGVybWluaW5nIGJhY2tkcm9wIGJlaGF2aW9yIHdpdGggY3VzdG9tIGFuaW1hdGlvbnMuXHJcbiAgICogQHB1YmxpY1xyXG4gICAqIEBkZWZhdWx0ICdzaWRlJ1xyXG4gICAqL1xyXG4gIHB1YmxpYyBtYXREcmF3ZXJNb2RlOiBNYXREcmF3ZXJNb2RlID0gJ3NpZGUnO1xyXG4gIC8qKlxyXG4gICAqIEFjdHVhbCBwb3NpdGlvbiAoJ3N0YXJ0JyBvciAnZW5kJykgdXNlZCBieSBBbmd1bGFyIE1hdGVyaWFsJ3MgTWF0RHJhd2VyIGlmIGl0IHdlcmUgZGlyZWN0bHkgdXNlZC5cclxuICAgKiBSZXRhaW5lZCBmb3IgbG9naWNhbCBjb25zaXN0ZW5jeSBpbiBkZXRlcm1pbmluZyBsYXlvdXQuXHJcbiAgICogQHB1YmxpY1xyXG4gICAqIEBkZWZhdWx0ICdzdGFydCdcclxuICAgKi9cclxuICBwdWJsaWMgbWF0QWN0dWFsUG9zaXRpb246ICdzdGFydCcgfCAnZW5kJyA9ICdzdGFydCc7XHJcbiAgLyoqXHJcbiAgICogRmxhZyBpbmRpY2F0aW5nIGlmIHRoZSBkcmF3ZXIgaXMgaW4gYSB2ZXJ0aWNhbCBsYXlvdXQgKHRvcC9ib3R0b20pLlxyXG4gICAqIEhlbHBzIGRldGVybWluZSBpZiB3aWR0aCBvciBoZWlnaHQgc2hvdWxkIGJlIDEwMCUuXHJcbiAgICogQHB1YmxpY1xyXG4gICAqL1xyXG4gIHB1YmxpYyBpc1ZlcnRpY2FsTGF5b3V0OiBib29sZWFuID0gZmFsc2U7XHJcbiAgLyoqXHJcbiAgICogRWZmZWN0aXZlIGRpbWVuc2lvbiAod2lkdGggb3IgaGVpZ2h0KSBvZiB0aGUgZHJhd2VyIHBhbmVsLlxyXG4gICAqIEBwdWJsaWNcclxuICAgKiBAZGVmYXVsdCAnMjUwcHgnXHJcbiAgICovXHJcbiAgcHVibGljIGVmZmVjdGl2ZURyYXdlckRpbWVuc2lvbjogc3RyaW5nID0gJzI1MHB4JztcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWZcclxuICApIHsgfVxyXG5cclxuICAvKipcclxuICAgKiBBbmd1bGFyIGxpZmVjeWNsZSBob29rIHRoYXQgaXMgY2FsbGVkIGFmdGVyIGRhdGEtYm91bmQgcHJvcGVydGllcyBvZiBhIGRpcmVjdGl2ZSBhcmUgaW5pdGlhbGl6ZWQuXHJcbiAgICovXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLmFwcGx5SW5wdXRzKCk7XHJcbiAgICB0aGlzLmRyYXdlckFuaW1hdGlvblN0YXRlID0gJ291dCc7XHJcbiAgICB0aGlzLmxvYWREeW5hbWljQ29udGVudCgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQW5ndWxhciBsaWZlY3ljbGUgaG9vayB0aGF0IGlzIGNhbGxlZCBhZnRlciBBbmd1bGFyIGhhcyBmdWxseSBpbml0aWFsaXplZCBhIGNvbXBvbmVudCdzIHZpZXcuXHJcbiAgICovXHJcbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMucnVjSW5wdXREYXRhLmluaXRpYWxPcGVuZWRTdGF0ZSAmJiB0aGlzLmRyYXdlckFuaW1hdGlvblN0YXRlID09PSAnb3V0Jykge1xyXG4gICAgICAvLyBEZWZlciBzdGF0ZSB1cGRhdGUgdG8gdGhlIG5leHQgbWljcm90YXNrIHF1ZXVlLlxyXG4gICAgICAvLyBUaGlzIGhlbHBzIGF2b2lkIEV4cHJlc3Npb25DaGFuZ2VkQWZ0ZXJJdEhhc0JlZW5DaGVja2VkRXJyb3Igd2hlbiBpbml0aWFsaXppbmcgdGhlIGRyYXdlcidzIG9wZW4gc3RhdGUuXHJcbiAgICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4gdGhpcy5zZXREcmF3ZXJPcGVuU3RhdGUodHJ1ZSkpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQW5ndWxhciBsaWZlY3ljbGUgaG9vayB0aGF0IGlzIGNhbGxlZCB3aGVuIGFueSBkYXRhLWJvdW5kIHByb3BlcnR5IG9mIGEgZGlyZWN0aXZlIGNoYW5nZXMuXHJcbiAgICogQHBhcmFtIGNoYW5nZXMgLSBPYmplY3QgY29udGFpbmluZyB0aGUgY2hhbmdlZCBwcm9wZXJ0aWVzLlxyXG4gICAqL1xyXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcclxuICAgIGlmIChjaGFuZ2VzWydydWNJbnB1dERhdGEnXSkge1xyXG4gICAgICBjb25zdCBwcmV2aW91c1J1Y0lucHV0RGF0YSA9IGNoYW5nZXNbJ3J1Y0lucHV0RGF0YSddLnByZXZpb3VzVmFsdWUgYXMgUnVjbGliRHJhd2VySW5wdXQgfHwge307XHJcbiAgICAgIGNvbnN0IGN1cnJlbnRSdWNJbnB1dERhdGEgPSBjaGFuZ2VzWydydWNJbnB1dERhdGEnXS5jdXJyZW50VmFsdWUgYXMgUnVjbGliRHJhd2VySW5wdXQgfHwge307XHJcblxyXG4gICAgICBjb25zdCBvbGRQb3NpdGlvbiA9IHByZXZpb3VzUnVjSW5wdXREYXRhLmRyYXdlclBvc2l0aW9uID8/IHRoaXMuY3VycmVudERyYXdlclBvc2l0aW9uO1xyXG4gICAgICBjb25zdCB3YXNPcGVuID0gdGhpcy5kcmF3ZXJBbmltYXRpb25TdGF0ZSA9PT0gJ2luJztcclxuXHJcbiAgICAgIHRoaXMuY3VycmVudERyYXdlclBvc2l0aW9uID0gY3VycmVudFJ1Y0lucHV0RGF0YS5kcmF3ZXJQb3NpdGlvbiA/PyAnbGVmdCc7XHJcbiAgICAgIHRoaXMuYXBwbHlJbnB1dHMoKTtcclxuXHJcbiAgICAgIGNvbnN0IG5ld1Bvc2l0aW9uID0gdGhpcy5jdXJyZW50RHJhd2VyUG9zaXRpb247XHJcbiAgICAgIGNvbnN0IHNob3VsZEJlT3BlbiA9IHRoaXMucnVjSW5wdXREYXRhLmluaXRpYWxPcGVuZWRTdGF0ZSA/PyBmYWxzZTtcclxuXHJcbiAgICAgIGlmICh3YXNPcGVuICYmIG9sZFBvc2l0aW9uICE9PSBuZXdQb3NpdGlvbikge1xyXG4gICAgICAgIHRoaXMucGVuZGluZ0RyYXdlclBvc2l0aW9uID0gbmV3UG9zaXRpb247XHJcbiAgICAgICAgdGhpcy5zZXREcmF3ZXJPcGVuU3RhdGUoZmFsc2UpO1xyXG4gICAgICB9IGVsc2UgaWYgKHdhc09wZW4gIT09IHNob3VsZEJlT3Blbikge1xyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5zZXREcmF3ZXJPcGVuU3RhdGUoc2hvdWxkQmVPcGVuKTtcclxuICAgICAgICB9KTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLmxvYWREeW5hbWljQ29udGVudCgpO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEFwcGxpZXMgaW5wdXQgZGF0YSB0byBjb21wb25lbnQgcHJvcGVydGllcywgY2FsY3VsYXRpbmcgZGltZW5zaW9ucyBhbmQgcG9zaXRpb25zLlxyXG4gICAqIEBwcml2YXRlXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBhcHBseUlucHV0cygpOiB2b2lkIHtcclxuICAgIHRoaXMubWF0RHJhd2VyTW9kZSA9IHRoaXMucnVjSW5wdXREYXRhLm1vZGUgPz8gJ3NpZGUnO1xyXG4gICAgdGhpcy5lZmZlY3RpdmVBbmltYXRpb25EdXJhdGlvbiA9IHRoaXMucnVjSW5wdXREYXRhLmFuaW1hdGlvbkR1cmF0aW9uIHx8ICczMDBtcyc7XHJcblxyXG4gICAgY29uc3QgZ2V0RGltZW5zaW9uID0gKGlucHV0RGltZW5zaW9uOiBzdHJpbmcgfCB1bmRlZmluZWQsIGRlZmF1bHREaW1lbnNpb246IHN0cmluZyk6IHN0cmluZyA9PiB7XHJcbiAgICAgIHJldHVybiAoaW5wdXREaW1lbnNpb24gJiYgaW5wdXREaW1lbnNpb24udHJpbSgpICE9PSAnJykgPyBpbnB1dERpbWVuc2lvbiA6IGRlZmF1bHREaW1lbnNpb247XHJcbiAgICB9O1xyXG5cclxuICAgIHN3aXRjaCAodGhpcy5jdXJyZW50RHJhd2VyUG9zaXRpb24pIHtcclxuICAgICAgY2FzZSAncmlnaHQnOlxyXG4gICAgICAgIHRoaXMubWF0QWN0dWFsUG9zaXRpb24gPSAnZW5kJztcclxuICAgICAgICB0aGlzLmlzVmVydGljYWxMYXlvdXQgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmVmZmVjdGl2ZURyYXdlckRpbWVuc2lvbiA9IGdldERpbWVuc2lvbih0aGlzLnJ1Y0lucHV0RGF0YS5kcmF3ZXJXaWR0aCwgJzI1MHB4Jyk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ3RvcCc6XHJcbiAgICAgICAgdGhpcy5tYXRBY3R1YWxQb3NpdGlvbiA9ICdzdGFydCc7XHJcbiAgICAgICAgdGhpcy5pc1ZlcnRpY2FsTGF5b3V0ID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLmVmZmVjdGl2ZURyYXdlckRpbWVuc2lvbiA9IGdldERpbWVuc2lvbih0aGlzLnJ1Y0lucHV0RGF0YS5kcmF3ZXJIZWlnaHQsICcyMDBweCcpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlICdib3R0b20nOlxyXG4gICAgICAgIHRoaXMubWF0QWN0dWFsUG9zaXRpb24gPSAnZW5kJztcclxuICAgICAgICB0aGlzLmlzVmVydGljYWxMYXlvdXQgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuZWZmZWN0aXZlRHJhd2VyRGltZW5zaW9uID0gZ2V0RGltZW5zaW9uKHRoaXMucnVjSW5wdXREYXRhLmRyYXdlckhlaWdodCwgJzIwMHB4Jyk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ2xlZnQnOlxyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIHRoaXMubWF0QWN0dWFsUG9zaXRpb24gPSAnc3RhcnQnO1xyXG4gICAgICAgIHRoaXMuaXNWZXJ0aWNhbExheW91dCA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuZWZmZWN0aXZlRHJhd2VyRGltZW5zaW9uID0gZ2V0RGltZW5zaW9uKHRoaXMucnVjSW5wdXREYXRhLmRyYXdlcldpZHRoLCAnMjUwcHgnKTtcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRvZ2dsZXMgdGhlIGRyYXdlcidzIG9wZW4vY2xvc2Ugc3RhdGUgb3Igc3dpdGNoZXMgdG8gYSBuZXcgcG9zaXRpb24uXHJcbiAgICogQHBhcmFtIHJlcXVlc3RlZFBvc2l0aW9uIC0gVGhlIGRlc2lyZWQgcG9zaXRpb24gdG8gb3BlbiB0aGUgZHJhd2VyIGZyb20uIElmIG5vdCBwcm92aWRlZCwgdXNlcyBgY3VycmVudERyYXdlclBvc2l0aW9uYC5cclxuICAgKi9cclxuICB0b2dnbGVEcmF3ZXIocmVxdWVzdGVkUG9zaXRpb24/OiAnbGVmdCcgfCAncmlnaHQnIHwgJ3RvcCcgfCAnYm90dG9tJyk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuaXNBbmltYXRpbmcgJiYgIXRoaXMucGVuZGluZ0RyYXdlclBvc2l0aW9uKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIFxyXG4gICAgY29uc3QgcG9zaXRpb25Ub1RvZ2dsZSA9IHJlcXVlc3RlZFBvc2l0aW9uIHx8IHRoaXMuY3VycmVudERyYXdlclBvc2l0aW9uO1xyXG4gICAgY29uc3QgaXNEcmF3ZXJPcGVuID0gdGhpcy5kcmF3ZXJBbmltYXRpb25TdGF0ZSA9PT0gJ2luJztcclxuICAgIGNvbnN0IGlzU2FtZVBvc2l0aW9uID0gdGhpcy5jdXJyZW50RHJhd2VyUG9zaXRpb24gPT09IHBvc2l0aW9uVG9Ub2dnbGU7XHJcblxyXG4gICAgaWYgKGlzRHJhd2VyT3Blbikge1xyXG4gICAgICBpZiAoaXNTYW1lUG9zaXRpb24pIHtcclxuICAgICAgICB0aGlzLnNldERyYXdlck9wZW5TdGF0ZShmYWxzZSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5wZW5kaW5nRHJhd2VyUG9zaXRpb24gPSBwb3NpdGlvblRvVG9nZ2xlO1xyXG4gICAgICAgIHRoaXMuc2V0RHJhd2VyT3BlblN0YXRlKGZhbHNlKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKCFpc1NhbWVQb3NpdGlvbikge1xyXG4gICAgICAgIHRoaXMuY3VycmVudERyYXdlclBvc2l0aW9uID0gcG9zaXRpb25Ub1RvZ2dsZTtcclxuICAgICAgICB0aGlzLmFwcGx5SW5wdXRzKCk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5zZXREcmF3ZXJPcGVuU3RhdGUodHJ1ZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZXRzIHRoZSBkcmF3ZXIncyBvcGVuIHN0YXRlIGFuZCB0cmlnZ2VycyB0aGUgYW5pbWF0aW9uLlxyXG4gICAqIEBwYXJhbSBvcGVuIC0gQm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdG8gb3BlbiAodHJ1ZSkgb3IgY2xvc2UgKGZhbHNlKSB0aGUgZHJhd2VyLlxyXG4gICAqIEBwcml2YXRlXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBzZXREcmF3ZXJPcGVuU3RhdGUob3BlbjogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuaXNBbmltYXRpbmcgJiYgIXRoaXMucGVuZGluZ0RyYXdlclBvc2l0aW9uICYmIG9wZW4gPT09ICh0aGlzLmRyYXdlckFuaW1hdGlvblN0YXRlID09PSAnaW4nKSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLmlzQW5pbWF0aW5nID0gdHJ1ZTtcclxuICAgIHRoaXMuZHJhd2VyQW5pbWF0aW9uU3RhdGUgPSBvcGVuID8gJ2luJyA6ICdvdXQnO1xyXG4gICAgdGhpcy5ydWNFdmVudC5lbWl0KHtcclxuICAgICAgdHlwZTogb3BlbiA/ICdvcGVuZWRTdGFydCcgOiAnY2xvc2VkU3RhcnQnLFxyXG4gICAgICBvcGVuZWQ6IG9wZW4sXHJcbiAgICAgIHBvc2l0aW9uOiB0aGlzLmN1cnJlbnREcmF3ZXJQb3NpdGlvblxyXG4gICAgfSk7XHJcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDYWxsYmFjayBmb3Igd2hlbiBhIGRyYXdlciBhbmltYXRpb24gZmluaXNoZXMuXHJcbiAgICogTWFuYWdlcyBzdGF0ZSB0cmFuc2l0aW9ucywgZXNwZWNpYWxseSB3aGVuIHN3aXRjaGluZyBiZXR3ZWVuIG9wZW4gZHJhd2Vycy5cclxuICAgKiBAcGFyYW0gZXZlbnQgLSBUaGUgQW5ndWxhciBBbmltYXRpb25FdmVudC5cclxuICAgKi9cclxuICBvbkFuaW1hdGlvbkRvbmUoZXZlbnQ6IEFuaW1hdGlvbkV2ZW50KTogdm9pZCB7XHJcbiAgICBpZiAoZXZlbnQuZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ2R5bmFtaWMtZHJhd2VyJykpIHtcclxuICAgICAgaWYgKGV2ZW50LnRvU3RhdGUgPT09ICdvdXQnKSB7XHJcbiAgICAgICAgdGhpcy5ydWNFdmVudC5lbWl0KHsgdHlwZTogJ29wZW5lZENoYW5nZScsIG9wZW5lZDogZmFsc2UsIHBvc2l0aW9uOiB0aGlzLmN1cnJlbnREcmF3ZXJQb3NpdGlvbiB9KTtcclxuICAgICAgICB0aGlzLnJ1Y0V2ZW50LmVtaXQoeyB0eXBlOiAnZHJhd2VyVG9nZ2xlJywgb3BlbmVkOiBmYWxzZSwgcG9zaXRpb246IHRoaXMuY3VycmVudERyYXdlclBvc2l0aW9uIH0pO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5wZW5kaW5nRHJhd2VyUG9zaXRpb24pIHtcclxuICAgICAgICAgIHRoaXMuY3VycmVudERyYXdlclBvc2l0aW9uID0gdGhpcy5wZW5kaW5nRHJhd2VyUG9zaXRpb247XHJcbiAgICAgICAgICB0aGlzLnBlbmRpbmdEcmF3ZXJQb3NpdGlvbiA9IG51bGw7XHJcbiAgICAgICAgICB0aGlzLmFwcGx5SW5wdXRzKCk7XHJcbiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5zZXREcmF3ZXJPcGVuU3RhdGUodHJ1ZSk7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSBpZiAoZXZlbnQudG9TdGF0ZSA9PT0gJ2luJykge1xyXG4gICAgICAgIHRoaXMucnVjRXZlbnQuZW1pdCh7IHR5cGU6ICdvcGVuZWRDaGFuZ2UnLCBvcGVuZWQ6IHRydWUsIHBvc2l0aW9uOiB0aGlzLmN1cnJlbnREcmF3ZXJQb3NpdGlvbiB9KTtcclxuICAgICAgICB0aGlzLnJ1Y0V2ZW50LmVtaXQoeyB0eXBlOiAnZHJhd2VyVG9nZ2xlJywgb3BlbmVkOiB0cnVlLCBwb3NpdGlvbjogdGhpcy5jdXJyZW50RHJhd2VyUG9zaXRpb24gfSk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5pc0FuaW1hdGluZyA9IGZhbHNlO1xyXG4gICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBMb2FkcyB0aGUgZHluYW1pYyBjb21wb25lbnQgaW50byB0aGUgZHJhd2VyIGlmIHNwZWNpZmllZCBpbiBydWNJbnB1dERhdGEuXHJcbiAgICogQ2xlYXJzIGV4aXN0aW5nIGR5bmFtaWMgY29tcG9uZW50IGlmIGFueS5cclxuICAgKiBAcHJpdmF0ZVxyXG4gICAqL1xyXG4gIHByaXZhdGUgbG9hZER5bmFtaWNDb250ZW50KCk6IHZvaWQge1xyXG4gICAgdGhpcy5jbGVhckR5bmFtaWNDb250ZW50KCk7XHJcblxyXG4gICAgY29uc3QgY29tcG9uZW50VHlwZSA9IHRoaXMucnVjSW5wdXREYXRhLmNvbnRlbnQ/LmRyYXdlckNvbnRlbnRDb21wb25lbnQ7XHJcbiAgICBpZiAoY29tcG9uZW50VHlwZSAmJiB0aGlzLmRyYXdlckNvbXBvbmVudEhvc3QpIHtcclxuICAgICAgdGhpcy5keW5hbWljQ29tcG9uZW50UmVmID0gdGhpcy5kcmF3ZXJDb21wb25lbnRIb3N0LmNyZWF0ZUNvbXBvbmVudChjb21wb25lbnRUeXBlKTtcclxuICAgICAgaWYgKHRoaXMuZHluYW1pY0NvbXBvbmVudFJlZi5pbnN0YW5jZSkge1xyXG4gICAgICAgIHRoaXMuZHluYW1pY0NvbXBvbmVudFJlZi5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICh0aGlzLnJ1Y0lucHV0RGF0YS5kcmF3ZXJDb250ZW50Q29tcG9uZW50RGF0YSAmJiB0aGlzLmR5bmFtaWNDb21wb25lbnRSZWYuaW5zdGFuY2UpIHtcclxuICAgICAgICBPYmplY3Qua2V5cyh0aGlzLnJ1Y0lucHV0RGF0YS5kcmF3ZXJDb250ZW50Q29tcG9uZW50RGF0YSkuZm9yRWFjaChrZXkgPT4ge1xyXG4gICAgICAgICAgaWYgKGtleSBpbiB0aGlzLmR5bmFtaWNDb21wb25lbnRSZWYhLmluc3RhbmNlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZHluYW1pY0NvbXBvbmVudFJlZiEuaW5zdGFuY2Vba2V5XSA9IHRoaXMucnVjSW5wdXREYXRhLmRyYXdlckNvbnRlbnRDb21wb25lbnREYXRhW2tleV07XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5keW5hbWljQ29tcG9uZW50UmVmLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXR0ZXIgZm9yIHRoZSBjdXJyZW50IGFuaW1hdGlvbiBwYXJhbWV0ZXJzIHRvIGJlIHBhc3NlZCB0byB0aGUgYW5pbWF0aW9uIHRyaWdnZXJzIGluIHRoZSB0ZW1wbGF0ZS5cclxuICAgKiBJbmNsdWRlcyB0aGUgY3VycmVudCBhbmltYXRpb24gc3RhdGUgKCdpbicgb3IgJ291dCcpIGFuZCB0aGUgZWZmZWN0aXZlIGR1cmF0aW9uLlxyXG4gICAqL1xyXG4gIGdldCBhbmltYXRpb25QYXJhbXMoKSB7XHJcbiAgICByZXR1cm4geyB2YWx1ZTogdGhpcy5kcmF3ZXJBbmltYXRpb25TdGF0ZSwgcGFyYW1zOiB7IGR1cmF0aW9uOiB0aGlzLmVmZmVjdGl2ZUFuaW1hdGlvbkR1cmF0aW9uIH0gfTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldHRlciBmb3IgdGhlIGJhY2tkcm9wIGFuaW1hdGlvbiBwYXJhbWV0ZXJzLlxyXG4gICAqIFR5cGljYWxseSB1c2VzIGEgZmFzdGVyIGR1cmF0aW9uIHRoYW4gdGhlIG1haW4gZHJhd2VyIGFuaW1hdGlvbi5cclxuICAgKi9cclxuICBnZXQgYmFja2Ryb3BBbmltYXRpb25QYXJhbXMoKSB7XHJcbiAgICBsZXQgZHVyYXRpb25NcyA9IDA7XHJcbiAgICBpZiAodGhpcy5lZmZlY3RpdmVBbmltYXRpb25EdXJhdGlvbi5lbmRzV2l0aCgnbXMnKSkge1xyXG4gICAgICBkdXJhdGlvbk1zID0gcGFyc2VJbnQodGhpcy5lZmZlY3RpdmVBbmltYXRpb25EdXJhdGlvbiwgMTApO1xyXG4gICAgfSBlbHNlIGlmICh0aGlzLmVmZmVjdGl2ZUFuaW1hdGlvbkR1cmF0aW9uLmVuZHNXaXRoKCdzJykpIHtcclxuICAgICAgZHVyYXRpb25NcyA9IHBhcnNlRmxvYXQodGhpcy5lZmZlY3RpdmVBbmltYXRpb25EdXJhdGlvbikgKiAxMDAwO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgZHVyYXRpb25NcyA9IHBhcnNlSW50KHRoaXMuZWZmZWN0aXZlQW5pbWF0aW9uRHVyYXRpb24sIDEwKSB8fCAzMDA7IC8vIEZhbGxiYWNrIGlmIGZvcm1hdCBpcyB1bmV4cGVjdGVkXHJcbiAgICB9XHJcbiAgICBjb25zdCBiYWNrZHJvcER1cmF0aW9uVmFsdWUgPSBNYXRoLmZsb29yKGR1cmF0aW9uTXMgLyAyKTsgLy8gRW5zdXJlIGludGVnZXIgZm9yIG1zXHJcbiAgICBjb25zdCBiYWNrZHJvcER1cmF0aW9uID0gYmFja2Ryb3BEdXJhdGlvblZhbHVlID4gMCA/IGAke2JhY2tkcm9wRHVyYXRpb25WYWx1ZX1tc2AgOiAnMTUwbXMnOyAvLyBGYWxsYmFjayBpZiBjYWxjdWxhdGVkIGR1cmF0aW9uIGlzIDAgb3IgbGVzc1xyXG4gICAgcmV0dXJuIHsgdmFsdWU6IHRoaXMuZHJhd2VyQW5pbWF0aW9uU3RhdGUsIHBhcmFtczogeyBkdXJhdGlvbjogYmFja2Ryb3BEdXJhdGlvbiB9IH07XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIEdlbmVyYXRlcyBhbiBhY2Nlc3NpYmxlIGxhYmVsIGZvciB0aGUgdG9nZ2xlIGJ1dHRvbiBiYXNlZCBvbiB0aGUgZHJhd2VyJ3Mgc3RhdGUgYW5kIHBvc2l0aW9uLlxyXG4gICAqIEByZXR1cm5zIFRoZSBBUklBIGxhYmVsIHN0cmluZyBmb3IgdGhlIHRvZ2dsZSBidXR0b24uXHJcbiAgICovXHJcbiAgZ2V0VG9nZ2xlQnV0dG9uQXJpYUxhYmVsKCk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBkZWZhdWx0T3BlbiA9IGBPcGVuICR7dGhpcy5jdXJyZW50RHJhd2VyUG9zaXRpb259IERyYXdlcmA7XHJcbiAgICBjb25zdCBkZWZhdWx0Q2xvc2UgPSBgQ2xvc2UgJHt0aGlzLmN1cnJlbnREcmF3ZXJQb3NpdGlvbn0gRHJhd2VyYDtcclxuICAgIGNvbnN0IG9wZW5UZXh0ID0gdGhpcy5ydWNJbnB1dERhdGEudG9nZ2xlQnV0dG9uVGV4dD8ub3BlbiB8fCBkZWZhdWx0T3BlbjtcclxuICAgIGNvbnN0IGNsb3NlVGV4dCA9IHRoaXMucnVjSW5wdXREYXRhLnRvZ2dsZUJ1dHRvblRleHQ/LmNsb3NlIHx8IGRlZmF1bHRDbG9zZTtcclxuICAgIHJldHVybiB0aGlzLmRyYXdlckFuaW1hdGlvblN0YXRlID09PSAnaW4nID8gY2xvc2VUZXh0IDogb3BlblRleHQ7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBIYW5kbGVzIGNsaWNrcyBvbiB0aGUgYmFja2Ryb3AuXHJcbiAgICogQ2xvc2VzIHRoZSBkcmF3ZXIgb25seSBpZiBgZGlzYWJsZUNsb3NlYCBpcyBub3QgdHJ1ZS5cclxuICAgKiBAcHVibGljXHJcbiAgICovXHJcbiAgcHVibGljIGhhbmRsZUJhY2tkcm9wQ2xpY2soKTogdm9pZCB7XHJcbiAgICBpZiAoISh0aGlzLnJ1Y0lucHV0RGF0YS5kaXNhYmxlQ2xvc2UgPz8gZmFsc2UpKSB7XHJcbiAgICAgIHRoaXMudG9nZ2xlRHJhd2VyKHRoaXMuY3VycmVudERyYXdlclBvc2l0aW9uKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIExpc3RlbnMgZm9yIEVzY2FwZSBrZXkgcHJlc3NlcyBvbiB0aGUgZG9jdW1lbnQuXHJcbiAgICogQ2xvc2VzIHRoZSBkcmF3ZXIgaWYgaXQncyBvcGVuIGFuZCBgZGlzYWJsZUNsb3NlYCBpcyBub3QgdHJ1ZS5cclxuICAgKiBAcGFyYW0gZXZlbnQgLSBUaGUgS2V5Ym9hcmRFdmVudC5cclxuICAgKi9cclxuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDprZXlkb3duLmVzY2FwZScsIFsnJGV2ZW50J10pXHJcbiAgb25LZXlkb3duSGFuZGxlcihldmVudDogS2V5Ym9hcmRFdmVudCkge1xyXG4gICAgaWYgKHRoaXMuZHJhd2VyQW5pbWF0aW9uU3RhdGUgPT09ICdpbicgJiYgISh0aGlzLnJ1Y0lucHV0RGF0YS5kaXNhYmxlQ2xvc2UgPz8gZmFsc2UpKSB7XHJcbiAgICAgIHRoaXMudG9nZ2xlRHJhd2VyKHRoaXMuY3VycmVudERyYXdlclBvc2l0aW9uKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENsZWFycyBhbnkgZHluYW1pY2FsbHkgbG9hZGVkIGNvbXBvbmVudC5cclxuICAgKiBAcHJpdmF0ZVxyXG4gICAqL1xyXG4gIHByaXZhdGUgY2xlYXJEeW5hbWljQ29udGVudCgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmRyYXdlckNvbXBvbmVudEhvc3QpIHtcclxuICAgICAgdGhpcy5kcmF3ZXJDb21wb25lbnRIb3N0LmNsZWFyKCk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5keW5hbWljQ29tcG9uZW50UmVmKSB7XHJcbiAgICAgIHRoaXMuZHluYW1pY0NvbXBvbmVudFJlZi5kZXN0cm95KCk7XHJcbiAgICAgIHRoaXMuZHluYW1pY0NvbXBvbmVudFJlZiA9IG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBBbmd1bGFyIGxpZmVjeWNsZSBob29rIHRoYXQgaXMgY2FsbGVkIGNsZWFyIGR5bmFtaWMgY29tcG9uZW50IGNvbnRlbnQuXHJcbiAgICovXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLmNsZWFyRHluYW1pY0NvbnRlbnQoKTtcclxuICB9XHJcbn0iLCI8IS0tIFxyXG4gIEN1c3RvbSBCYWNrZHJvcCBlbGVtZW50LlxyXG4gIFZpc2libGUgb25seSB3aGVuOlxyXG4gIC0gcnVjSW5wdXREYXRhLm1vZGUgaXMgJ292ZXInXHJcbiAgLSBydWNJbnB1dERhdGEuaGFzQmFja2Ryb3AgaXMgdHJ1ZSAob3IgdW5kZWZpbmVkLCBkZWZhdWx0aW5nIHRvIHRydWUpXHJcbiAgLSBkcmF3ZXJBbmltYXRpb25TdGF0ZSBpcyAnaW4nIChkcmF3ZXIgaXMgb3BlbiBvciBvcGVuaW5nKVxyXG4gIEFuaW1hdGVzIHVzaW5nICdiYWNrZHJvcEZhZGUnIHRyaWdnZXIuXHJcbiAgQ2xpY2tpbmcgdGhlIGJhY2tkcm9wIHdpbGwgdG9nZ2xlIHRoZSBkcmF3ZXIgZm9yIHRoZSBjdXJyZW50IHBvc2l0aW9uLlxyXG4gIEJhY2tncm91bmQgY29sb3IgY2FuIGJlIGN1c3RvbWl6ZWQgdmlhIHJ1Y0lucHV0RGF0YS5iYWNrZHJvcEJhY2tncm91bmRDb2xvci5cclxuLS0+XHJcbjxkaXYgY2xhc3M9XCJjdXN0b20tYmFja2Ryb3BcIlxyXG4gICAgICpuZ0lmPVwicnVjSW5wdXREYXRhLm1vZGUgPT09ICdvdmVyJyAmJiAocnVjSW5wdXREYXRhLmhhc0JhY2tkcm9wID8/IHRydWUpICYmIGRyYXdlckFuaW1hdGlvblN0YXRlID09PSAnaW4nXCJcclxuICAgICBbQGJhY2tkcm9wRmFkZV09XCJiYWNrZHJvcEFuaW1hdGlvblBhcmFtc1wiXHJcbiAgICAgKGNsaWNrKT1cImhhbmRsZUJhY2tkcm9wQ2xpY2soKVwiXHJcbiAgICAgW3N0eWxlLmJhY2tncm91bmQtY29sb3JdPVwicnVjSW5wdXREYXRhLmhhc0JhY2tkcm9wID8gcnVjSW5wdXREYXRhLmJhY2tkcm9wQmFja2dyb3VuZENvbG9yIDogJydcIj5cclxuPC9kaXY+XHJcblxyXG48IS0tIFxyXG4gIEN1c3RvbSBEeW5hbWljIERyYXdlciBlbGVtZW50LlxyXG4gIFRoaXMgaXMgdGhlIG1haW4gcGFuZWwgdGhhdCBzbGlkZXMgaW4gYW5kIG91dC5cclxuICAtIEFwcGxpZXMgQ1NTIGNsYXNzZXMgYmFzZWQgb24gY3VycmVudERyYXdlclBvc2l0aW9uIGFuZCBjdXN0b21UaGVtZS5cclxuICAtIER5bmFtaWNhbGx5IHNldHMgd2lkdGggYW5kIGhlaWdodCBiYXNlZCBvbiBkcmF3ZXIgb3JpZW50YXRpb24gYW5kIGlucHV0IGRhdGEuXHJcbiAgLSBVc2VzIG9uZSBvZiBmb3VyIGFuaW1hdGlvbiB0cmlnZ2VycyAoc2xpZGVJbk91dExlZnQsIHNsaWRlSW5PdXRSaWdodCwgc2xpZGVJbk91dFRvcCwgc2xpZGVJbk91dEJvdHRvbSlcclxuICAgIGJhc2VkIG9uIGN1cnJlbnREcmF3ZXJQb3NpdGlvbi4gT25seSB0aGUgYWN0aXZlIHRyaWdnZXIgcnVucyBpdHMgYW5pbWF0aW9uOyBvdGhlcnMgYXJlIHNldCB0byBhblxyXG4gICAgaW5zdGFudCAnb3V0JyBzdGF0ZSB0byBwcmV2ZW50IGludGVyZmVyZW5jZS5cclxuICAtIEFuaW1hdGlvbiBjb21wbGV0aW9uIGV2ZW50cyBhcmUgaGFuZGxlZCBieSBvbkFuaW1hdGlvbkRvbmUoKS5cclxuLS0+XHJcblxyXG48ZGl2IGNsYXNzPVwibWFpblwiPlxyXG4gIDxkaXYgY2xhc3M9XCJkeW5hbWljLWRyYXdlclwiXHJcbiAgICAgIFtuZ0NsYXNzXT1cIidkcmF3ZXItJyArIGN1cnJlbnREcmF3ZXJQb3NpdGlvbiArICcgJyArIChjdXN0b21UaGVtZSB8fCAnJylcIlxyXG4gICAgICBbc3R5bGUud2lkdGhdPVwiIWlzVmVydGljYWxMYXlvdXQgPyBlZmZlY3RpdmVEcmF3ZXJEaW1lbnNpb24gOiAnMTAwJSdcIlxyXG4gICAgICBbc3R5bGUuaGVpZ2h0XT1cImlzVmVydGljYWxMYXlvdXQgPyBlZmZlY3RpdmVEcmF3ZXJEaW1lbnNpb24gOiAnMTAwJSdcIlxyXG5cclxuICAgICAgW0BzbGlkZUluT3V0TGVmdF09XCJjdXJyZW50RHJhd2VyUG9zaXRpb24gPT09ICdsZWZ0JyA/IGFuaW1hdGlvblBhcmFtcyA6IHt2YWx1ZTogJ291dCcsIHBhcmFtczoge2R1cmF0aW9uOiAnMG1zJ319XCJcclxuICAgICAgKEBzbGlkZUluT3V0TGVmdC5kb25lKT1cImN1cnJlbnREcmF3ZXJQb3NpdGlvbiA9PT0gJ2xlZnQnICYmIG9uQW5pbWF0aW9uRG9uZSgkZXZlbnQpXCJcclxuXHJcbiAgICAgIFtAc2xpZGVJbk91dFJpZ2h0XT1cImN1cnJlbnREcmF3ZXJQb3NpdGlvbiA9PT0gJ3JpZ2h0JyA/IGFuaW1hdGlvblBhcmFtcyA6IHt2YWx1ZTogJ291dCcsIHBhcmFtczoge2R1cmF0aW9uOiAnMG1zJ319XCJcclxuICAgICAgKEBzbGlkZUluT3V0UmlnaHQuZG9uZSk9XCJjdXJyZW50RHJhd2VyUG9zaXRpb24gPT09ICdyaWdodCcgJiYgb25BbmltYXRpb25Eb25lKCRldmVudClcIlxyXG5cclxuICAgICAgW0BzbGlkZUluT3V0VG9wXT1cImN1cnJlbnREcmF3ZXJQb3NpdGlvbiA9PT0gJ3RvcCcgPyBhbmltYXRpb25QYXJhbXMgOiB7dmFsdWU6ICdvdXQnLCBwYXJhbXM6IHtkdXJhdGlvbjogJzBtcyd9fVwiXHJcbiAgICAgIChAc2xpZGVJbk91dFRvcC5kb25lKT1cImN1cnJlbnREcmF3ZXJQb3NpdGlvbiA9PT0gJ3RvcCcgJiYgb25BbmltYXRpb25Eb25lKCRldmVudClcIlxyXG5cclxuICAgICAgW0BzbGlkZUluT3V0Qm90dG9tXT1cImN1cnJlbnREcmF3ZXJQb3NpdGlvbiA9PT0gJ2JvdHRvbScgPyBhbmltYXRpb25QYXJhbXMgOiB7dmFsdWU6ICdvdXQnLCBwYXJhbXM6IHtkdXJhdGlvbjogJzBtcyd9fVwiXHJcbiAgICAgIChAc2xpZGVJbk91dEJvdHRvbS5kb25lKT1cImN1cnJlbnREcmF3ZXJQb3NpdGlvbiA9PT0gJ2JvdHRvbScgJiYgb25BbmltYXRpb25Eb25lKCRldmVudClcIj5cclxuXHJcbiAgICA8IS0tIFdyYXBwZXIgZm9yIHRoZSBjb250ZW50IGluc2lkZSB0aGUgZHJhd2VyLCBoYW5kbGVzIHBhZGRpbmcgYW5kIGxheW91dC4gLS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZHJhd2VyLWNvbnRlbnQtd3JhcHBlclwiPlxyXG4gICAgICA8IS0tIE9wdGlvbmFsIHRpdGxlIGZvciB0aGUgZHJhd2VyLiAtLT5cclxuICAgICAgPGgyICpuZ0lmPVwicnVjSW5wdXREYXRhLmNvbnRlbnQ/LmRyYXdlclRpdGxlXCIgY2xhc3M9XCJydWNsaWItZHJhd2VyLXRpdGxlXCI+XHJcbiAgICAgICAge3sgcnVjSW5wdXREYXRhLmNvbnRlbnQ/LmRyYXdlclRpdGxlIH19XHJcbiAgICAgIDwvaDI+XHJcbiAgICAgIDwhLS0gXHJcbiAgICAgICAgT3B0aW9uYWwgY2xvc2UgYnV0dG9uIGluc2lkZSB0aGUgZHJhd2VyLlxyXG4gICAgICAgIFRvZ2dsZXMgdGhlIGRyYXdlciBmb3IgdGhlIGN1cnJlbnQgcG9zaXRpb24gd2hlbiBjbGlja2VkLlxyXG4gICAgICAgIEFSSUEgbGFiZWwgcHJvdmlkZXMgYWNjZXNzaWJpbGl0eS5cclxuICAgICAgICBEaW1lbnNpb25zIGNhbiBiZSBjdXN0b21pemVkIHZpYSBydWNJbnB1dERhdGEuY2xvc2VCdXR0b25EaW1lbnNpb25zLlxyXG4gICAgICAtLT5cclxuICAgICAgPGJ1dHRvbiAqbmdJZj1cInJ1Y0lucHV0RGF0YS5zaG93Q2xvc2VJY29uXCJcclxuICAgICAgICAgICAgICBtYXQtaWNvbi1idXR0b24gY2xhc3M9XCJydWNsaWItZHJhd2VyLWNsb3NlLWJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZURyYXdlcihjdXJyZW50RHJhd2VyUG9zaXRpb24pXCJcclxuICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidDbG9zZSAnICsgY3VycmVudERyYXdlclBvc2l0aW9uICsgJyBkcmF3ZXInXCJcclxuICAgICAgICAgICAgICBbc3R5bGUud2lkdGhdPVwicnVjSW5wdXREYXRhLmNsb3NlQnV0dG9uRGltZW5zaW9ucz8ud2lkdGhcIlxyXG4gICAgICAgICAgICAgIFtzdHlsZS5oZWlnaHRdPVwicnVjSW5wdXREYXRhLmNsb3NlQnV0dG9uRGltZW5zaW9ucz8uaGVpZ2h0XCI+XHJcbiAgICAgICAgPCEtLSBNYXRlcmlhbCBpY29uIGZvciB0aGUgY2xvc2UgYnV0dG9uLiBTaXplIGNhbiBiZSBjdXN0b21pemVkLiAtLT5cclxuICAgICAgICA8bWF0LWljb24gW3N0eWxlLmZvbnQtc2l6ZV09XCJydWNJbnB1dERhdGEuY2xvc2VCdXR0b25EaW1lbnNpb25zPy5pY29uU2l6ZVwiPmNsb3NlPC9tYXQtaWNvbj5cclxuICAgICAgPC9idXR0b24+XHJcbiAgICAgIDwhLS0gTWFpbiBib2R5IGNvbnRlbnQgb2YgdGhlIGRyYXdlci4gLS0+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJydWNsaWItZHJhd2VyLWJvZHlcIj5cclxuICAgICAgICA8IS0tIEhvc3QgZm9yIGR5bmFtaWNhbGx5IGluamVjdGVkIGNvbXBvbmVudCAtLT5cclxuICAgICAgICA8bmctdGVtcGxhdGUgI2RyYXdlckNvbXBvbmVudEhvc3Q+PC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICA8IS0tIEZhbGxiYWNrIHRvIEhUTUwgY29udGVudCBpZiBubyBjb21wb25lbnQgaXMgcHJvdmlkZWQgLS0+XHJcbiAgICAgICAgPGRpdiAqbmdJZj1cIiFydWNJbnB1dERhdGEuY29udGVudD8uZHJhd2VyQ29udGVudENvbXBvbmVudFwiIFtpbm5lckhUTUxdPVwicnVjSW5wdXREYXRhLmNvbnRlbnQ/LmRyYXdlckJvZHkgfHwgJycgfCBzYWZlSHRtbFwiPjwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG48L2Rpdj5cclxuXHJcbjwhLS0gXHJcbiAgQW5ndWxhciBNYXRlcmlhbCBEcmF3ZXIgQ29udGFpbmVyLlxyXG4gIEFjdHMgYXMgdGhlIG1haW4gY29udGFpbmVyIGZvciB0aGUgZHJhd2VyIHN5c3RlbSwgZXNwZWNpYWxseSBpZiAnc2lkZScgb3IgJ3B1c2gnIG1vZGVzXHJcbiAgd2VyZSB0byBiZSBpbXBsZW1lbnRlZCB3aXRoIE1hdERyYXdlcidzIG5hdGl2ZSBiZWhhdmlvci4gV2l0aCBjdXN0b20gZml4ZWQtcG9zaXRpb24gYW5pbWF0aW9ucyxcclxuICBpdHMgcHJpbWFyeSByb2xlIGhlcmUgaXMgdG8gaG9zdCB0aGUgbWF0LWRyYXdlci1jb250ZW50LlxyXG4gIC0gQXBwbGllcyAndmVydGljYWwtbGF5b3V0JyBjbGFzcyBpZiB0aGUgZHJhd2VyIGlzIHRvcC9ib3R0b20uXHJcbiAgLSBNYXREcmF3ZXIncyBvd24gYmFja2Ryb3AgaXMgZGlzYWJsZWQgYXMgYSBjdXN0b20gb25lIGlzIHVzZWQuXHJcbi0tPlxyXG48bWF0LWRyYXdlci1jb250YWluZXJcclxuICBjbGFzcz1cInJ1Y2xpYi1kcmF3ZXItY29udGFpbmVyXCJcclxuICBbY2xhc3MudmVydGljYWwtbGF5b3V0XT1cImlzVmVydGljYWxMYXlvdXRcIlxyXG4gIFtoYXNCYWNrZHJvcF09XCJmYWxzZVwiPiA8IS0tIE1hdERyYXdlcidzIGJhY2tkcm9wIGlzIG5vdCB1c2VkIHdpdGggY3VzdG9tIGFuaW1hdGlvbiAtLT5cclxuICA8bWF0LWRyYXdlci1jb250ZW50IGNsYXNzPVwicnVjbGliLW1haW4tY29udGVudFwiPlxyXG4gICAgPGJ1dHRvbiBbZGlzYWJsZWRdPVwicnVjSW5wdXREYXRhLmRpc2FibGVUb2dnbGVCdXR0b25Jbk1haW5Db250ZW50XCJcclxuICAgICAgICAgICAgbWF0LXJhaXNlZC1idXR0b25cclxuICAgICAgICAgICAgY29sb3I9XCJwcmltYXJ5XCJcclxuICAgICAgICAgICAgdGl0bGU9XCJUb2dnbGUgRHJhd2VyXCJcclxuICAgICAgICAgICAgY2xhc3M9XCJkcmF3ZXItdG9nZ2xlLWJ1dHRvblwiXHJcbiAgICAgICAgICAgIFtzdHlsZS53aWR0aF09XCJydWNJbnB1dERhdGEudG9nZ2xlQnV0dG9uRGltZW5zaW9ucz8ud2lkdGhcIlxyXG4gICAgICAgICAgICBbc3R5bGUuaGVpZ2h0XT1cInJ1Y0lucHV0RGF0YS50b2dnbGVCdXR0b25EaW1lbnNpb25zPy5oZWlnaHRcIlxyXG4gICAgICAgICAgICBbc3R5bGUucGFkZGluZ109XCJydWNJbnB1dERhdGEudG9nZ2xlQnV0dG9uRGltZW5zaW9ucz8ucGFkZGluZ1wiXHJcbiAgICAgICAgICAgIFtzdHlsZS5mb250LXNpemVdPVwicnVjSW5wdXREYXRhLnRvZ2dsZUJ1dHRvbkRpbWVuc2lvbnM/LmZvbnRTaXplXCJcclxuICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZURyYXdlcihjdXJyZW50RHJhd2VyUG9zaXRpb24pXCJcclxuICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJnZXRUb2dnbGVCdXR0b25BcmlhTGFiZWwoKVwiXHJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtZXhwYW5kZWRdPVwiZHJhd2VyQW5pbWF0aW9uU3RhdGUgPT09ICdpbidcIj5cclxuICAgICAgPCEtLSBPcHRpb25hbCBNYXRlcmlhbCBpY29uIGZvciB0aGUgdG9nZ2xlIGJ1dHRvbi4gU2hvdyBvbmx5IGlmIG5vIGltYWdlIFVSTCBpcyBwcm92aWRlZC4gLS0+XHJcbiAgICAgIDxtYXQtaWNvbiAqbmdJZj1cInJ1Y0lucHV0RGF0YS50b2dnbGVCdXR0b25JY29uICYmICFydWNJbnB1dERhdGEudG9nZ2xlQnV0dG9uSW1hZ2VVcmxcIiBbc3R5bGUuZm9udC1zaXplXT1cInJ1Y0lucHV0RGF0YS50b2dnbGVCdXR0b25EaW1lbnNpb25zPy5pY29uU2l6ZVwiPnt7IHJ1Y0lucHV0RGF0YS50b2dnbGVCdXR0b25JY29uIH19PC9tYXQtaWNvbj5cclxuICAgICAgPCEtLSBPcHRpb25hbCBpbWFnZSBmb3IgdGhlIHRvZ2dsZSBidXR0b24uIElmIHByZXNlbnQsIGl0IHNob3VsZCBmaWxsIHRoZSBidXR0b24uIC0tPlxyXG4gICAgICA8aW1nICpuZ0lmPVwicnVjSW5wdXREYXRhLnRvZ2dsZUJ1dHRvbkltYWdlVXJsXCJcclxuICAgICAgICAgICBbc3JjXT1cInJ1Y0lucHV0RGF0YS50b2dnbGVCdXR0b25JbWFnZVVybFwiXHJcbiAgICAgICAgICAgW2FsdF09XCJydWNJbnB1dERhdGEudG9nZ2xlQnV0dG9uSW1hZ2VBbHQgfHwgJ1RvZ2dsZSBEcmF3ZXInXCJcclxuICAgICAgICAgICBjbGFzcz1cInJ1Y2xpYi1kcmF3ZXItdG9nZ2xlLWltYWdlXCJcclxuICAgICAgICAgICBbc3R5bGUud2lkdGhdPVwicnVjSW5wdXREYXRhLnRvZ2dsZUJ1dHRvbkRpbWVuc2lvbnM/LndpZHRoXCJcclxuICAgICAgICAgICBbc3R5bGUuaGVpZ2h0XT1cInJ1Y0lucHV0RGF0YS50b2dnbGVCdXR0b25EaW1lbnNpb25zPy5oZWlnaHRcIlxyXG4gICAgICAgICAgIFtzdHlsZS5wYWRkaW5nXT1cInJ1Y0lucHV0RGF0YS50b2dnbGVCdXR0b25EaW1lbnNpb25zPy5wYWRkaW5nXCI+XHJcbiAgICAgIDwhLS0gVGV4dCBmb3IgdGhlIHRvZ2dsZSBidXR0b24uIFNob3cgb25seSBpZiBOTyBpY29uIEFORCBOTyBpbWFnZSBVUkwgaXMgcHJvdmlkZWQuIC0tPlxyXG4gICAgICA8c3BhbiAqbmdJZj1cIiFydWNJbnB1dERhdGEudG9nZ2xlQnV0dG9uSWNvbiAmJiAhcnVjSW5wdXREYXRhLnRvZ2dsZUJ1dHRvbkltYWdlVXJsICYmIChydWNJbnB1dERhdGEudG9nZ2xlQnV0dG9uVGV4dD8ub3BlbiB8fCBydWNJbnB1dERhdGEudG9nZ2xlQnV0dG9uVGV4dD8uY2xvc2UpXCI+XHJcbiAgICAgICAge3sgZHJhd2VyQW5pbWF0aW9uU3RhdGUgPT09ICdpbicgPyAocnVjSW5wdXREYXRhLnRvZ2dsZUJ1dHRvblRleHQ/LmNsb3NlIHx8ICdDbG9zZScpIDogKHJ1Y0lucHV0RGF0YS50b2dnbGVCdXR0b25UZXh0Py5vcGVuIHx8ICdPcGVuJykgfX1cclxuICAgICAgPC9zcGFuPlxyXG4gICAgICA8IS0tIFRleHQgZm9yIHRoZSB0b2dnbGUgYnV0dG9uIHdoZW4gYW4gaWNvbiAoYnV0IE5PIGltYWdlKSBJUyBhbHNvIHByZXNlbnQuIC0tPlxyXG4gICAgICA8c3BhbiAqbmdJZj1cInJ1Y0lucHV0RGF0YS50b2dnbGVCdXR0b25JY29uICYmICFydWNJbnB1dERhdGEudG9nZ2xlQnV0dG9uSW1hZ2VVcmwgJiYgKHJ1Y0lucHV0RGF0YS50b2dnbGVCdXR0b25UZXh0Py5vcGVuIHx8IHJ1Y0lucHV0RGF0YS50b2dnbGVCdXR0b25UZXh0Py5jbG9zZSlcIiBjbGFzcz1cInRvZ2dsZS1idXR0b24tdGV4dC13aXRoLWljb25cIj5cclxuICAgICAgICB7eyBkcmF3ZXJBbmltYXRpb25TdGF0ZSA9PT0gJ2luJyA/IChydWNJbnB1dERhdGEudG9nZ2xlQnV0dG9uVGV4dD8uY2xvc2UgfHwgJ0Nsb3NlJykgOiAocnVjSW5wdXREYXRhLnRvZ2dsZUJ1dHRvblRleHQ/Lm9wZW4gfHwgJ09wZW4nKSB9fVxyXG4gICAgICA8L3NwYW4+XHJcbiAgICA8L2J1dHRvbj5cclxuICAgIDwhLS0gTWFpbiBhcHBsaWNhdGlvbiBjb250ZW50IGFyZWEsIHJlbmRlcmVkIGZyb20gSFRNTCBzdHJpbmcgdmlhIHNhZmVIdG1sIHBpcGUuIC0tPlxyXG4gICAgPGRpdiBbaW5uZXJIVE1MXT1cInJ1Y0lucHV0RGF0YS5jb250ZW50Py5tYWluQm9keSB8fCAnJyB8IHNhZmVIdG1sXCI+PC9kaXY+XHJcbiAgPC9tYXQtZHJhd2VyLWNvbnRlbnQ+XHJcbjwvbWF0LWRyYXdlci1jb250YWluZXI+Il19