@solar-angular/ui-sun 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,7 @@
1
+ # ui-sun
2
+
3
+ This library was generated with [Nx](https://nx.dev).
4
+
5
+ ## Running unit tests
6
+
7
+ Run `nx test ui-sun` to execute the unit tests.
@@ -0,0 +1,2 @@
1
+ export default void 0;
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9wYWNrYWdlcy91aS1zdW4vaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsZUFBZSxLQUFLLENBQUMsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBkZWZhdWx0IHZvaWQgMFxuIl19
@@ -0,0 +1,2 @@
1
+ export * from './nav-progress-bar.component';
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wYWNrYWdlcy91aS1zdW4vbmF2LXByb2dyZXNzLWJhci9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLDhCQUE4QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9uYXYtcHJvZ3Jlc3MtYmFyLmNvbXBvbmVudCc7XG4iXX0=
@@ -0,0 +1,18 @@
1
+ import { AsyncPipe } from '@angular/common';
2
+ import { ChangeDetectionStrategy, Component, inject } from '@angular/core';
3
+ import { NavigationEnd, NavigationError, NavigationStart, Router } from '@angular/router';
4
+ import { fadeAnimation } from '@solar-angular/animations';
5
+ import { distinctUntilChanged, filter, map, shareReplay, startWith } from 'rxjs';
6
+ import * as i0 from "@angular/core";
7
+ export class SunNavProgressBar {
8
+ constructor() {
9
+ this.navigating$ = inject(Router).events.pipe(filter(event => event instanceof NavigationStart || event instanceof NavigationEnd || event instanceof NavigationError), map(event => event instanceof NavigationStart), startWith(true), distinctUntilChanged(), shareReplay(1));
10
+ }
11
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SunNavProgressBar, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
12
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: SunNavProgressBar, isStandalone: true, selector: "sun-nav-progress-bar", ngImport: i0, template: `@if (navigating$ | async) {<div @fadeAnimation></div>}`, isInline: true, styles: [":host{--track-color: transparent;--progress-color: var(--color-primary)}:host>div{position:fixed;top:0;left:0;width:100%;height:2.5px;background:var(--track-color);z-index:999}:host>div:after{content:\"\";display:block;height:100%;width:40%;transform-origin:left;background:var(--progress-color);animation:nav-progress 1.5s infinite linear}@keyframes nav-progress{0%{transform:translate(250%) scaleX(.2)}80%{transform:translate(0) scaleX(1)}to{transform:translate(0) scaleX(0)}}\n"], dependencies: [{ kind: "pipe", type: AsyncPipe, name: "async" }], animations: [fadeAnimation], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
13
+ }
14
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SunNavProgressBar, decorators: [{
15
+ type: Component,
16
+ args: [{ selector: 'sun-nav-progress-bar', template: `@if (navigating$ | async) {<div @fadeAnimation></div>}`, standalone: true, imports: [AsyncPipe], changeDetection: ChangeDetectionStrategy.OnPush, animations: [fadeAnimation], styles: [":host{--track-color: transparent;--progress-color: var(--color-primary)}:host>div{position:fixed;top:0;left:0;width:100%;height:2.5px;background:var(--track-color);z-index:999}:host>div:after{content:\"\";display:block;height:100%;width:40%;transform-origin:left;background:var(--progress-color);animation:nav-progress 1.5s infinite linear}@keyframes nav-progress{0%{transform:translate(250%) scaleX(.2)}80%{transform:translate(0) scaleX(1)}to{transform:translate(0) scaleX(0)}}\n"] }]
17
+ }] });
18
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmF2LXByb2dyZXNzLWJhci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wYWNrYWdlcy91aS1zdW4vbmF2LXByb2dyZXNzLWJhci9uYXYtcHJvZ3Jlc3MtYmFyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDNUMsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0UsT0FBTyxFQUFFLGFBQWEsRUFBRSxlQUFlLEVBQUUsZUFBZSxFQUFFLE1BQU0sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzFGLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDOztBQVdqRixNQUFNLE9BQU8saUJBQWlCO0lBVDlCO1FBVUUsZ0JBQVcsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FDdEMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQ2IsS0FBSyxZQUFZLGVBQWUsSUFBSSxLQUFLLFlBQVksYUFBYSxJQUFJLEtBQUssWUFBWSxlQUFlLENBQ3ZHLEVBQ0QsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxZQUFZLGVBQWUsQ0FBQyxFQUM5QyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQ2Ysb0JBQW9CLEVBQUUsRUFDdEIsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUNmLENBQUM7S0FDSDsrR0FWWSxpQkFBaUI7bUdBQWpCLGlCQUFpQixnRkFQbEIsd0RBQXdELHFpQkFFeEQsU0FBUyxnQ0FHUCxDQUFDLGFBQWEsQ0FBQzs7NEZBRWhCLGlCQUFpQjtrQkFUN0IsU0FBUzsrQkFDRSxzQkFBc0IsWUFDdEIsd0RBQXdELGNBQ3RELElBQUksV0FDUCxDQUFDLFNBQVMsQ0FBQyxtQkFFSCx1QkFBdUIsQ0FBQyxNQUFNLGNBQ25DLENBQUMsYUFBYSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQXN5bmNQaXBlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTmF2aWdhdGlvbkVuZCwgTmF2aWdhdGlvbkVycm9yLCBOYXZpZ2F0aW9uU3RhcnQsIFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBmYWRlQW5pbWF0aW9uIH0gZnJvbSAnQHNvbGFyLWFuZ3VsYXIvYW5pbWF0aW9ucyc7XG5pbXBvcnQgeyBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgZmlsdGVyLCBtYXAsIHNoYXJlUmVwbGF5LCBzdGFydFdpdGggfSBmcm9tICdyeGpzJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnc3VuLW5hdi1wcm9ncmVzcy1iYXInLFxuICB0ZW1wbGF0ZTogYEBpZiAobmF2aWdhdGluZyQgfCBhc3luYykgezxkaXYgQGZhZGVBbmltYXRpb24+PC9kaXY+fWAsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtBc3luY1BpcGVdLFxuICBzdHlsZVVybDogJy4vbmF2LXByb2dyZXNzLWJhci5jb21wb25lbnQuc2NzcycsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBhbmltYXRpb25zOiBbZmFkZUFuaW1hdGlvbl1cbn0pXG5leHBvcnQgY2xhc3MgU3VuTmF2UHJvZ3Jlc3NCYXIge1xuICBuYXZpZ2F0aW5nJCA9IGluamVjdChSb3V0ZXIpLmV2ZW50cy5waXBlKFxuICAgIGZpbHRlcihldmVudCA9PlxuICAgICAgZXZlbnQgaW5zdGFuY2VvZiBOYXZpZ2F0aW9uU3RhcnQgfHwgZXZlbnQgaW5zdGFuY2VvZiBOYXZpZ2F0aW9uRW5kIHx8IGV2ZW50IGluc3RhbmNlb2YgTmF2aWdhdGlvbkVycm9yXG4gICAgKSxcbiAgICBtYXAoZXZlbnQgPT4gZXZlbnQgaW5zdGFuY2VvZiBOYXZpZ2F0aW9uU3RhcnQpLFxuICAgIHN0YXJ0V2l0aCh0cnVlKSxcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG59XG4iXX0=
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ export * from './index';
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29sYXItYW5ndWxhci11aS1zdW4tbmF2LXByb2dyZXNzLWJhci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL3VpLXN1bi9uYXYtcHJvZ3Jlc3MtYmFyL3NvbGFyLWFuZ3VsYXItdWktc3VuLW5hdi1wcm9ncmVzcy1iYXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLFNBQVMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2VuZXJhdGVkIGJ1bmRsZSBpbmRleC4gRG8gbm90IGVkaXQuXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9pbmRleCc7XG4iXX0=
@@ -0,0 +1,3 @@
1
+ export * from './model';
2
+ export * from './slider-captcha.component';
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wYWNrYWdlcy91aS1zdW4vc2xpZGVyLWNhcHRjaGEvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxTQUFTLENBQUE7QUFDdkIsY0FBYyw0QkFBNEIsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vbW9kZWwnXG5leHBvcnQgKiBmcm9tICcuL3NsaWRlci1jYXB0Y2hhLmNvbXBvbmVudCdcbiJdfQ==
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wYWNrYWdlcy91aS1zdW4vc2xpZGVyLWNhcHRjaGEvbW9kZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBpbnRlcmZhY2UgQ2FwdGNoYSB7XG4gIGppZ3Nhd0ltYWdlQmFzZTY0OiBzdHJpbmc7XG4gIG9yaWdpbmFsSW1hZ2VCYXNlNjQ6IHN0cmluZztcbiAgcmVzdWx0OiBib29sZWFuO1xuICBzZWNyZXRLZXk6IHN0cmluZztcbiAgdG9rZW46IHN0cmluZztcbiAgY2FwdGNoYTogc3RyaW5nO1xuICBjYXB0Y2hhVHlwZTogc3RyaW5nO1xuICBwb2ludEpzb246IHN0cmluZztcbiAgd29yZExpc3Q6IGFueVtdO1xuICBjbGllbnRJZDogc3RyaW5nO1xuICBjbGllbnRTZWNyZXQ6IHN0cmluZztcbn1cblxuZXhwb3J0IGNvbnN0IGVudW0gQ2FwdGNoYVR5cGUge1xuICBCbG9ja1B1enpsZSA9ICdibG9ja1B1enpsZScsXG4gIENsaWNrV29yZCA9ICdjbGlja1dvcmQnXG59XG4iXX0=
@@ -0,0 +1,219 @@
1
+ import { afterNextRender, Component, EventEmitter, HostBinding, HostListener, Input, numberAttribute, Output, ViewChild } from '@angular/core';
2
+ import { fromEvent, take, zip } from 'rxjs';
3
+ import { aesEncrypt, HTTP_OPTIONS, withDpr, withPixel } from './utils';
4
+ import * as i0 from "@angular/core";
5
+ import * as i1 from "@angular/common/http";
6
+ /** 验证码的原始尺寸 */
7
+ const HEIGHT = 155, WIDTH = 310;
8
+ /** 拼图的原始尺寸 */
9
+ const PUZZLE_HEIGHT = 155, PUZZLE_WIDTH = 50;
10
+ export class SunSliderCaptcha {
11
+ /**
12
+ * 当前尺寸 除于 原始尺寸得到的商
13
+ * 用于等比例缩放
14
+ */
15
+ get quotient() {
16
+ return {
17
+ width: this.width / WIDTH,
18
+ height: this.height / HEIGHT
19
+ };
20
+ }
21
+ constructor(http) {
22
+ this.http = http;
23
+ this.loading = false;
24
+ this.verifying = false;
25
+ this.width = WIDTH;
26
+ this.height = HEIGHT;
27
+ this.verified = new EventEmitter();
28
+ /** 滑块拼图的x坐标 */
29
+ this.x = 0;
30
+ this.secrets = {};
31
+ this.alert = {
32
+ type: 'success', // error
33
+ msg: '',
34
+ show: false
35
+ };
36
+ /** 滑动开始的X */
37
+ this.dragStartX = -1;
38
+ /** 滑动bar初始的scrollLeft */
39
+ this.scrollLeft = 0;
40
+ this.bar = {
41
+ blockWidth: 42, // 滑块宽度
42
+ background: 'var(--indicator-primary-color)'
43
+ };
44
+ afterNextRender(() => {
45
+ const dpr = devicePixelRatio;
46
+ this.canvas = this.canvasRef.nativeElement;
47
+ this.canvas.style.width = withPixel(this.width);
48
+ this.canvas.style.height = withPixel(this.height);
49
+ this.canvas.width = withDpr(this.width);
50
+ this.canvas.height = withDpr(this.height);
51
+ this.ctx = this.canvas.getContext('2d');
52
+ this.ctx.scale(dpr, dpr);
53
+ setTimeout(() => {
54
+ this.refresh();
55
+ });
56
+ });
57
+ }
58
+ refresh() {
59
+ setTimeout(() => {
60
+ this.sliderRef.nativeElement.scrollTo(this.width, 0);
61
+ }, 50);
62
+ this.alert.show = false;
63
+ this.bar.background = 'var(--indicator-primary-color)';
64
+ this.loading = true;
65
+ this.http.post(this.srcUrl, { captchaType: "blockPuzzle" /* CaptchaType.BlockPuzzle */ }, HTTP_OPTIONS).subscribe(response => {
66
+ if (response.code === 0) {
67
+ this.secrets.secretKey = response.data.secretKey;
68
+ this.secrets.token = response.data.token;
69
+ this.bgImage = new Image();
70
+ this.slideImage = new Image();
71
+ // this.bgImage.src = `data:image/png;base64,${re.data.jigsawImageBase64}`;
72
+ this.bgImage.src = `data:image/png;base64,${response.data.originalImageBase64}`;
73
+ this.slideImage.src = `data:image/png;base64,${response.data.jigsawImageBase64}`;
74
+ zip(fromEvent(this.bgImage, 'load'), fromEvent(this.slideImage, 'load')).pipe(take(1)).subscribe(() => {
75
+ this.beginTime = new Date().getTime();
76
+ this.draw();
77
+ });
78
+ }
79
+ else {
80
+ console.error(response.msg);
81
+ }
82
+ });
83
+ }
84
+ draw(x = 0) {
85
+ this.x = x;
86
+ this.ctx.clearRect(0, 0, this.width, this.height);
87
+ this.ctx.drawImage(this.bgImage, 0, 0, this.width, this.height);
88
+ this.ctx.drawImage(this.slideImage, this.x, 0, this.quotient.width * PUZZLE_WIDTH, this.quotient.height * PUZZLE_HEIGHT);
89
+ this.loading = false;
90
+ }
91
+ slide(x) {
92
+ this.draw(x);
93
+ }
94
+ verify(x) {
95
+ this.verifying = true;
96
+ // 计算出原始移动距离
97
+ x = x / this.quotient.width;
98
+ this.endTime = new Date().getTime();
99
+ const json = JSON.stringify({ x: x, y: 5.0 });
100
+ const pointJson = this.secrets.secretKey ? aesEncrypt(json, this.secrets.secretKey) : json;
101
+ const verifyData = typeof this.verifyData === 'function' ? this.verifyData() : this.verifyData;
102
+ const obj = {
103
+ captchaType: "blockPuzzle" /* CaptchaType.BlockPuzzle */,
104
+ pointJson,
105
+ token: this.secrets.token,
106
+ ...verifyData
107
+ };
108
+ this.http.post(this.verifyUrl, obj, HTTP_OPTIONS).subscribe({
109
+ next: response => {
110
+ if (response.code !== 0) {
111
+ this.alert.type = 'error';
112
+ this.alert.msg = response.msg;
113
+ this.alert.show = true;
114
+ this.bar.background = 'var(--indicator-danger-color)';
115
+ this.verified.emit({
116
+ code: -1,
117
+ msg: response.msg,
118
+ data: null
119
+ });
120
+ setTimeout(() => {
121
+ this.alert.show = false;
122
+ this.refresh();
123
+ }, 1000);
124
+ }
125
+ else {
126
+ this.alert.type = 'success';
127
+ this.bar.background = 'var(--indicator-primary-color)';
128
+ const seconds = Math.abs(this.endTime - this.beginTime) / 1000;
129
+ this.alert.msg = ` ${seconds}秒 验证成功`;
130
+ this.alert.show = true;
131
+ const temp = response.data.token + '---' + json;
132
+ response.data.captcha = this.secrets.secretKey ? aesEncrypt(temp, this.secrets.secretKey) : temp;
133
+ // delete response.data.token;
134
+ // delete response.data.captchaType;
135
+ // delete response.data.pointJson;
136
+ // delete response.data.result;
137
+ this.verified.emit({
138
+ code: 0,
139
+ msg: response.msg,
140
+ data: response.data
141
+ });
142
+ }
143
+ },
144
+ complete: () => this.verifying = false
145
+ });
146
+ }
147
+ markStart(event) {
148
+ if (!this.loading && !this.verifying) {
149
+ event.stopPropagation();
150
+ this.dragStartX = event.clientX;
151
+ this.scrollLeft = this.sliderRef.nativeElement.scrollLeft;
152
+ }
153
+ }
154
+ markEnd(event) {
155
+ event.stopPropagation();
156
+ if (this.dragStartX > -1) {
157
+ this.verify(this.width - this.sliderRef.nativeElement.scrollLeft);
158
+ }
159
+ this.dragStartX = -1;
160
+ }
161
+ moveMarker(event) {
162
+ event.stopPropagation();
163
+ if (this.dragStartX > -1) { // 如果在拖动了
164
+ const currentX = event.clientX; // 得到当前的X
165
+ const offset = currentX - this.dragStartX; // 得到拖动的距离
166
+ let left = this.scrollLeft - (offset < 0 ? 0 : offset);
167
+ if (left <= this.bar.blockWidth) {
168
+ left = this.bar.blockWidth;
169
+ }
170
+ else if (left >= this.width) {
171
+ left = this.width;
172
+ }
173
+ this.sliderRef.nativeElement.scrollLeft = left;
174
+ this.slide(this.width - left);
175
+ }
176
+ }
177
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SunSliderCaptcha, deps: [{ token: i1.HttpClient }], target: i0.ɵɵFactoryTarget.Component }); }
178
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: SunSliderCaptcha, isStandalone: true, selector: "sun-slider-captcha", inputs: { srcUrl: "srcUrl", verifyUrl: "verifyUrl", verifyData: "verifyData", width: ["width", "width", numberAttribute], height: ["height", "height", numberAttribute] }, outputs: { verified: "verified" }, host: { listeners: { "window:pointerup": "markEnd($event)", "window:pointercancel": "markEnd($event)", "window:pointermove": "moveMarker($event)" }, properties: { "class.sun-verify-loading": "this.loading", "class.sun-verify-verifying": "this.verifying" } }, viewQueries: [{ propertyName: "canvasRef", first: true, predicate: ["canvas"], descendants: true, static: true }, { propertyName: "sliderRef", first: true, predicate: ["slider"], descendants: true, static: true }], ngImport: i0, template: "<div class=\"slide-block\" [style.width.px]=\"width\" [style.height.px]=\"height\">\n <canvas #canvas></canvas>\n @if (alert.show) {\n <div\n class=\"slide-alert\"\n [class.slide-alert-success]=\"alert.type === 'success'\"\n [class.slide-alert-danger]=\"alert.type === 'error'\"\n >\n {{ alert.msg }}\n </div>\n }\n</div>\n\n<div\n #slider\n class=\"verify-bar\"\n [style.width.px]=\"width\"\n (scroll)=\"$event.preventDefault()\"\n (touchmove)=\"$event.preventDefault()\"\n (mousewheel)=\"$event.preventDefault()\"\n>\n <div\n style=\"display: inline-block; height: 40px; vertical-align: top\"\n [style]=\"{ background: bar.background }\"\n [draggable]=\"false\"\n [style.width.px]=\"width\"\n ></div>\n <div class=\"verify-bar-area\" [style.width.px]=\"width\" [draggable]=\"false\">\n <span class=\"verify-msg\" [draggable]=\"false\">\u62D6\u52A8\u6ED1\u5757\u4EE5\u5B8C\u6210\u62FC\u56FE\u9A8C\u8BC1</span>\n <div class=\"verify-left-bar\" [style.width.px]=\"bar.blockWidth\">\n <div\n class=\"verify-move-block\"\n [draggable]=\"false\"\n (pointerdown)=\"markStart($event)\"\n >\n <svg viewBox=\"0 0 512 512\">\n <path\n stroke-width=\"32\"\n stroke-linecap=\"round\"\n stroke-miterlimit=\"10\"\n d=\"M80 160h352M80 256h352M80 352h352\"\n ></path>\n </svg>\n </div>\n </div>\n </div>\n</div>\n", styles: [":host{--track-color: white;--indicator-primary-color: var(--color-primary);--indicator-danger-color: var(--color-danger);--alert-success-color: var(--color-success);--alert-danger-color: var(--color-danger);--alert-success-background: #dcfce7;--alert-danger-background: #fee2e2;--handler-color: #94a3b8;--handler-border-color: #e2e8f0;display:inline-block;overflow:hidden}.slide-block{position:relative}.slide-alert{position:absolute;width:100%;bottom:0;opacity:.9;text-align:center;padding:4px 0;font-size:14px}.slide-alert-success{color:var(--alert-success-color);background:var(--alert-success-background)}.slide-alert-danger{color:var(--alert-danger-color);background:var(--alert-danger-background)}:host ::ng-deep .ant-alert{border-radius:0}.verify-bar{font-size:0;height:40px;line-height:40px;overflow:scroll hidden;white-space:nowrap;scrollbar-width:none}.verify-bar::-webkit-scrollbar{display:none}.verify-bar-area{position:relative;display:inline-block;font-size:14px;text-align:center;background:var(--track-color);height:100%}.verify-bar-area .verify-msg{z-index:3;pointer-events:none;-webkit-user-select:none;user-select:none}.verify-bar-area .verify-move-block{display:flex;justify-content:center;align-items:center;width:100%;height:100%;background:var(--track-color);border:1px solid var(--handler-border-color)}.verify-bar-area .verify-move-block>svg{font-size:24px;color:var(--handler-color);width:1em;height:1em;contain:strict;fill:currentcolor;box-sizing:content-box;stroke:currentcolor;transform:rotate(90deg)}.verify-bar-area .verify-left-bar{position:absolute;top:0;left:0;cursor:grab;height:40px}:host.sun-verify-loading .verify-left-bar,:host.sun-verify-verifying .verify-left-bar{cursor:progress}\n"] }); }
179
+ }
180
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SunSliderCaptcha, decorators: [{
181
+ type: Component,
182
+ args: [{ selector: 'sun-slider-captcha', standalone: true, template: "<div class=\"slide-block\" [style.width.px]=\"width\" [style.height.px]=\"height\">\n <canvas #canvas></canvas>\n @if (alert.show) {\n <div\n class=\"slide-alert\"\n [class.slide-alert-success]=\"alert.type === 'success'\"\n [class.slide-alert-danger]=\"alert.type === 'error'\"\n >\n {{ alert.msg }}\n </div>\n }\n</div>\n\n<div\n #slider\n class=\"verify-bar\"\n [style.width.px]=\"width\"\n (scroll)=\"$event.preventDefault()\"\n (touchmove)=\"$event.preventDefault()\"\n (mousewheel)=\"$event.preventDefault()\"\n>\n <div\n style=\"display: inline-block; height: 40px; vertical-align: top\"\n [style]=\"{ background: bar.background }\"\n [draggable]=\"false\"\n [style.width.px]=\"width\"\n ></div>\n <div class=\"verify-bar-area\" [style.width.px]=\"width\" [draggable]=\"false\">\n <span class=\"verify-msg\" [draggable]=\"false\">\u62D6\u52A8\u6ED1\u5757\u4EE5\u5B8C\u6210\u62FC\u56FE\u9A8C\u8BC1</span>\n <div class=\"verify-left-bar\" [style.width.px]=\"bar.blockWidth\">\n <div\n class=\"verify-move-block\"\n [draggable]=\"false\"\n (pointerdown)=\"markStart($event)\"\n >\n <svg viewBox=\"0 0 512 512\">\n <path\n stroke-width=\"32\"\n stroke-linecap=\"round\"\n stroke-miterlimit=\"10\"\n d=\"M80 160h352M80 256h352M80 352h352\"\n ></path>\n </svg>\n </div>\n </div>\n </div>\n</div>\n", styles: [":host{--track-color: white;--indicator-primary-color: var(--color-primary);--indicator-danger-color: var(--color-danger);--alert-success-color: var(--color-success);--alert-danger-color: var(--color-danger);--alert-success-background: #dcfce7;--alert-danger-background: #fee2e2;--handler-color: #94a3b8;--handler-border-color: #e2e8f0;display:inline-block;overflow:hidden}.slide-block{position:relative}.slide-alert{position:absolute;width:100%;bottom:0;opacity:.9;text-align:center;padding:4px 0;font-size:14px}.slide-alert-success{color:var(--alert-success-color);background:var(--alert-success-background)}.slide-alert-danger{color:var(--alert-danger-color);background:var(--alert-danger-background)}:host ::ng-deep .ant-alert{border-radius:0}.verify-bar{font-size:0;height:40px;line-height:40px;overflow:scroll hidden;white-space:nowrap;scrollbar-width:none}.verify-bar::-webkit-scrollbar{display:none}.verify-bar-area{position:relative;display:inline-block;font-size:14px;text-align:center;background:var(--track-color);height:100%}.verify-bar-area .verify-msg{z-index:3;pointer-events:none;-webkit-user-select:none;user-select:none}.verify-bar-area .verify-move-block{display:flex;justify-content:center;align-items:center;width:100%;height:100%;background:var(--track-color);border:1px solid var(--handler-border-color)}.verify-bar-area .verify-move-block>svg{font-size:24px;color:var(--handler-color);width:1em;height:1em;contain:strict;fill:currentcolor;box-sizing:content-box;stroke:currentcolor;transform:rotate(90deg)}.verify-bar-area .verify-left-bar{position:absolute;top:0;left:0;cursor:grab;height:40px}:host.sun-verify-loading .verify-left-bar,:host.sun-verify-verifying .verify-left-bar{cursor:progress}\n"] }]
183
+ }], ctorParameters: () => [{ type: i1.HttpClient }], propDecorators: { loading: [{
184
+ type: HostBinding,
185
+ args: ['class.sun-verify-loading']
186
+ }], verifying: [{
187
+ type: HostBinding,
188
+ args: ['class.sun-verify-verifying']
189
+ }], canvasRef: [{
190
+ type: ViewChild,
191
+ args: ['canvas', { static: true }]
192
+ }], sliderRef: [{
193
+ type: ViewChild,
194
+ args: ['slider', { static: true }]
195
+ }], srcUrl: [{
196
+ type: Input
197
+ }], verifyUrl: [{
198
+ type: Input
199
+ }], verifyData: [{
200
+ type: Input
201
+ }], width: [{
202
+ type: Input,
203
+ args: [{ transform: numberAttribute }]
204
+ }], height: [{
205
+ type: Input,
206
+ args: [{ transform: numberAttribute }]
207
+ }], verified: [{
208
+ type: Output
209
+ }], markEnd: [{
210
+ type: HostListener,
211
+ args: ['window:pointerup', ['$event']]
212
+ }, {
213
+ type: HostListener,
214
+ args: ['window:pointercancel', ['$event']]
215
+ }], moveMarker: [{
216
+ type: HostListener,
217
+ args: ['window:pointermove', ['$event']]
218
+ }] } });
219
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xpZGVyLWNhcHRjaGEuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcGFja2FnZXMvdWktc3VuL3NsaWRlci1jYXB0Y2hhL3NsaWRlci1jYXB0Y2hhLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uL3BhY2thZ2VzL3VpLXN1bi9zbGlkZXItY2FwdGNoYS9zbGlkZXItY2FwdGNoYS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsZUFBZSxFQUFFLFNBQVMsRUFBYyxZQUFZLEVBQUUsV0FBVyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsZUFBZSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFM0osT0FBTyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRTVDLE9BQU8sRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxTQUFTLENBQUM7OztBQUV2RSxlQUFlO0FBQ2YsTUFBTSxNQUFNLEdBQUcsR0FBRyxFQUFFLEtBQUssR0FBRyxHQUFHLENBQUM7QUFDaEMsY0FBYztBQUNkLE1BQU0sYUFBYSxHQUFHLEdBQUcsRUFBRSxZQUFZLEdBQUcsRUFBRSxDQUFDO0FBUTdDLE1BQU0sT0FBTyxnQkFBZ0I7SUE0QzNCOzs7T0FHRztJQUNILElBQUksUUFBUTtRQUNWLE9BQU87WUFDTCxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLO1lBQ3pCLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU07U0FDN0IsQ0FBQztJQUNKLENBQUM7SUFFRCxZQUFvQixJQUFnQjtRQUFoQixTQUFJLEdBQUosSUFBSSxDQUFZO1FBdERLLFlBQU8sR0FBRyxLQUFLLENBQUM7UUFDZCxjQUFTLEdBQUcsS0FBSyxDQUFDO1FBUXRCLFVBQUssR0FBRyxLQUFLLENBQUM7UUFDZCxXQUFNLEdBQUcsTUFBTSxDQUFDO1FBRTdDLGFBQVEsR0FBRyxJQUFJLFlBQVksRUFBbUIsQ0FBQztRQU96RCxlQUFlO1FBQ2YsTUFBQyxHQUFHLENBQUMsQ0FBQztRQUVOLFlBQU8sR0FBeUMsRUFBUyxDQUFDO1FBRTFELFVBQUssR0FBOEQ7WUFDakUsSUFBSSxFQUFFLFNBQVMsRUFBRyxRQUFRO1lBQzFCLEdBQUcsRUFBRSxFQUFFO1lBQ1AsSUFBSSxFQUFFLEtBQUs7U0FDWixDQUFDO1FBS0YsYUFBYTtRQUNiLGVBQVUsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUNoQix5QkFBeUI7UUFDekIsZUFBVSxHQUFHLENBQUMsQ0FBQztRQUVmLFFBQUcsR0FBRztZQUNKLFVBQVUsRUFBRSxFQUFFLEVBQUksT0FBTztZQUN6QixVQUFVLEVBQUUsZ0NBQWdDO1NBQzdDLENBQUM7UUFjQSxlQUFlLENBQUMsR0FBRyxFQUFFO1lBQ25CLE1BQU0sR0FBRyxHQUFHLGdCQUFnQixDQUFDO1lBQzdCLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUM7WUFDM0MsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDaEQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDbEQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN4QyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBRTFDLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFFLENBQUM7WUFDekMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBRXpCLFVBQVUsQ0FBQyxHQUFHLEVBQUU7Z0JBQ2QsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2pCLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUE7SUFDSixDQUFDO0lBRUQsT0FBTztRQUNMLFVBQVUsQ0FBQyxHQUFHLEVBQUU7WUFDZCxJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN2RCxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDUCxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksR0FBRyxLQUFLLENBQUM7UUFDeEIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLEdBQUcsZ0NBQWdDLENBQUM7UUFDdkQsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7UUFDcEIsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQWtCLElBQUksQ0FBQyxNQUFNLEVBQUUsRUFBRSxXQUFXLDZDQUF5QixFQUFFLEVBQUUsWUFBWSxDQUFDLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxFQUFFO1lBQ3hILElBQUksUUFBUSxDQUFDLElBQUksS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDeEIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUM7Z0JBQ2pELElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDO2dCQUN6QyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksS0FBSyxFQUFFLENBQUM7Z0JBQzNCLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxLQUFLLEVBQUUsQ0FBQztnQkFDOUIsMkVBQTJFO2dCQUMzRSxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsR0FBRyx5QkFBeUIsUUFBUSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO2dCQUNoRixJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsR0FBRyx5QkFBeUIsUUFBUSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO2dCQUNqRixHQUFHLENBQ0QsU0FBUyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLEVBQy9CLFNBQVMsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLE1BQU0sQ0FBQyxDQUNuQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFO29CQUM3QixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksSUFBSSxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUM7b0JBQ3RDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDZCxDQUFDLENBQUMsQ0FBQztZQUNMLENBQUM7aUJBQU0sQ0FBQztnQkFDTixPQUFPLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUM5QixDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU8sSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDO1FBQ2hCLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ1gsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNsRCxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDaEUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssR0FBRyxZQUFZLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsYUFBYSxDQUFDLENBQUM7UUFDekgsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7SUFDdkIsQ0FBQztJQUVELEtBQUssQ0FBQyxDQUFTO1FBQ2IsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNmLENBQUM7SUFFRCxNQUFNLENBQUMsQ0FBUztRQUNkLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO1FBQ3RCLFlBQVk7UUFDWixDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO1FBRTVCLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNwQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUM5QyxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDM0YsTUFBTSxVQUFVLEdBQUcsT0FBTyxJQUFJLENBQUMsVUFBVSxLQUFLLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDO1FBQy9GLE1BQU0sR0FBRyxHQUFHO1lBQ1YsV0FBVyw2Q0FBeUI7WUFDcEMsU0FBUztZQUNULEtBQUssRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUs7WUFDekIsR0FBRyxVQUFVO1NBQ2QsQ0FBQztRQUNGLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFrQixJQUFJLENBQUMsU0FBUyxFQUFFLEdBQUcsRUFBRSxZQUFZLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDM0UsSUFBSSxFQUFFLFFBQVEsQ0FBQyxFQUFFO2dCQUNmLElBQUksUUFBUSxDQUFDLElBQUksS0FBSyxDQUFDLEVBQUUsQ0FBQztvQkFDeEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEdBQUcsT0FBTyxDQUFDO29CQUMxQixJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDO29CQUM5QixJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7b0JBQ3ZCLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVSxHQUFHLCtCQUErQixDQUFDO29CQUN0RCxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQzt3QkFDakIsSUFBSSxFQUFFLENBQUMsQ0FBQzt3QkFDUixHQUFHLEVBQUUsUUFBUSxDQUFDLEdBQUc7d0JBQ2pCLElBQUksRUFBRSxJQUFLO3FCQUNaLENBQUMsQ0FBQztvQkFDSCxVQUFVLENBQUMsR0FBRyxFQUFFO3dCQUNkLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQzt3QkFDeEIsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO29CQUNqQixDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBQ1gsQ0FBQztxQkFBTSxDQUFDO29CQUNOLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxHQUFHLFNBQVMsQ0FBQztvQkFDNUIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLEdBQUcsZ0NBQWdDLENBQUM7b0JBQ3ZELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsSUFBSSxDQUFDO29CQUMvRCxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsR0FBRyxJQUFJLE9BQU8sUUFBUSxDQUFDO29CQUNyQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7b0JBQ3ZCLE1BQU0sSUFBSSxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssR0FBRyxJQUFJLENBQUM7b0JBQ2hELFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztvQkFDakcsOEJBQThCO29CQUM5QixvQ0FBb0M7b0JBQ3BDLGtDQUFrQztvQkFDbEMsK0JBQStCO29CQUMvQixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQzt3QkFDakIsSUFBSSxFQUFFLENBQUM7d0JBQ1AsR0FBRyxFQUFFLFFBQVEsQ0FBQyxHQUFHO3dCQUNqQixJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUk7cUJBQ3BCLENBQUMsQ0FBQztnQkFDTCxDQUFDO1lBQ0gsQ0FBQztZQUNELFFBQVEsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUs7U0FDdkMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELFNBQVMsQ0FBQyxLQUFtQjtRQUMzQixJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNyQyxLQUFLLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDeEIsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDO1lBQ2hDLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDO1FBQzVELENBQUM7SUFDSCxDQUFDO0lBSUQsT0FBTyxDQUFDLEtBQW1CO1FBQ3pCLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN4QixJQUFJLElBQUksQ0FBQyxVQUFVLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUN6QixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDcEUsQ0FBQztRQUNELElBQUksQ0FBQyxVQUFVLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDdkIsQ0FBQztJQUdELFVBQVUsQ0FBQyxLQUFtQjtRQUM1QixLQUFLLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDeEIsSUFBSSxJQUFJLENBQUMsVUFBVSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTO1lBQ25DLE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTO1lBQ3pDLE1BQU0sTUFBTSxHQUFHLFFBQVEsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsVUFBVTtZQUVyRCxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsVUFBVSxHQUFHLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUV2RCxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsRUFBRSxDQUFDO2dCQUNoQyxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUM7WUFDN0IsQ0FBQztpQkFBTSxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQzlCLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO1lBQ3BCLENBQUM7WUFDRCxJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO1lBQy9DLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsQ0FBQztRQUNoQyxDQUFDO0lBQ0gsQ0FBQzsrR0EzTVUsZ0JBQWdCO21HQUFoQixnQkFBZ0IsOEpBVVAsZUFBZSxnQ0FDZixlQUFlLDBoQkM3QnJDLHE3Q0ErQ0E7OzRGRDdCYSxnQkFBZ0I7a0JBTjVCLFNBQVM7K0JBQ0Usb0JBQW9CLGNBQ2xCLElBQUk7K0VBS3lCLE9BQU87c0JBQS9DLFdBQVc7dUJBQUMsMEJBQTBCO2dCQUNJLFNBQVM7c0JBQW5ELFdBQVc7dUJBQUMsNEJBQTRCO2dCQUVGLFNBQVM7c0JBQS9DLFNBQVM7dUJBQUMsUUFBUSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFDRSxTQUFTO3NCQUEvQyxTQUFTO3VCQUFDLFFBQVEsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBRTVCLE1BQU07c0JBQWQsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ2lDLEtBQUs7c0JBQTNDLEtBQUs7dUJBQUMsRUFBRSxTQUFTLEVBQUUsZUFBZSxFQUFFO2dCQUNFLE1BQU07c0JBQTVDLEtBQUs7dUJBQUMsRUFBRSxTQUFTLEVBQUUsZUFBZSxFQUFFO2dCQUUzQixRQUFRO3NCQUFqQixNQUFNO2dCQXFLUCxPQUFPO3NCQUZOLFlBQVk7dUJBQUMsa0JBQWtCLEVBQUUsQ0FBQyxRQUFRLENBQUM7O3NCQUMzQyxZQUFZO3VCQUFDLHNCQUFzQixFQUFFLENBQUMsUUFBUSxDQUFDO2dCQVVoRCxVQUFVO3NCQURULFlBQVk7dUJBQUMsb0JBQW9CLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgYWZ0ZXJOZXh0UmVuZGVyLCBDb21wb25lbnQsIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgSG9zdEJpbmRpbmcsIEhvc3RMaXN0ZW5lciwgSW5wdXQsIG51bWJlckF0dHJpYnV0ZSwgT3V0cHV0LCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFJlc3VsdCB9IGZyb20gJ0Bzb2xhci1raXQvcGxhbmV0cy9zdW4nO1xuaW1wb3J0IHsgZnJvbUV2ZW50LCB0YWtlLCB6aXAgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IENhcHRjaGEsIENhcHRjaGFUeXBlIH0gZnJvbSAnLi9tb2RlbCc7XG5pbXBvcnQgeyBhZXNFbmNyeXB0LCBIVFRQX09QVElPTlMsIHdpdGhEcHIsIHdpdGhQaXhlbCB9IGZyb20gJy4vdXRpbHMnO1xuXG4vKiog6aqM6K+B56CB55qE5Y6f5aeL5bC65a+4ICovXG5jb25zdCBIRUlHSFQgPSAxNTUsIFdJRFRIID0gMzEwO1xuLyoqIOaLvOWbvueahOWOn+Wni+WwuuWvuCAqL1xuY29uc3QgUFVaWkxFX0hFSUdIVCA9IDE1NSwgUFVaWkxFX1dJRFRIID0gNTA7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3N1bi1zbGlkZXItY2FwdGNoYScsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIHRlbXBsYXRlVXJsOiAnLi9zbGlkZXItY2FwdGNoYS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsOiAnLi9zbGlkZXItY2FwdGNoYS5jb21wb25lbnQuc2NzcycsXG59KVxuZXhwb3J0IGNsYXNzIFN1blNsaWRlckNhcHRjaGEge1xuICBASG9zdEJpbmRpbmcoJ2NsYXNzLnN1bi12ZXJpZnktbG9hZGluZycpIGxvYWRpbmcgPSBmYWxzZTtcbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5zdW4tdmVyaWZ5LXZlcmlmeWluZycpIHZlcmlmeWluZyA9IGZhbHNlO1xuXG4gIEBWaWV3Q2hpbGQoJ2NhbnZhcycsIHsgc3RhdGljOiB0cnVlIH0pIGNhbnZhc1JlZiE6IEVsZW1lbnRSZWY8SFRNTENhbnZhc0VsZW1lbnQ+O1xuICBAVmlld0NoaWxkKCdzbGlkZXInLCB7IHN0YXRpYzogdHJ1ZSB9KSBzbGlkZXJSZWYhOiBFbGVtZW50UmVmPEhUTUxEaXZFbGVtZW50PjtcblxuICBASW5wdXQoKSBzcmNVcmwhOiBzdHJpbmc7XG4gIEBJbnB1dCgpIHZlcmlmeVVybCE6IHN0cmluZztcbiAgQElucHV0KCkgdmVyaWZ5RGF0YT86IFJlY29yZDxzdHJpbmcsIGFueT4gfCAoKCkgPT4gUmVjb3JkPHN0cmluZywgYW55Pik7XG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogbnVtYmVyQXR0cmlidXRlIH0pIHdpZHRoID0gV0lEVEg7XG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogbnVtYmVyQXR0cmlidXRlIH0pIGhlaWdodCA9IEhFSUdIVDtcblxuICBAT3V0cHV0KCkgdmVyaWZpZWQgPSBuZXcgRXZlbnRFbWl0dGVyPFJlc3VsdDxDYXB0Y2hhPj4oKTtcblxuICBwcml2YXRlIGNhbnZhcyE6IEhUTUxDYW52YXNFbGVtZW50O1xuICBwcml2YXRlIGN0eCE6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRDtcbiAgcHJpdmF0ZSBiZ0ltYWdlITogSFRNTEltYWdlRWxlbWVudDtcbiAgcHJpdmF0ZSBzbGlkZUltYWdlITogSFRNTEltYWdlRWxlbWVudDtcblxuICAvKiog5ruR5Z2X5ou85Zu+55qEeOWdkOaghyAqL1xuICB4ID0gMDtcblxuICBzZWNyZXRzOiB7IHNlY3JldEtleTogc3RyaW5nLCB0b2tlbjogc3RyaW5nIH0gPSB7fSBhcyBhbnk7XG5cbiAgYWxlcnQ6IHsgdHlwZTogJ3N1Y2Nlc3MnIHwgJ2Vycm9yJywgbXNnOiBzdHJpbmcsIHNob3c6IGJvb2xlYW4gfSA9IHtcbiAgICB0eXBlOiAnc3VjY2VzcycsICAvLyBlcnJvclxuICAgIG1zZzogJycsXG4gICAgc2hvdzogZmFsc2VcbiAgfTtcblxuICBiZWdpblRpbWUhOiBudW1iZXI7XG4gIGVuZFRpbWUhOiBudW1iZXI7XG5cbiAgLyoqIOa7keWKqOW8gOWni+eahFggKi9cbiAgZHJhZ1N0YXJ0WCA9IC0xO1xuICAvKiog5ruR5YqoYmFy5Yid5aeL55qEc2Nyb2xsTGVmdCAqL1xuICBzY3JvbGxMZWZ0ID0gMDtcblxuICBiYXIgPSB7XG4gICAgYmxvY2tXaWR0aDogNDIsICAgLy8g5ruR5Z2X5a695bqmXG4gICAgYmFja2dyb3VuZDogJ3ZhcigtLWluZGljYXRvci1wcmltYXJ5LWNvbG9yKSdcbiAgfTtcblxuICAvKipcbiAgICog5b2T5YmN5bC65a+4IOmZpOS6jiDljp/lp4vlsLrlr7jlvpfliLDnmoTllYZcbiAgICog55So5LqO562J5q+U5L6L57yp5pS+XG4gICAqL1xuICBnZXQgcXVvdGllbnQoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHdpZHRoOiB0aGlzLndpZHRoIC8gV0lEVEgsXG4gICAgICBoZWlnaHQ6IHRoaXMuaGVpZ2h0IC8gSEVJR0hUXG4gICAgfTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgaHR0cDogSHR0cENsaWVudCkge1xuICAgIGFmdGVyTmV4dFJlbmRlcigoKSA9PiB7XG4gICAgICBjb25zdCBkcHIgPSBkZXZpY2VQaXhlbFJhdGlvO1xuICAgICAgdGhpcy5jYW52YXMgPSB0aGlzLmNhbnZhc1JlZi5uYXRpdmVFbGVtZW50O1xuICAgICAgdGhpcy5jYW52YXMuc3R5bGUud2lkdGggPSB3aXRoUGl4ZWwodGhpcy53aWR0aCk7XG4gICAgICB0aGlzLmNhbnZhcy5zdHlsZS5oZWlnaHQgPSB3aXRoUGl4ZWwodGhpcy5oZWlnaHQpO1xuICAgICAgdGhpcy5jYW52YXMud2lkdGggPSB3aXRoRHByKHRoaXMud2lkdGgpO1xuICAgICAgdGhpcy5jYW52YXMuaGVpZ2h0ID0gd2l0aERwcih0aGlzLmhlaWdodCk7XG5cbiAgICAgIHRoaXMuY3R4ID0gdGhpcy5jYW52YXMuZ2V0Q29udGV4dCgnMmQnKSE7XG4gICAgICB0aGlzLmN0eC5zY2FsZShkcHIsIGRwcik7XG5cbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLnJlZnJlc2goKTtcbiAgICAgIH0pO1xuICAgIH0pXG4gIH1cblxuICByZWZyZXNoKCkge1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5zbGlkZXJSZWYubmF0aXZlRWxlbWVudC5zY3JvbGxUbyh0aGlzLndpZHRoLCAwKTtcbiAgICB9LCA1MCk7XG4gICAgdGhpcy5hbGVydC5zaG93ID0gZmFsc2U7XG4gICAgdGhpcy5iYXIuYmFja2dyb3VuZCA9ICd2YXIoLS1pbmRpY2F0b3ItcHJpbWFyeS1jb2xvciknO1xuICAgIHRoaXMubG9hZGluZyA9IHRydWU7XG4gICAgdGhpcy5odHRwLnBvc3Q8UmVzdWx0PENhcHRjaGE+Pih0aGlzLnNyY1VybCwgeyBjYXB0Y2hhVHlwZTogQ2FwdGNoYVR5cGUuQmxvY2tQdXp6bGUgfSwgSFRUUF9PUFRJT05TKS5zdWJzY3JpYmUocmVzcG9uc2UgPT4ge1xuICAgICAgaWYgKHJlc3BvbnNlLmNvZGUgPT09IDApIHtcbiAgICAgICAgdGhpcy5zZWNyZXRzLnNlY3JldEtleSA9IHJlc3BvbnNlLmRhdGEuc2VjcmV0S2V5O1xuICAgICAgICB0aGlzLnNlY3JldHMudG9rZW4gPSByZXNwb25zZS5kYXRhLnRva2VuO1xuICAgICAgICB0aGlzLmJnSW1hZ2UgPSBuZXcgSW1hZ2UoKTtcbiAgICAgICAgdGhpcy5zbGlkZUltYWdlID0gbmV3IEltYWdlKCk7XG4gICAgICAgIC8vIHRoaXMuYmdJbWFnZS5zcmMgPSBgZGF0YTppbWFnZS9wbmc7YmFzZTY0LCR7cmUuZGF0YS5qaWdzYXdJbWFnZUJhc2U2NH1gO1xuICAgICAgICB0aGlzLmJnSW1hZ2Uuc3JjID0gYGRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCwke3Jlc3BvbnNlLmRhdGEub3JpZ2luYWxJbWFnZUJhc2U2NH1gO1xuICAgICAgICB0aGlzLnNsaWRlSW1hZ2Uuc3JjID0gYGRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCwke3Jlc3BvbnNlLmRhdGEuamlnc2F3SW1hZ2VCYXNlNjR9YDtcbiAgICAgICAgemlwKFxuICAgICAgICAgIGZyb21FdmVudCh0aGlzLmJnSW1hZ2UsICdsb2FkJyksXG4gICAgICAgICAgZnJvbUV2ZW50KHRoaXMuc2xpZGVJbWFnZSwgJ2xvYWQnKSxcbiAgICAgICAgKS5waXBlKHRha2UoMSkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5iZWdpblRpbWUgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcbiAgICAgICAgICB0aGlzLmRyYXcoKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmVycm9yKHJlc3BvbnNlLm1zZyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGRyYXcoeCA9IDApIHtcbiAgICB0aGlzLnggPSB4O1xuICAgIHRoaXMuY3R4LmNsZWFyUmVjdCgwLCAwLCB0aGlzLndpZHRoLCB0aGlzLmhlaWdodCk7XG4gICAgdGhpcy5jdHguZHJhd0ltYWdlKHRoaXMuYmdJbWFnZSwgMCwgMCwgdGhpcy53aWR0aCwgdGhpcy5oZWlnaHQpO1xuICAgIHRoaXMuY3R4LmRyYXdJbWFnZSh0aGlzLnNsaWRlSW1hZ2UsIHRoaXMueCwgMCwgdGhpcy5xdW90aWVudC53aWR0aCAqIFBVWlpMRV9XSURUSCwgdGhpcy5xdW90aWVudC5oZWlnaHQgKiBQVVpaTEVfSEVJR0hUKTtcbiAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgfVxuXG4gIHNsaWRlKHg6IG51bWJlcikge1xuICAgIHRoaXMuZHJhdyh4KTtcbiAgfVxuXG4gIHZlcmlmeSh4OiBudW1iZXIpIHtcbiAgICB0aGlzLnZlcmlmeWluZyA9IHRydWU7XG4gICAgLy8g6K6h566X5Ye65Y6f5aeL56e75Yqo6Led56a7XG4gICAgeCA9IHggLyB0aGlzLnF1b3RpZW50LndpZHRoO1xuXG4gICAgdGhpcy5lbmRUaW1lID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XG4gICAgY29uc3QganNvbiA9IEpTT04uc3RyaW5naWZ5KHsgeDogeCwgeTogNS4wIH0pO1xuICAgIGNvbnN0IHBvaW50SnNvbiA9IHRoaXMuc2VjcmV0cy5zZWNyZXRLZXkgPyBhZXNFbmNyeXB0KGpzb24sIHRoaXMuc2VjcmV0cy5zZWNyZXRLZXkpIDoganNvbjtcbiAgICBjb25zdCB2ZXJpZnlEYXRhID0gdHlwZW9mIHRoaXMudmVyaWZ5RGF0YSA9PT0gJ2Z1bmN0aW9uJyA/IHRoaXMudmVyaWZ5RGF0YSgpIDogdGhpcy52ZXJpZnlEYXRhO1xuICAgIGNvbnN0IG9iaiA9IHtcbiAgICAgIGNhcHRjaGFUeXBlOiBDYXB0Y2hhVHlwZS5CbG9ja1B1enpsZSxcbiAgICAgIHBvaW50SnNvbixcbiAgICAgIHRva2VuOiB0aGlzLnNlY3JldHMudG9rZW4sXG4gICAgICAuLi52ZXJpZnlEYXRhXG4gICAgfTtcbiAgICB0aGlzLmh0dHAucG9zdDxSZXN1bHQ8Q2FwdGNoYT4+KHRoaXMudmVyaWZ5VXJsLCBvYmosIEhUVFBfT1BUSU9OUykuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IHJlc3BvbnNlID0+IHtcbiAgICAgICAgaWYgKHJlc3BvbnNlLmNvZGUgIT09IDApIHtcbiAgICAgICAgICB0aGlzLmFsZXJ0LnR5cGUgPSAnZXJyb3InO1xuICAgICAgICAgIHRoaXMuYWxlcnQubXNnID0gcmVzcG9uc2UubXNnO1xuICAgICAgICAgIHRoaXMuYWxlcnQuc2hvdyA9IHRydWU7XG4gICAgICAgICAgdGhpcy5iYXIuYmFja2dyb3VuZCA9ICd2YXIoLS1pbmRpY2F0b3ItZGFuZ2VyLWNvbG9yKSc7XG4gICAgICAgICAgdGhpcy52ZXJpZmllZC5lbWl0KHtcbiAgICAgICAgICAgIGNvZGU6IC0xLFxuICAgICAgICAgICAgbXNnOiByZXNwb25zZS5tc2csXG4gICAgICAgICAgICBkYXRhOiBudWxsIVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5hbGVydC5zaG93ID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLnJlZnJlc2goKTtcbiAgICAgICAgICB9LCAxMDAwKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmFsZXJ0LnR5cGUgPSAnc3VjY2Vzcyc7XG4gICAgICAgICAgdGhpcy5iYXIuYmFja2dyb3VuZCA9ICd2YXIoLS1pbmRpY2F0b3ItcHJpbWFyeS1jb2xvciknO1xuICAgICAgICAgIGNvbnN0IHNlY29uZHMgPSBNYXRoLmFicyh0aGlzLmVuZFRpbWUgLSB0aGlzLmJlZ2luVGltZSkgLyAxMDAwO1xuICAgICAgICAgIHRoaXMuYWxlcnQubXNnID0gYCAke3NlY29uZHN956eSIOmqjOivgeaIkOWKn2A7XG4gICAgICAgICAgdGhpcy5hbGVydC5zaG93ID0gdHJ1ZTtcbiAgICAgICAgICBjb25zdCB0ZW1wID0gcmVzcG9uc2UuZGF0YS50b2tlbiArICctLS0nICsganNvbjtcbiAgICAgICAgICByZXNwb25zZS5kYXRhLmNhcHRjaGEgPSB0aGlzLnNlY3JldHMuc2VjcmV0S2V5ID8gYWVzRW5jcnlwdCh0ZW1wLCB0aGlzLnNlY3JldHMuc2VjcmV0S2V5KSA6IHRlbXA7XG4gICAgICAgICAgLy8gZGVsZXRlIHJlc3BvbnNlLmRhdGEudG9rZW47XG4gICAgICAgICAgLy8gZGVsZXRlIHJlc3BvbnNlLmRhdGEuY2FwdGNoYVR5cGU7XG4gICAgICAgICAgLy8gZGVsZXRlIHJlc3BvbnNlLmRhdGEucG9pbnRKc29uO1xuICAgICAgICAgIC8vIGRlbGV0ZSByZXNwb25zZS5kYXRhLnJlc3VsdDtcbiAgICAgICAgICB0aGlzLnZlcmlmaWVkLmVtaXQoe1xuICAgICAgICAgICAgY29kZTogMCxcbiAgICAgICAgICAgIG1zZzogcmVzcG9uc2UubXNnLFxuICAgICAgICAgICAgZGF0YTogcmVzcG9uc2UuZGF0YVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgY29tcGxldGU6ICgpID0+IHRoaXMudmVyaWZ5aW5nID0gZmFsc2VcbiAgICB9KTtcbiAgfVxuXG4gIG1hcmtTdGFydChldmVudDogUG9pbnRlckV2ZW50KSB7XG4gICAgaWYgKCF0aGlzLmxvYWRpbmcgJiYgIXRoaXMudmVyaWZ5aW5nKSB7XG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIHRoaXMuZHJhZ1N0YXJ0WCA9IGV2ZW50LmNsaWVudFg7XG4gICAgICB0aGlzLnNjcm9sbExlZnQgPSB0aGlzLnNsaWRlclJlZi5uYXRpdmVFbGVtZW50LnNjcm9sbExlZnQ7XG4gICAgfVxuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OnBvaW50ZXJ1cCcsIFsnJGV2ZW50J10pXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzpwb2ludGVyY2FuY2VsJywgWyckZXZlbnQnXSlcbiAgbWFya0VuZChldmVudDogUG9pbnRlckV2ZW50KSB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgaWYgKHRoaXMuZHJhZ1N0YXJ0WCA+IC0xKSB7XG4gICAgICB0aGlzLnZlcmlmeSh0aGlzLndpZHRoIC0gdGhpcy5zbGlkZXJSZWYubmF0aXZlRWxlbWVudC5zY3JvbGxMZWZ0KTtcbiAgICB9XG4gICAgdGhpcy5kcmFnU3RhcnRYID0gLTE7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6cG9pbnRlcm1vdmUnLCBbJyRldmVudCddKVxuICBtb3ZlTWFya2VyKGV2ZW50OiBQb2ludGVyRXZlbnQpIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBpZiAodGhpcy5kcmFnU3RhcnRYID4gLTEpIHsgLy8g5aaC5p6c5Zyo5ouW5Yqo5LqGXG4gICAgICBjb25zdCBjdXJyZW50WCA9IGV2ZW50LmNsaWVudFg7IC8vIOW+l+WIsOW9k+WJjeeahFhcbiAgICAgIGNvbnN0IG9mZnNldCA9IGN1cnJlbnRYIC0gdGhpcy5kcmFnU3RhcnRYOyAvLyDlvpfliLDmi5bliqjnmoTot53nprtcblxuICAgICAgbGV0IGxlZnQgPSB0aGlzLnNjcm9sbExlZnQgLSAob2Zmc2V0IDwgMCA/IDAgOiBvZmZzZXQpO1xuXG4gICAgICBpZiAobGVmdCA8PSB0aGlzLmJhci5ibG9ja1dpZHRoKSB7XG4gICAgICAgIGxlZnQgPSB0aGlzLmJhci5ibG9ja1dpZHRoO1xuICAgICAgfSBlbHNlIGlmIChsZWZ0ID49IHRoaXMud2lkdGgpIHtcbiAgICAgICAgbGVmdCA9IHRoaXMud2lkdGg7XG4gICAgICB9XG4gICAgICB0aGlzLnNsaWRlclJlZi5uYXRpdmVFbGVtZW50LnNjcm9sbExlZnQgPSBsZWZ0O1xuICAgICAgdGhpcy5zbGlkZSh0aGlzLndpZHRoIC0gbGVmdCk7XG4gICAgfVxuICB9XG5cbn1cbiIsIjxkaXYgY2xhc3M9XCJzbGlkZS1ibG9ja1wiIFtzdHlsZS53aWR0aC5weF09XCJ3aWR0aFwiIFtzdHlsZS5oZWlnaHQucHhdPVwiaGVpZ2h0XCI+XG4gIDxjYW52YXMgI2NhbnZhcz48L2NhbnZhcz5cbiAgQGlmIChhbGVydC5zaG93KSB7XG4gIDxkaXZcbiAgICBjbGFzcz1cInNsaWRlLWFsZXJ0XCJcbiAgICBbY2xhc3Muc2xpZGUtYWxlcnQtc3VjY2Vzc109XCJhbGVydC50eXBlID09PSAnc3VjY2VzcydcIlxuICAgIFtjbGFzcy5zbGlkZS1hbGVydC1kYW5nZXJdPVwiYWxlcnQudHlwZSA9PT0gJ2Vycm9yJ1wiXG4gID5cbiAgICB7eyBhbGVydC5tc2cgfX1cbiAgPC9kaXY+XG4gIH1cbjwvZGl2PlxuXG48ZGl2XG4gICNzbGlkZXJcbiAgY2xhc3M9XCJ2ZXJpZnktYmFyXCJcbiAgW3N0eWxlLndpZHRoLnB4XT1cIndpZHRoXCJcbiAgKHNjcm9sbCk9XCIkZXZlbnQucHJldmVudERlZmF1bHQoKVwiXG4gICh0b3VjaG1vdmUpPVwiJGV2ZW50LnByZXZlbnREZWZhdWx0KClcIlxuICAobW91c2V3aGVlbCk9XCIkZXZlbnQucHJldmVudERlZmF1bHQoKVwiXG4+XG4gIDxkaXZcbiAgICBzdHlsZT1cImRpc3BsYXk6IGlubGluZS1ibG9jazsgaGVpZ2h0OiA0MHB4OyB2ZXJ0aWNhbC1hbGlnbjogdG9wXCJcbiAgICBbc3R5bGVdPVwieyBiYWNrZ3JvdW5kOiBiYXIuYmFja2dyb3VuZCB9XCJcbiAgICBbZHJhZ2dhYmxlXT1cImZhbHNlXCJcbiAgICBbc3R5bGUud2lkdGgucHhdPVwid2lkdGhcIlxuICA+PC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJ2ZXJpZnktYmFyLWFyZWFcIiBbc3R5bGUud2lkdGgucHhdPVwid2lkdGhcIiBbZHJhZ2dhYmxlXT1cImZhbHNlXCI+XG4gICAgPHNwYW4gY2xhc3M9XCJ2ZXJpZnktbXNnXCIgW2RyYWdnYWJsZV09XCJmYWxzZVwiPuaLluWKqOa7keWdl+S7peWujOaIkOaLvOWbvumqjOivgTwvc3Bhbj5cbiAgICA8ZGl2IGNsYXNzPVwidmVyaWZ5LWxlZnQtYmFyXCIgW3N0eWxlLndpZHRoLnB4XT1cImJhci5ibG9ja1dpZHRoXCI+XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwidmVyaWZ5LW1vdmUtYmxvY2tcIlxuICAgICAgICBbZHJhZ2dhYmxlXT1cImZhbHNlXCJcbiAgICAgICAgKHBvaW50ZXJkb3duKT1cIm1hcmtTdGFydCgkZXZlbnQpXCJcbiAgICAgID5cbiAgICAgICAgPHN2ZyB2aWV3Qm94PVwiMCAwIDUxMiA1MTJcIj5cbiAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMzJcIlxuICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXG4gICAgICAgICAgICBzdHJva2UtbWl0ZXJsaW1pdD1cIjEwXCJcbiAgICAgICAgICAgIGQ9XCJNODAgMTYwaDM1Mk04MCAyNTZoMzUyTTgwIDM1MmgzNTJcIlxuICAgICAgICAgID48L3BhdGg+XG4gICAgICAgIDwvc3ZnPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ export * from './index';
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29sYXItYW5ndWxhci11aS1zdW4tc2xpZGVyLWNhcHRjaGEuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wYWNrYWdlcy91aS1zdW4vc2xpZGVyLWNhcHRjaGEvc29sYXItYW5ndWxhci11aS1zdW4tc2xpZGVyLWNhcHRjaGEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLFNBQVMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2VuZXJhdGVkIGJ1bmRsZSBpbmRleC4gRG8gbm90IGVkaXQuXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9pbmRleCc7XG4iXX0=
@@ -0,0 +1,23 @@
1
+ import { HttpContext } from '@angular/common/http';
2
+ import { API_TOKEN, AUTH_TOKEN } from '@solar-angular/http';
3
+ import { encrypt } from 'crypto-js/aes';
4
+ import { parse } from 'crypto-js/enc-utf8';
5
+ import { default as mode } from 'crypto-js/mode-ecb';
6
+ import { default as padding } from 'crypto-js/pad-pkcs7';
7
+ export const HTTP_OPTIONS = {
8
+ withCredentials: true,
9
+ context: new HttpContext().set(API_TOKEN, false).set(AUTH_TOKEN, false)
10
+ };
11
+ export const aesEncrypt = (word, secret) => {
12
+ const key = parse(secret);
13
+ const src = parse(word);
14
+ const encrypted = encrypt(src, key, { mode, padding });
15
+ return encrypted.toString();
16
+ };
17
+ export function withDpr(value) {
18
+ return value * devicePixelRatio;
19
+ }
20
+ export function withPixel(value) {
21
+ return value + 'px';
22
+ }
23
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wYWNrYWdlcy91aS1zdW4vc2xpZGVyLWNhcHRjaGEvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDNUQsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN4QyxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDM0MsT0FBTyxFQUFFLE9BQU8sSUFBSSxJQUFJLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNyRCxPQUFPLEVBQUUsT0FBTyxJQUFJLE9BQU8sRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRXpELE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBRztJQUMxQixlQUFlLEVBQUUsSUFBSTtJQUNyQixPQUFPLEVBQUUsSUFBSSxXQUFXLEVBQUUsQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxVQUFVLEVBQUUsS0FBSyxDQUFDO0NBQ3hFLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxVQUFVLEdBQUcsQ0FBQyxJQUFZLEVBQUUsTUFBYyxFQUFFLEVBQUU7SUFDekQsTUFBTSxHQUFHLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzFCLE1BQU0sR0FBRyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN4QixNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO0lBQ3ZELE9BQU8sU0FBUyxDQUFDLFFBQVEsRUFBRSxDQUFDO0FBQzlCLENBQUMsQ0FBQztBQUVGLE1BQU0sVUFBVSxPQUFPLENBQUMsS0FBYTtJQUNuQyxPQUFPLEtBQUssR0FBRyxnQkFBZ0IsQ0FBQztBQUNsQyxDQUFDO0FBRUQsTUFBTSxVQUFVLFNBQVMsQ0FBQyxLQUFhO0lBQ3JDLE9BQU8sS0FBSyxHQUFHLElBQUksQ0FBQztBQUN0QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSHR0cENvbnRleHQgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBBUElfVE9LRU4sIEFVVEhfVE9LRU4gfSBmcm9tICdAc29sYXItYW5ndWxhci9odHRwJztcbmltcG9ydCB7IGVuY3J5cHQgfSBmcm9tICdjcnlwdG8tanMvYWVzJztcbmltcG9ydCB7IHBhcnNlIH0gZnJvbSAnY3J5cHRvLWpzL2VuYy11dGY4JztcbmltcG9ydCB7IGRlZmF1bHQgYXMgbW9kZSB9IGZyb20gJ2NyeXB0by1qcy9tb2RlLWVjYic7XG5pbXBvcnQgeyBkZWZhdWx0IGFzIHBhZGRpbmcgfSBmcm9tICdjcnlwdG8tanMvcGFkLXBrY3M3JztcblxuZXhwb3J0IGNvbnN0IEhUVFBfT1BUSU9OUyA9IHtcbiAgd2l0aENyZWRlbnRpYWxzOiB0cnVlLFxuICBjb250ZXh0OiBuZXcgSHR0cENvbnRleHQoKS5zZXQoQVBJX1RPS0VOLCBmYWxzZSkuc2V0KEFVVEhfVE9LRU4sIGZhbHNlKVxufTtcblxuZXhwb3J0IGNvbnN0IGFlc0VuY3J5cHQgPSAod29yZDogc3RyaW5nLCBzZWNyZXQ6IHN0cmluZykgPT4ge1xuICBjb25zdCBrZXkgPSBwYXJzZShzZWNyZXQpO1xuICBjb25zdCBzcmMgPSBwYXJzZSh3b3JkKTtcbiAgY29uc3QgZW5jcnlwdGVkID0gZW5jcnlwdChzcmMsIGtleSwgeyBtb2RlLCBwYWRkaW5nIH0pO1xuICByZXR1cm4gZW5jcnlwdGVkLnRvU3RyaW5nKCk7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gd2l0aERwcih2YWx1ZTogbnVtYmVyKSB7XG4gIHJldHVybiB2YWx1ZSAqIGRldmljZVBpeGVsUmF0aW87XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB3aXRoUGl4ZWwodmFsdWU6IG51bWJlcikge1xuICByZXR1cm4gdmFsdWUgKyAncHgnO1xufVxuIl19
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ export * from './index';
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29sYXItYW5ndWxhci11aS1zdW4uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9wYWNrYWdlcy91aS1zdW4vc29sYXItYW5ndWxhci11aS1zdW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLFNBQVMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2VuZXJhdGVkIGJ1bmRsZSBpbmRleC4gRG8gbm90IGVkaXQuXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9pbmRleCc7XG4iXX0=
@@ -0,0 +1,25 @@
1
+ import { AsyncPipe } from '@angular/common';
2
+ import * as i0 from '@angular/core';
3
+ import { inject, Component, ChangeDetectionStrategy } from '@angular/core';
4
+ import { Router, NavigationStart, NavigationEnd, NavigationError } from '@angular/router';
5
+ import { fadeAnimation } from '@solar-angular/animations';
6
+ import { filter, map, startWith, distinctUntilChanged, shareReplay } from 'rxjs';
7
+
8
+ class SunNavProgressBar {
9
+ constructor() {
10
+ this.navigating$ = inject(Router).events.pipe(filter(event => event instanceof NavigationStart || event instanceof NavigationEnd || event instanceof NavigationError), map(event => event instanceof NavigationStart), startWith(true), distinctUntilChanged(), shareReplay(1));
11
+ }
12
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SunNavProgressBar, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
13
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: SunNavProgressBar, isStandalone: true, selector: "sun-nav-progress-bar", ngImport: i0, template: `@if (navigating$ | async) {<div @fadeAnimation></div>}`, isInline: true, styles: [":host{--track-color: transparent;--progress-color: var(--color-primary)}:host>div{position:fixed;top:0;left:0;width:100%;height:2.5px;background:var(--track-color);z-index:999}:host>div:after{content:\"\";display:block;height:100%;width:40%;transform-origin:left;background:var(--progress-color);animation:nav-progress 1.5s infinite linear}@keyframes nav-progress{0%{transform:translate(250%) scaleX(.2)}80%{transform:translate(0) scaleX(1)}to{transform:translate(0) scaleX(0)}}\n"], dependencies: [{ kind: "pipe", type: AsyncPipe, name: "async" }], animations: [fadeAnimation], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
14
+ }
15
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SunNavProgressBar, decorators: [{
16
+ type: Component,
17
+ args: [{ selector: 'sun-nav-progress-bar', template: `@if (navigating$ | async) {<div @fadeAnimation></div>}`, standalone: true, imports: [AsyncPipe], changeDetection: ChangeDetectionStrategy.OnPush, animations: [fadeAnimation], styles: [":host{--track-color: transparent;--progress-color: var(--color-primary)}:host>div{position:fixed;top:0;left:0;width:100%;height:2.5px;background:var(--track-color);z-index:999}:host>div:after{content:\"\";display:block;height:100%;width:40%;transform-origin:left;background:var(--progress-color);animation:nav-progress 1.5s infinite linear}@keyframes nav-progress{0%{transform:translate(250%) scaleX(.2)}80%{transform:translate(0) scaleX(1)}to{transform:translate(0) scaleX(0)}}\n"] }]
18
+ }] });
19
+
20
+ /**
21
+ * Generated bundle index. Do not edit.
22
+ */
23
+
24
+ export { SunNavProgressBar };
25
+ //# sourceMappingURL=solar-angular-ui-sun-nav-progress-bar.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"solar-angular-ui-sun-nav-progress-bar.mjs","sources":["../../../packages/ui-sun/nav-progress-bar/nav-progress-bar.component.ts","../../../packages/ui-sun/nav-progress-bar/solar-angular-ui-sun-nav-progress-bar.ts"],"sourcesContent":["import { AsyncPipe } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, inject } from '@angular/core';\nimport { NavigationEnd, NavigationError, NavigationStart, Router } from '@angular/router';\nimport { fadeAnimation } from '@solar-angular/animations';\nimport { distinctUntilChanged, filter, map, shareReplay, startWith } from 'rxjs';\n\n@Component({\n selector: 'sun-nav-progress-bar',\n template: `@if (navigating$ | async) {<div @fadeAnimation></div>}`,\n standalone: true,\n imports: [AsyncPipe],\n styleUrl: './nav-progress-bar.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n animations: [fadeAnimation]\n})\nexport class SunNavProgressBar {\n navigating$ = inject(Router).events.pipe(\n filter(event =>\n event instanceof NavigationStart || event instanceof NavigationEnd || event instanceof NavigationError\n ),\n map(event => event instanceof NavigationStart),\n startWith(true),\n distinctUntilChanged(),\n shareReplay(1)\n );\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;;MAea,iBAAiB,CAAA;AAT9B,IAAA,WAAA,GAAA;QAUE,IAAW,CAAA,WAAA,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,IAAI,CACtC,MAAM,CAAC,KAAK,IACV,KAAK,YAAY,eAAe,IAAI,KAAK,YAAY,aAAa,IAAI,KAAK,YAAY,eAAe,CACvG,EACD,GAAG,CAAC,KAAK,IAAI,KAAK,YAAY,eAAe,CAAC,EAC9C,SAAS,CAAC,IAAI,CAAC,EACf,oBAAoB,EAAE,EACtB,WAAW,CAAC,CAAC,CAAC,CACf,CAAC;AACH,KAAA;+GAVY,iBAAiB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA,EAAA;AAAjB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,iBAAiB,gFAPlB,CAAwD,sDAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,keAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAExD,SAAS,EAGP,IAAA,EAAA,OAAA,EAAA,CAAA,EAAA,UAAA,EAAA,CAAC,aAAa,CAAC,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA,EAAA;;4FAEhB,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAT7B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,sBAAsB,EACtB,QAAA,EAAA,CAAA,sDAAA,CAAwD,EACtD,UAAA,EAAA,IAAI,WACP,CAAC,SAAS,CAAC,EAAA,eAAA,EAEH,uBAAuB,CAAC,MAAM,EACnC,UAAA,EAAA,CAAC,aAAa,CAAC,EAAA,MAAA,EAAA,CAAA,keAAA,CAAA,EAAA,CAAA;;;ACb7B;;AAEG;;;;"}
@@ -0,0 +1,248 @@
1
+ import * as i0 from '@angular/core';
2
+ import { EventEmitter, afterNextRender, numberAttribute, Component, HostBinding, ViewChild, Input, Output, HostListener } from '@angular/core';
3
+ import { zip, fromEvent, take } from 'rxjs';
4
+ import * as i1 from '@angular/common/http';
5
+ import { HttpContext } from '@angular/common/http';
6
+ import { API_TOKEN, AUTH_TOKEN } from '@solar-angular/http';
7
+ import { encrypt } from 'crypto-js/aes';
8
+ import { parse } from 'crypto-js/enc-utf8';
9
+ import mode from 'crypto-js/mode-ecb';
10
+ import padding from 'crypto-js/pad-pkcs7';
11
+
12
+ const HTTP_OPTIONS = {
13
+ withCredentials: true,
14
+ context: new HttpContext().set(API_TOKEN, false).set(AUTH_TOKEN, false)
15
+ };
16
+ const aesEncrypt = (word, secret) => {
17
+ const key = parse(secret);
18
+ const src = parse(word);
19
+ const encrypted = encrypt(src, key, { mode, padding });
20
+ return encrypted.toString();
21
+ };
22
+ function withDpr(value) {
23
+ return value * devicePixelRatio;
24
+ }
25
+ function withPixel(value) {
26
+ return value + 'px';
27
+ }
28
+
29
+ /** 验证码的原始尺寸 */
30
+ const HEIGHT = 155, WIDTH = 310;
31
+ /** 拼图的原始尺寸 */
32
+ const PUZZLE_HEIGHT = 155, PUZZLE_WIDTH = 50;
33
+ class SunSliderCaptcha {
34
+ /**
35
+ * 当前尺寸 除于 原始尺寸得到的商
36
+ * 用于等比例缩放
37
+ */
38
+ get quotient() {
39
+ return {
40
+ width: this.width / WIDTH,
41
+ height: this.height / HEIGHT
42
+ };
43
+ }
44
+ constructor(http) {
45
+ this.http = http;
46
+ this.loading = false;
47
+ this.verifying = false;
48
+ this.width = WIDTH;
49
+ this.height = HEIGHT;
50
+ this.verified = new EventEmitter();
51
+ /** 滑块拼图的x坐标 */
52
+ this.x = 0;
53
+ this.secrets = {};
54
+ this.alert = {
55
+ type: 'success', // error
56
+ msg: '',
57
+ show: false
58
+ };
59
+ /** 滑动开始的X */
60
+ this.dragStartX = -1;
61
+ /** 滑动bar初始的scrollLeft */
62
+ this.scrollLeft = 0;
63
+ this.bar = {
64
+ blockWidth: 42, // 滑块宽度
65
+ background: 'var(--indicator-primary-color)'
66
+ };
67
+ afterNextRender(() => {
68
+ const dpr = devicePixelRatio;
69
+ this.canvas = this.canvasRef.nativeElement;
70
+ this.canvas.style.width = withPixel(this.width);
71
+ this.canvas.style.height = withPixel(this.height);
72
+ this.canvas.width = withDpr(this.width);
73
+ this.canvas.height = withDpr(this.height);
74
+ this.ctx = this.canvas.getContext('2d');
75
+ this.ctx.scale(dpr, dpr);
76
+ setTimeout(() => {
77
+ this.refresh();
78
+ });
79
+ });
80
+ }
81
+ refresh() {
82
+ setTimeout(() => {
83
+ this.sliderRef.nativeElement.scrollTo(this.width, 0);
84
+ }, 50);
85
+ this.alert.show = false;
86
+ this.bar.background = 'var(--indicator-primary-color)';
87
+ this.loading = true;
88
+ this.http.post(this.srcUrl, { captchaType: "blockPuzzle" /* CaptchaType.BlockPuzzle */ }, HTTP_OPTIONS).subscribe(response => {
89
+ if (response.code === 0) {
90
+ this.secrets.secretKey = response.data.secretKey;
91
+ this.secrets.token = response.data.token;
92
+ this.bgImage = new Image();
93
+ this.slideImage = new Image();
94
+ // this.bgImage.src = `data:image/png;base64,${re.data.jigsawImageBase64}`;
95
+ this.bgImage.src = `data:image/png;base64,${response.data.originalImageBase64}`;
96
+ this.slideImage.src = `data:image/png;base64,${response.data.jigsawImageBase64}`;
97
+ zip(fromEvent(this.bgImage, 'load'), fromEvent(this.slideImage, 'load')).pipe(take(1)).subscribe(() => {
98
+ this.beginTime = new Date().getTime();
99
+ this.draw();
100
+ });
101
+ }
102
+ else {
103
+ console.error(response.msg);
104
+ }
105
+ });
106
+ }
107
+ draw(x = 0) {
108
+ this.x = x;
109
+ this.ctx.clearRect(0, 0, this.width, this.height);
110
+ this.ctx.drawImage(this.bgImage, 0, 0, this.width, this.height);
111
+ this.ctx.drawImage(this.slideImage, this.x, 0, this.quotient.width * PUZZLE_WIDTH, this.quotient.height * PUZZLE_HEIGHT);
112
+ this.loading = false;
113
+ }
114
+ slide(x) {
115
+ this.draw(x);
116
+ }
117
+ verify(x) {
118
+ this.verifying = true;
119
+ // 计算出原始移动距离
120
+ x = x / this.quotient.width;
121
+ this.endTime = new Date().getTime();
122
+ const json = JSON.stringify({ x: x, y: 5.0 });
123
+ const pointJson = this.secrets.secretKey ? aesEncrypt(json, this.secrets.secretKey) : json;
124
+ const verifyData = typeof this.verifyData === 'function' ? this.verifyData() : this.verifyData;
125
+ const obj = {
126
+ captchaType: "blockPuzzle" /* CaptchaType.BlockPuzzle */,
127
+ pointJson,
128
+ token: this.secrets.token,
129
+ ...verifyData
130
+ };
131
+ this.http.post(this.verifyUrl, obj, HTTP_OPTIONS).subscribe({
132
+ next: response => {
133
+ if (response.code !== 0) {
134
+ this.alert.type = 'error';
135
+ this.alert.msg = response.msg;
136
+ this.alert.show = true;
137
+ this.bar.background = 'var(--indicator-danger-color)';
138
+ this.verified.emit({
139
+ code: -1,
140
+ msg: response.msg,
141
+ data: null
142
+ });
143
+ setTimeout(() => {
144
+ this.alert.show = false;
145
+ this.refresh();
146
+ }, 1000);
147
+ }
148
+ else {
149
+ this.alert.type = 'success';
150
+ this.bar.background = 'var(--indicator-primary-color)';
151
+ const seconds = Math.abs(this.endTime - this.beginTime) / 1000;
152
+ this.alert.msg = ` ${seconds}秒 验证成功`;
153
+ this.alert.show = true;
154
+ const temp = response.data.token + '---' + json;
155
+ response.data.captcha = this.secrets.secretKey ? aesEncrypt(temp, this.secrets.secretKey) : temp;
156
+ // delete response.data.token;
157
+ // delete response.data.captchaType;
158
+ // delete response.data.pointJson;
159
+ // delete response.data.result;
160
+ this.verified.emit({
161
+ code: 0,
162
+ msg: response.msg,
163
+ data: response.data
164
+ });
165
+ }
166
+ },
167
+ complete: () => this.verifying = false
168
+ });
169
+ }
170
+ markStart(event) {
171
+ if (!this.loading && !this.verifying) {
172
+ event.stopPropagation();
173
+ this.dragStartX = event.clientX;
174
+ this.scrollLeft = this.sliderRef.nativeElement.scrollLeft;
175
+ }
176
+ }
177
+ markEnd(event) {
178
+ event.stopPropagation();
179
+ if (this.dragStartX > -1) {
180
+ this.verify(this.width - this.sliderRef.nativeElement.scrollLeft);
181
+ }
182
+ this.dragStartX = -1;
183
+ }
184
+ moveMarker(event) {
185
+ event.stopPropagation();
186
+ if (this.dragStartX > -1) { // 如果在拖动了
187
+ const currentX = event.clientX; // 得到当前的X
188
+ const offset = currentX - this.dragStartX; // 得到拖动的距离
189
+ let left = this.scrollLeft - (offset < 0 ? 0 : offset);
190
+ if (left <= this.bar.blockWidth) {
191
+ left = this.bar.blockWidth;
192
+ }
193
+ else if (left >= this.width) {
194
+ left = this.width;
195
+ }
196
+ this.sliderRef.nativeElement.scrollLeft = left;
197
+ this.slide(this.width - left);
198
+ }
199
+ }
200
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SunSliderCaptcha, deps: [{ token: i1.HttpClient }], target: i0.ɵɵFactoryTarget.Component }); }
201
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: SunSliderCaptcha, isStandalone: true, selector: "sun-slider-captcha", inputs: { srcUrl: "srcUrl", verifyUrl: "verifyUrl", verifyData: "verifyData", width: ["width", "width", numberAttribute], height: ["height", "height", numberAttribute] }, outputs: { verified: "verified" }, host: { listeners: { "window:pointerup": "markEnd($event)", "window:pointercancel": "markEnd($event)", "window:pointermove": "moveMarker($event)" }, properties: { "class.sun-verify-loading": "this.loading", "class.sun-verify-verifying": "this.verifying" } }, viewQueries: [{ propertyName: "canvasRef", first: true, predicate: ["canvas"], descendants: true, static: true }, { propertyName: "sliderRef", first: true, predicate: ["slider"], descendants: true, static: true }], ngImport: i0, template: "<div class=\"slide-block\" [style.width.px]=\"width\" [style.height.px]=\"height\">\n <canvas #canvas></canvas>\n @if (alert.show) {\n <div\n class=\"slide-alert\"\n [class.slide-alert-success]=\"alert.type === 'success'\"\n [class.slide-alert-danger]=\"alert.type === 'error'\"\n >\n {{ alert.msg }}\n </div>\n }\n</div>\n\n<div\n #slider\n class=\"verify-bar\"\n [style.width.px]=\"width\"\n (scroll)=\"$event.preventDefault()\"\n (touchmove)=\"$event.preventDefault()\"\n (mousewheel)=\"$event.preventDefault()\"\n>\n <div\n style=\"display: inline-block; height: 40px; vertical-align: top\"\n [style]=\"{ background: bar.background }\"\n [draggable]=\"false\"\n [style.width.px]=\"width\"\n ></div>\n <div class=\"verify-bar-area\" [style.width.px]=\"width\" [draggable]=\"false\">\n <span class=\"verify-msg\" [draggable]=\"false\">\u62D6\u52A8\u6ED1\u5757\u4EE5\u5B8C\u6210\u62FC\u56FE\u9A8C\u8BC1</span>\n <div class=\"verify-left-bar\" [style.width.px]=\"bar.blockWidth\">\n <div\n class=\"verify-move-block\"\n [draggable]=\"false\"\n (pointerdown)=\"markStart($event)\"\n >\n <svg viewBox=\"0 0 512 512\">\n <path\n stroke-width=\"32\"\n stroke-linecap=\"round\"\n stroke-miterlimit=\"10\"\n d=\"M80 160h352M80 256h352M80 352h352\"\n ></path>\n </svg>\n </div>\n </div>\n </div>\n</div>\n", styles: [":host{--track-color: white;--indicator-primary-color: var(--color-primary);--indicator-danger-color: var(--color-danger);--alert-success-color: var(--color-success);--alert-danger-color: var(--color-danger);--alert-success-background: #dcfce7;--alert-danger-background: #fee2e2;--handler-color: #94a3b8;--handler-border-color: #e2e8f0;display:inline-block;overflow:hidden}.slide-block{position:relative}.slide-alert{position:absolute;width:100%;bottom:0;opacity:.9;text-align:center;padding:4px 0;font-size:14px}.slide-alert-success{color:var(--alert-success-color);background:var(--alert-success-background)}.slide-alert-danger{color:var(--alert-danger-color);background:var(--alert-danger-background)}:host ::ng-deep .ant-alert{border-radius:0}.verify-bar{font-size:0;height:40px;line-height:40px;overflow:scroll hidden;white-space:nowrap;scrollbar-width:none}.verify-bar::-webkit-scrollbar{display:none}.verify-bar-area{position:relative;display:inline-block;font-size:14px;text-align:center;background:var(--track-color);height:100%}.verify-bar-area .verify-msg{z-index:3;pointer-events:none;-webkit-user-select:none;user-select:none}.verify-bar-area .verify-move-block{display:flex;justify-content:center;align-items:center;width:100%;height:100%;background:var(--track-color);border:1px solid var(--handler-border-color)}.verify-bar-area .verify-move-block>svg{font-size:24px;color:var(--handler-color);width:1em;height:1em;contain:strict;fill:currentcolor;box-sizing:content-box;stroke:currentcolor;transform:rotate(90deg)}.verify-bar-area .verify-left-bar{position:absolute;top:0;left:0;cursor:grab;height:40px}:host.sun-verify-loading .verify-left-bar,:host.sun-verify-verifying .verify-left-bar{cursor:progress}\n"] }); }
202
+ }
203
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SunSliderCaptcha, decorators: [{
204
+ type: Component,
205
+ args: [{ selector: 'sun-slider-captcha', standalone: true, template: "<div class=\"slide-block\" [style.width.px]=\"width\" [style.height.px]=\"height\">\n <canvas #canvas></canvas>\n @if (alert.show) {\n <div\n class=\"slide-alert\"\n [class.slide-alert-success]=\"alert.type === 'success'\"\n [class.slide-alert-danger]=\"alert.type === 'error'\"\n >\n {{ alert.msg }}\n </div>\n }\n</div>\n\n<div\n #slider\n class=\"verify-bar\"\n [style.width.px]=\"width\"\n (scroll)=\"$event.preventDefault()\"\n (touchmove)=\"$event.preventDefault()\"\n (mousewheel)=\"$event.preventDefault()\"\n>\n <div\n style=\"display: inline-block; height: 40px; vertical-align: top\"\n [style]=\"{ background: bar.background }\"\n [draggable]=\"false\"\n [style.width.px]=\"width\"\n ></div>\n <div class=\"verify-bar-area\" [style.width.px]=\"width\" [draggable]=\"false\">\n <span class=\"verify-msg\" [draggable]=\"false\">\u62D6\u52A8\u6ED1\u5757\u4EE5\u5B8C\u6210\u62FC\u56FE\u9A8C\u8BC1</span>\n <div class=\"verify-left-bar\" [style.width.px]=\"bar.blockWidth\">\n <div\n class=\"verify-move-block\"\n [draggable]=\"false\"\n (pointerdown)=\"markStart($event)\"\n >\n <svg viewBox=\"0 0 512 512\">\n <path\n stroke-width=\"32\"\n stroke-linecap=\"round\"\n stroke-miterlimit=\"10\"\n d=\"M80 160h352M80 256h352M80 352h352\"\n ></path>\n </svg>\n </div>\n </div>\n </div>\n</div>\n", styles: [":host{--track-color: white;--indicator-primary-color: var(--color-primary);--indicator-danger-color: var(--color-danger);--alert-success-color: var(--color-success);--alert-danger-color: var(--color-danger);--alert-success-background: #dcfce7;--alert-danger-background: #fee2e2;--handler-color: #94a3b8;--handler-border-color: #e2e8f0;display:inline-block;overflow:hidden}.slide-block{position:relative}.slide-alert{position:absolute;width:100%;bottom:0;opacity:.9;text-align:center;padding:4px 0;font-size:14px}.slide-alert-success{color:var(--alert-success-color);background:var(--alert-success-background)}.slide-alert-danger{color:var(--alert-danger-color);background:var(--alert-danger-background)}:host ::ng-deep .ant-alert{border-radius:0}.verify-bar{font-size:0;height:40px;line-height:40px;overflow:scroll hidden;white-space:nowrap;scrollbar-width:none}.verify-bar::-webkit-scrollbar{display:none}.verify-bar-area{position:relative;display:inline-block;font-size:14px;text-align:center;background:var(--track-color);height:100%}.verify-bar-area .verify-msg{z-index:3;pointer-events:none;-webkit-user-select:none;user-select:none}.verify-bar-area .verify-move-block{display:flex;justify-content:center;align-items:center;width:100%;height:100%;background:var(--track-color);border:1px solid var(--handler-border-color)}.verify-bar-area .verify-move-block>svg{font-size:24px;color:var(--handler-color);width:1em;height:1em;contain:strict;fill:currentcolor;box-sizing:content-box;stroke:currentcolor;transform:rotate(90deg)}.verify-bar-area .verify-left-bar{position:absolute;top:0;left:0;cursor:grab;height:40px}:host.sun-verify-loading .verify-left-bar,:host.sun-verify-verifying .verify-left-bar{cursor:progress}\n"] }]
206
+ }], ctorParameters: () => [{ type: i1.HttpClient }], propDecorators: { loading: [{
207
+ type: HostBinding,
208
+ args: ['class.sun-verify-loading']
209
+ }], verifying: [{
210
+ type: HostBinding,
211
+ args: ['class.sun-verify-verifying']
212
+ }], canvasRef: [{
213
+ type: ViewChild,
214
+ args: ['canvas', { static: true }]
215
+ }], sliderRef: [{
216
+ type: ViewChild,
217
+ args: ['slider', { static: true }]
218
+ }], srcUrl: [{
219
+ type: Input
220
+ }], verifyUrl: [{
221
+ type: Input
222
+ }], verifyData: [{
223
+ type: Input
224
+ }], width: [{
225
+ type: Input,
226
+ args: [{ transform: numberAttribute }]
227
+ }], height: [{
228
+ type: Input,
229
+ args: [{ transform: numberAttribute }]
230
+ }], verified: [{
231
+ type: Output
232
+ }], markEnd: [{
233
+ type: HostListener,
234
+ args: ['window:pointerup', ['$event']]
235
+ }, {
236
+ type: HostListener,
237
+ args: ['window:pointercancel', ['$event']]
238
+ }], moveMarker: [{
239
+ type: HostListener,
240
+ args: ['window:pointermove', ['$event']]
241
+ }] } });
242
+
243
+ /**
244
+ * Generated bundle index. Do not edit.
245
+ */
246
+
247
+ export { SunSliderCaptcha };
248
+ //# sourceMappingURL=solar-angular-ui-sun-slider-captcha.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"solar-angular-ui-sun-slider-captcha.mjs","sources":["../../../packages/ui-sun/slider-captcha/utils.ts","../../../packages/ui-sun/slider-captcha/slider-captcha.component.ts","../../../packages/ui-sun/slider-captcha/slider-captcha.component.html","../../../packages/ui-sun/slider-captcha/solar-angular-ui-sun-slider-captcha.ts"],"sourcesContent":["import { HttpContext } from '@angular/common/http';\nimport { API_TOKEN, AUTH_TOKEN } from '@solar-angular/http';\nimport { encrypt } from 'crypto-js/aes';\nimport { parse } from 'crypto-js/enc-utf8';\nimport { default as mode } from 'crypto-js/mode-ecb';\nimport { default as padding } from 'crypto-js/pad-pkcs7';\n\nexport const HTTP_OPTIONS = {\n withCredentials: true,\n context: new HttpContext().set(API_TOKEN, false).set(AUTH_TOKEN, false)\n};\n\nexport const aesEncrypt = (word: string, secret: string) => {\n const key = parse(secret);\n const src = parse(word);\n const encrypted = encrypt(src, key, { mode, padding });\n return encrypted.toString();\n};\n\nexport function withDpr(value: number) {\n return value * devicePixelRatio;\n}\n\nexport function withPixel(value: number) {\n return value + 'px';\n}\n","import { HttpClient } from '@angular/common/http';\nimport { afterNextRender, Component, ElementRef, EventEmitter, HostBinding, HostListener, Input, numberAttribute, Output, ViewChild } from '@angular/core';\nimport { Result } from '@solar-kit/planets/sun';\nimport { fromEvent, take, zip } from 'rxjs';\nimport { Captcha, CaptchaType } from './model';\nimport { aesEncrypt, HTTP_OPTIONS, withDpr, withPixel } from './utils';\n\n/** 验证码的原始尺寸 */\nconst HEIGHT = 155, WIDTH = 310;\n/** 拼图的原始尺寸 */\nconst PUZZLE_HEIGHT = 155, PUZZLE_WIDTH = 50;\n\n@Component({\n selector: 'sun-slider-captcha',\n standalone: true,\n templateUrl: './slider-captcha.component.html',\n styleUrl: './slider-captcha.component.scss',\n})\nexport class SunSliderCaptcha {\n @HostBinding('class.sun-verify-loading') loading = false;\n @HostBinding('class.sun-verify-verifying') verifying = false;\n\n @ViewChild('canvas', { static: true }) canvasRef!: ElementRef<HTMLCanvasElement>;\n @ViewChild('slider', { static: true }) sliderRef!: ElementRef<HTMLDivElement>;\n\n @Input() srcUrl!: string;\n @Input() verifyUrl!: string;\n @Input() verifyData?: Record<string, any> | (() => Record<string, any>);\n @Input({ transform: numberAttribute }) width = WIDTH;\n @Input({ transform: numberAttribute }) height = HEIGHT;\n\n @Output() verified = new EventEmitter<Result<Captcha>>();\n\n private canvas!: HTMLCanvasElement;\n private ctx!: CanvasRenderingContext2D;\n private bgImage!: HTMLImageElement;\n private slideImage!: HTMLImageElement;\n\n /** 滑块拼图的x坐标 */\n x = 0;\n\n secrets: { secretKey: string, token: string } = {} as any;\n\n alert: { type: 'success' | 'error', msg: string, show: boolean } = {\n type: 'success', // error\n msg: '',\n show: false\n };\n\n beginTime!: number;\n endTime!: number;\n\n /** 滑动开始的X */\n dragStartX = -1;\n /** 滑动bar初始的scrollLeft */\n scrollLeft = 0;\n\n bar = {\n blockWidth: 42, // 滑块宽度\n background: 'var(--indicator-primary-color)'\n };\n\n /**\n * 当前尺寸 除于 原始尺寸得到的商\n * 用于等比例缩放\n */\n get quotient() {\n return {\n width: this.width / WIDTH,\n height: this.height / HEIGHT\n };\n }\n\n constructor(private http: HttpClient) {\n afterNextRender(() => {\n const dpr = devicePixelRatio;\n this.canvas = this.canvasRef.nativeElement;\n this.canvas.style.width = withPixel(this.width);\n this.canvas.style.height = withPixel(this.height);\n this.canvas.width = withDpr(this.width);\n this.canvas.height = withDpr(this.height);\n\n this.ctx = this.canvas.getContext('2d')!;\n this.ctx.scale(dpr, dpr);\n\n setTimeout(() => {\n this.refresh();\n });\n })\n }\n\n refresh() {\n setTimeout(() => {\n this.sliderRef.nativeElement.scrollTo(this.width, 0);\n }, 50);\n this.alert.show = false;\n this.bar.background = 'var(--indicator-primary-color)';\n this.loading = true;\n this.http.post<Result<Captcha>>(this.srcUrl, { captchaType: CaptchaType.BlockPuzzle }, HTTP_OPTIONS).subscribe(response => {\n if (response.code === 0) {\n this.secrets.secretKey = response.data.secretKey;\n this.secrets.token = response.data.token;\n this.bgImage = new Image();\n this.slideImage = new Image();\n // this.bgImage.src = `data:image/png;base64,${re.data.jigsawImageBase64}`;\n this.bgImage.src = `data:image/png;base64,${response.data.originalImageBase64}`;\n this.slideImage.src = `data:image/png;base64,${response.data.jigsawImageBase64}`;\n zip(\n fromEvent(this.bgImage, 'load'),\n fromEvent(this.slideImage, 'load'),\n ).pipe(take(1)).subscribe(() => {\n this.beginTime = new Date().getTime();\n this.draw();\n });\n } else {\n console.error(response.msg);\n }\n });\n }\n\n private draw(x = 0) {\n this.x = x;\n this.ctx.clearRect(0, 0, this.width, this.height);\n this.ctx.drawImage(this.bgImage, 0, 0, this.width, this.height);\n this.ctx.drawImage(this.slideImage, this.x, 0, this.quotient.width * PUZZLE_WIDTH, this.quotient.height * PUZZLE_HEIGHT);\n this.loading = false;\n }\n\n slide(x: number) {\n this.draw(x);\n }\n\n verify(x: number) {\n this.verifying = true;\n // 计算出原始移动距离\n x = x / this.quotient.width;\n\n this.endTime = new Date().getTime();\n const json = JSON.stringify({ x: x, y: 5.0 });\n const pointJson = this.secrets.secretKey ? aesEncrypt(json, this.secrets.secretKey) : json;\n const verifyData = typeof this.verifyData === 'function' ? this.verifyData() : this.verifyData;\n const obj = {\n captchaType: CaptchaType.BlockPuzzle,\n pointJson,\n token: this.secrets.token,\n ...verifyData\n };\n this.http.post<Result<Captcha>>(this.verifyUrl, obj, HTTP_OPTIONS).subscribe({\n next: response => {\n if (response.code !== 0) {\n this.alert.type = 'error';\n this.alert.msg = response.msg;\n this.alert.show = true;\n this.bar.background = 'var(--indicator-danger-color)';\n this.verified.emit({\n code: -1,\n msg: response.msg,\n data: null!\n });\n setTimeout(() => {\n this.alert.show = false;\n this.refresh();\n }, 1000);\n } else {\n this.alert.type = 'success';\n this.bar.background = 'var(--indicator-primary-color)';\n const seconds = Math.abs(this.endTime - this.beginTime) / 1000;\n this.alert.msg = ` ${seconds}秒 验证成功`;\n this.alert.show = true;\n const temp = response.data.token + '---' + json;\n response.data.captcha = this.secrets.secretKey ? aesEncrypt(temp, this.secrets.secretKey) : temp;\n // delete response.data.token;\n // delete response.data.captchaType;\n // delete response.data.pointJson;\n // delete response.data.result;\n this.verified.emit({\n code: 0,\n msg: response.msg,\n data: response.data\n });\n }\n },\n complete: () => this.verifying = false\n });\n }\n\n markStart(event: PointerEvent) {\n if (!this.loading && !this.verifying) {\n event.stopPropagation();\n this.dragStartX = event.clientX;\n this.scrollLeft = this.sliderRef.nativeElement.scrollLeft;\n }\n }\n\n @HostListener('window:pointerup', ['$event'])\n @HostListener('window:pointercancel', ['$event'])\n markEnd(event: PointerEvent) {\n event.stopPropagation();\n if (this.dragStartX > -1) {\n this.verify(this.width - this.sliderRef.nativeElement.scrollLeft);\n }\n this.dragStartX = -1;\n }\n\n @HostListener('window:pointermove', ['$event'])\n moveMarker(event: PointerEvent) {\n event.stopPropagation();\n if (this.dragStartX > -1) { // 如果在拖动了\n const currentX = event.clientX; // 得到当前的X\n const offset = currentX - this.dragStartX; // 得到拖动的距离\n\n let left = this.scrollLeft - (offset < 0 ? 0 : offset);\n\n if (left <= this.bar.blockWidth) {\n left = this.bar.blockWidth;\n } else if (left >= this.width) {\n left = this.width;\n }\n this.sliderRef.nativeElement.scrollLeft = left;\n this.slide(this.width - left);\n }\n }\n\n}\n","<div class=\"slide-block\" [style.width.px]=\"width\" [style.height.px]=\"height\">\n <canvas #canvas></canvas>\n @if (alert.show) {\n <div\n class=\"slide-alert\"\n [class.slide-alert-success]=\"alert.type === 'success'\"\n [class.slide-alert-danger]=\"alert.type === 'error'\"\n >\n {{ alert.msg }}\n </div>\n }\n</div>\n\n<div\n #slider\n class=\"verify-bar\"\n [style.width.px]=\"width\"\n (scroll)=\"$event.preventDefault()\"\n (touchmove)=\"$event.preventDefault()\"\n (mousewheel)=\"$event.preventDefault()\"\n>\n <div\n style=\"display: inline-block; height: 40px; vertical-align: top\"\n [style]=\"{ background: bar.background }\"\n [draggable]=\"false\"\n [style.width.px]=\"width\"\n ></div>\n <div class=\"verify-bar-area\" [style.width.px]=\"width\" [draggable]=\"false\">\n <span class=\"verify-msg\" [draggable]=\"false\">拖动滑块以完成拼图验证</span>\n <div class=\"verify-left-bar\" [style.width.px]=\"bar.blockWidth\">\n <div\n class=\"verify-move-block\"\n [draggable]=\"false\"\n (pointerdown)=\"markStart($event)\"\n >\n <svg viewBox=\"0 0 512 512\">\n <path\n stroke-width=\"32\"\n stroke-linecap=\"round\"\n stroke-miterlimit=\"10\"\n d=\"M80 160h352M80 256h352M80 352h352\"\n ></path>\n </svg>\n </div>\n </div>\n </div>\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ var index = void 0;
2
+
3
+ /**
4
+ * Generated bundle index. Do not edit.
5
+ */
6
+ //# sourceMappingURL=solar-angular-ui-sun.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"solar-angular-ui-sun.mjs","sources":["../../../packages/ui-sun/index.ts","../../../packages/ui-sun/solar-angular-ui-sun.ts"],"sourcesContent":["export default void 0\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"AAAA,YAAe,KAAK,CAAC;;ACArB;;AAEG"}
package/index.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ declare const _default: undefined;
2
+ export default _default;
@@ -0,0 +1 @@
1
+ export * from './nav-progress-bar.component';
@@ -0,0 +1,6 @@
1
+ import * as i0 from "@angular/core";
2
+ export declare class SunNavProgressBar {
3
+ navigating$: import("rxjs").Observable<boolean>;
4
+ static ɵfac: i0.ɵɵFactoryDeclaration<SunNavProgressBar, never>;
5
+ static ɵcmp: i0.ɵɵComponentDeclaration<SunNavProgressBar, "sun-nav-progress-bar", never, {}, {}, never, never, true, never>;
6
+ }
package/package.json ADDED
@@ -0,0 +1,43 @@
1
+ {
2
+ "name": "@solar-angular/ui-sun",
3
+ "version": "1.0.0",
4
+ "sideEffects": false,
5
+ "publishConfig": {
6
+ "access": "public"
7
+ },
8
+ "dependencies": {
9
+ "crypto-js": "^4.2.0",
10
+ "tslib": "^2.3.0"
11
+ },
12
+ "peerDependencies": {
13
+ "@angular/common": "^18.0.0",
14
+ "@angular/core": "^18.0.0",
15
+ "@solar-angular/http": "0.0.0",
16
+ "@solar-angular/animations": "0.0.0"
17
+ },
18
+ "module": "fesm2022/solar-angular-ui-sun.mjs",
19
+ "typings": "index.d.ts",
20
+ "exports": {
21
+ "./package.json": {
22
+ "default": "./package.json"
23
+ },
24
+ ".": {
25
+ "types": "./index.d.ts",
26
+ "esm2022": "./esm2022/solar-angular-ui-sun.mjs",
27
+ "esm": "./esm2022/solar-angular-ui-sun.mjs",
28
+ "default": "./fesm2022/solar-angular-ui-sun.mjs"
29
+ },
30
+ "./nav-progress-bar": {
31
+ "types": "./nav-progress-bar/index.d.ts",
32
+ "esm2022": "./esm2022/nav-progress-bar/solar-angular-ui-sun-nav-progress-bar.mjs",
33
+ "esm": "./esm2022/nav-progress-bar/solar-angular-ui-sun-nav-progress-bar.mjs",
34
+ "default": "./fesm2022/solar-angular-ui-sun-nav-progress-bar.mjs"
35
+ },
36
+ "./slider-captcha": {
37
+ "types": "./slider-captcha/index.d.ts",
38
+ "esm2022": "./esm2022/slider-captcha/solar-angular-ui-sun-slider-captcha.mjs",
39
+ "esm": "./esm2022/slider-captcha/solar-angular-ui-sun-slider-captcha.mjs",
40
+ "default": "./fesm2022/solar-angular-ui-sun-slider-captcha.mjs"
41
+ }
42
+ }
43
+ }
@@ -0,0 +1,2 @@
1
+ export * from './model';
2
+ export * from './slider-captcha.component';
@@ -0,0 +1,17 @@
1
+ export interface Captcha {
2
+ jigsawImageBase64: string;
3
+ originalImageBase64: string;
4
+ result: boolean;
5
+ secretKey: string;
6
+ token: string;
7
+ captcha: string;
8
+ captchaType: string;
9
+ pointJson: string;
10
+ wordList: any[];
11
+ clientId: string;
12
+ clientSecret: string;
13
+ }
14
+ export declare const enum CaptchaType {
15
+ BlockPuzzle = "blockPuzzle",
16
+ ClickWord = "clickWord"
17
+ }
@@ -0,0 +1,63 @@
1
+ import { HttpClient } from '@angular/common/http';
2
+ import { ElementRef, EventEmitter } from '@angular/core';
3
+ import { Result } from '@solar-kit/planets/sun';
4
+ import { Captcha } from './model';
5
+ import * as i0 from "@angular/core";
6
+ export declare class SunSliderCaptcha {
7
+ private http;
8
+ loading: boolean;
9
+ verifying: boolean;
10
+ canvasRef: ElementRef<HTMLCanvasElement>;
11
+ sliderRef: ElementRef<HTMLDivElement>;
12
+ srcUrl: string;
13
+ verifyUrl: string;
14
+ verifyData?: Record<string, any> | (() => Record<string, any>);
15
+ width: number;
16
+ height: number;
17
+ verified: EventEmitter<Result<Captcha>>;
18
+ private canvas;
19
+ private ctx;
20
+ private bgImage;
21
+ private slideImage;
22
+ /** 滑块拼图的x坐标 */
23
+ x: number;
24
+ secrets: {
25
+ secretKey: string;
26
+ token: string;
27
+ };
28
+ alert: {
29
+ type: 'success' | 'error';
30
+ msg: string;
31
+ show: boolean;
32
+ };
33
+ beginTime: number;
34
+ endTime: number;
35
+ /** 滑动开始的X */
36
+ dragStartX: number;
37
+ /** 滑动bar初始的scrollLeft */
38
+ scrollLeft: number;
39
+ bar: {
40
+ blockWidth: number;
41
+ background: string;
42
+ };
43
+ /**
44
+ * 当前尺寸 除于 原始尺寸得到的商
45
+ * 用于等比例缩放
46
+ */
47
+ get quotient(): {
48
+ width: number;
49
+ height: number;
50
+ };
51
+ constructor(http: HttpClient);
52
+ refresh(): void;
53
+ private draw;
54
+ slide(x: number): void;
55
+ verify(x: number): void;
56
+ markStart(event: PointerEvent): void;
57
+ markEnd(event: PointerEvent): void;
58
+ moveMarker(event: PointerEvent): void;
59
+ static ɵfac: i0.ɵɵFactoryDeclaration<SunSliderCaptcha, never>;
60
+ static ɵcmp: i0.ɵɵComponentDeclaration<SunSliderCaptcha, "sun-slider-captcha", never, { "srcUrl": { "alias": "srcUrl"; "required": false; }; "verifyUrl": { "alias": "verifyUrl"; "required": false; }; "verifyData": { "alias": "verifyData"; "required": false; }; "width": { "alias": "width"; "required": false; }; "height": { "alias": "height"; "required": false; }; }, { "verified": "verified"; }, never, never, true, never>;
61
+ static ngAcceptInputType_width: unknown;
62
+ static ngAcceptInputType_height: unknown;
63
+ }
@@ -0,0 +1,8 @@
1
+ import { HttpContext } from '@angular/common/http';
2
+ export declare const HTTP_OPTIONS: {
3
+ withCredentials: boolean;
4
+ context: HttpContext;
5
+ };
6
+ export declare const aesEncrypt: (word: string, secret: string) => string;
7
+ export declare function withDpr(value: number): number;
8
+ export declare function withPixel(value: number): string;