@surfside/ads 2.0.0 → 3.6.0-05c824af.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 +15 -69
- package/lib/cjs/BuildInfo.js +9 -0
- package/lib/cjs/BuildInfo.js.map +1 -0
- package/lib/cjs/Constants.js +5 -0
- package/lib/cjs/Constants.js.map +1 -0
- package/lib/cjs/Init.js +137 -0
- package/lib/cjs/Init.js.map +1 -0
- package/lib/cjs/components/Banner.js +150 -0
- package/lib/cjs/components/Banner.js.map +1 -0
- package/lib/cjs/components/Card.js +170 -0
- package/lib/cjs/components/Card.js.map +1 -0
- package/lib/cjs/components/Carousel.js +266 -0
- package/lib/cjs/components/Carousel.js.map +1 -0
- package/lib/cjs/components/Creative.js +290 -0
- package/lib/cjs/components/Creative.js.map +1 -0
- package/lib/cjs/components/Debug.js +20 -0
- package/lib/cjs/components/Debug.js.map +1 -0
- package/lib/cjs/components/Dynamic.js +310 -0
- package/lib/cjs/components/Dynamic.js.map +1 -0
- package/lib/cjs/components/SimpleCreative.js +81 -0
- package/lib/cjs/components/SimpleCreative.js.map +1 -0
- package/lib/cjs/components/Video.js +144 -0
- package/lib/cjs/components/Video.js.map +1 -0
- package/lib/cjs/demo/test.js +7 -0
- package/lib/cjs/demo/test.js.map +1 -0
- package/lib/cjs/index.module.js +113 -0
- package/lib/cjs/index.module.js.map +1 -0
- package/lib/cjs/index.script.js +103 -0
- package/lib/cjs/index.script.js.map +1 -0
- package/lib/cjs/index.script.mock.js +154 -0
- package/lib/cjs/index.script.mock.js.map +1 -0
- package/lib/cjs/service/Init.js +3 -0
- package/lib/cjs/service/Init.js.map +1 -0
- package/lib/cjs/util/Attributes.js +93 -0
- package/lib/cjs/util/Attributes.js.map +1 -0
- package/lib/cjs/util/Types.js +3 -0
- package/lib/cjs/util/Types.js.map +1 -0
- package/lib/esm/BuildInfo.js +6 -0
- package/lib/esm/BuildInfo.js.map +1 -0
- package/lib/esm/Constants.js +2 -0
- package/lib/esm/Constants.js.map +1 -0
- package/lib/esm/Init.js +99 -0
- package/lib/esm/Init.js.map +1 -0
- package/lib/esm/components/Banner.js +146 -0
- package/lib/esm/components/Banner.js.map +1 -0
- package/lib/esm/components/Card.js +166 -0
- package/lib/esm/components/Card.js.map +1 -0
- package/lib/esm/components/Carousel.js +262 -0
- package/lib/esm/components/Carousel.js.map +1 -0
- package/lib/esm/components/Creative.js +285 -0
- package/lib/esm/components/Creative.js.map +1 -0
- package/lib/esm/components/Debug.js +16 -0
- package/lib/esm/components/Debug.js.map +1 -0
- package/lib/esm/components/Dynamic.js +306 -0
- package/lib/esm/components/Dynamic.js.map +1 -0
- package/lib/esm/components/SimpleCreative.js +75 -0
- package/lib/esm/components/SimpleCreative.js.map +1 -0
- package/lib/esm/components/Video.js +140 -0
- package/lib/esm/components/Video.js.map +1 -0
- package/lib/esm/demo/test.js +5 -0
- package/lib/esm/demo/test.js.map +1 -0
- package/lib/esm/index.module.js +73 -0
- package/lib/esm/index.module.js.map +1 -0
- package/lib/esm/index.script.js +101 -0
- package/lib/esm/index.script.js.map +1 -0
- package/lib/esm/index.script.mock.js +152 -0
- package/lib/esm/index.script.mock.js.map +1 -0
- package/lib/esm/service/Init.js +2 -0
- package/lib/esm/service/Init.js.map +1 -0
- package/lib/esm/util/Attributes.js +81 -0
- package/lib/esm/util/Attributes.js.map +1 -0
- package/lib/esm/util/Types.js +2 -0
- package/lib/esm/util/Types.js.map +1 -0
- package/lib/types/BuildInfo.d.ts +5 -0
- package/lib/types/Constants.d.ts +1 -0
- package/lib/types/Init.d.ts +32 -0
- package/lib/types/components/Banner.d.ts +16 -0
- package/lib/types/components/Card.d.ts +18 -0
- package/lib/types/components/Carousel.d.ts +33 -0
- package/lib/types/components/Creative.d.ts +92 -0
- package/lib/types/components/Debug.d.ts +2 -0
- package/lib/types/components/Dynamic.d.ts +24 -0
- package/lib/types/components/SimpleCreative.d.ts +21 -0
- package/lib/types/components/Video.d.ts +22 -0
- package/lib/types/demo/test.d.ts +1 -0
- package/lib/types/index.module.d.ts +12 -0
- package/lib/types/index.script.d.ts +1 -0
- package/lib/types/index.script.mock.d.ts +1 -0
- package/lib/types/service/Init.d.ts +1 -0
- package/lib/types/util/Attributes.d.ts +24 -0
- package/lib/types/util/Types.d.ts +3 -0
- package/package.json +42 -73
- package/lib/index.js +0 -2
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import { CancellationToken, WrapValue } from '@surfside/ads-core';
|
|
2
|
+
import { SimpleCreativeComponent } from './SimpleCreative';
|
|
3
|
+
import { DEBOUNCE_THRESHOLD } from './Creative';
|
|
4
|
+
import { CreateDebugButton } from './Debug';
|
|
5
|
+
;
|
|
6
|
+
export class SurfsideBanner extends SimpleCreativeComponent {
|
|
7
|
+
_cancellationToken = new CancellationToken();
|
|
8
|
+
_bounce;
|
|
9
|
+
static get observedAttributes() {
|
|
10
|
+
return SimpleCreativeComponent.observedSimpleAttributes;
|
|
11
|
+
}
|
|
12
|
+
constructor(dependencies) {
|
|
13
|
+
super(dependencies);
|
|
14
|
+
const { logger } = dependencies;
|
|
15
|
+
logger?.info('Building SurfsideBanner', this.instanceId);
|
|
16
|
+
}
|
|
17
|
+
getComponentName() {
|
|
18
|
+
return 'SurfsideBanner';
|
|
19
|
+
}
|
|
20
|
+
async attributeChangedCallback(name, oldValue, newValue) {
|
|
21
|
+
const log = this.log?.with('attributeChangedCallback');
|
|
22
|
+
log?.info('Attribute changed', name, oldValue, newValue);
|
|
23
|
+
await this.handleSimpleAttributeChange(name, oldValue, newValue, log);
|
|
24
|
+
const totem = crypto.randomUUID();
|
|
25
|
+
this.totem = totem;
|
|
26
|
+
log?.debug(name, 'totem', totem);
|
|
27
|
+
if (!this.attributesLoaded()) {
|
|
28
|
+
log?.debug('Attributes not ready yet...');
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
await this.lazyLoadApi();
|
|
32
|
+
if (this.totem !== totem) {
|
|
33
|
+
log?.debug('Totem changed. Deferring rendering of banner until last attribute changed', totem, this.totem);
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
log?.debug(`Rendering banner upon [${name}] changed!`);
|
|
37
|
+
if (this.isConnected) {
|
|
38
|
+
if (this._bounce !== undefined) {
|
|
39
|
+
globalThis.clearTimeout(this._bounce);
|
|
40
|
+
}
|
|
41
|
+
this._bounce = globalThis.setTimeout(() => this.render(), DEBOUNCE_THRESHOLD);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
async connectedCallback() {
|
|
45
|
+
super.connectedCallback();
|
|
46
|
+
this.log?.info('Banner component callback: connected');
|
|
47
|
+
this.readSimpleAttributes();
|
|
48
|
+
await this.initApi();
|
|
49
|
+
const totem = crypto.randomUUID();
|
|
50
|
+
this.totem = totem;
|
|
51
|
+
if (this.attributesLoaded()) {
|
|
52
|
+
await this.lazyLoadApi();
|
|
53
|
+
if (this.totem !== totem) {
|
|
54
|
+
this.log?.debug('Attributes changed after connectedCallback, waiting to render');
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
this.log?.debug('Rendering upon connectedCallback');
|
|
58
|
+
await this.render();
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
this.log?.warn('ConnectedCallback called before attributes were all ready.');
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
adoptedCallback() {
|
|
65
|
+
this.log?.info('Banner component callback: adopted');
|
|
66
|
+
}
|
|
67
|
+
disconnectedCallback() {
|
|
68
|
+
super.disconnectedCallback();
|
|
69
|
+
this._cancellationToken.cancel();
|
|
70
|
+
if (this._bounce !== undefined) {
|
|
71
|
+
globalThis.clearTimeout(this._bounce);
|
|
72
|
+
this._bounce = undefined;
|
|
73
|
+
}
|
|
74
|
+
this.log?.info('Banner component callback: disconnected', this.instanceId);
|
|
75
|
+
}
|
|
76
|
+
connectedMoveCallback() {
|
|
77
|
+
this.log?.info('Banner component callback: moved', this.instanceId);
|
|
78
|
+
}
|
|
79
|
+
async render() {
|
|
80
|
+
const log = this.log?.with('SurfsideBanner', { zoneId: this.zoneId });
|
|
81
|
+
log?.info('rendering banner web component', this.instanceId);
|
|
82
|
+
log?.debug('width', this.width, 'height', this.height);
|
|
83
|
+
const stopTimer = log?.time?.('render banner');
|
|
84
|
+
this._cancellationToken.cancel();
|
|
85
|
+
this.clearReauction();
|
|
86
|
+
const token = new CancellationToken();
|
|
87
|
+
this._cancellationToken = token;
|
|
88
|
+
const { requestBids, startRequest, buildBannerResponse, renderBanner } = this.api;
|
|
89
|
+
log?.debug('Category:', this.category);
|
|
90
|
+
const response = await requestBids(startRequest(this.zoneId)
|
|
91
|
+
.withSurfCategory(this.category)
|
|
92
|
+
.withKeywords(this.keywords)
|
|
93
|
+
.withImp(this.zoneId)
|
|
94
|
+
.andBanner(this.width, this.height)
|
|
95
|
+
.build());
|
|
96
|
+
if (!response.ok) {
|
|
97
|
+
log?.warn('Failed to get bid response! Got ', response.error);
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
const bidRes = WrapValue(response.value.seatbid?.[0]?.bid[0]);
|
|
101
|
+
if (!bidRes.ok) {
|
|
102
|
+
log?.warn('Bid response had no bid!', bidRes.error);
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
const bannerResponse = buildBannerResponse(bidRes.value);
|
|
106
|
+
if (!bannerResponse.ok) {
|
|
107
|
+
log?.warn('Banner failed to build response', bannerResponse.error);
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
const bannerRes = renderBanner(bannerResponse.value);
|
|
111
|
+
if (!bannerRes.ok) {
|
|
112
|
+
log?.warn('Failed to render banner', bannerRes.error);
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
const element = bannerRes.value;
|
|
116
|
+
if (!token.cancelled) {
|
|
117
|
+
this.shadow.innerHTML = '';
|
|
118
|
+
this.shadow.appendChild(element);
|
|
119
|
+
if (this.isDebug) {
|
|
120
|
+
this.shadow.appendChild(CreateDebugButton('banners', {
|
|
121
|
+
accountId: this.accountId,
|
|
122
|
+
siteId: this.siteId,
|
|
123
|
+
channelId: this.channelId,
|
|
124
|
+
zoneId: this.zoneId,
|
|
125
|
+
locationId: this.locationId,
|
|
126
|
+
width: this.width.toString(),
|
|
127
|
+
height: this.height.toString()
|
|
128
|
+
}));
|
|
129
|
+
}
|
|
130
|
+
element.classList.add(`surf-zone-${this.zoneId}`);
|
|
131
|
+
stopTimer?.();
|
|
132
|
+
this.restartEndToEndTimer?.();
|
|
133
|
+
/* Reauction */
|
|
134
|
+
log?.debug('Settings ', this.api.configuration.settings);
|
|
135
|
+
if (this.api.configuration.settings.reauctionEnabled && bidRes.value.ext?.takeover !== true) {
|
|
136
|
+
const interval = Math.max(this.api.configuration.settings.reauctionIntervalMs, 10000);
|
|
137
|
+
log?.info('Setting up re-auction in ' + interval + 'ms');
|
|
138
|
+
this.scheduleReauction(() => this.render(), interval);
|
|
139
|
+
}
|
|
140
|
+
else {
|
|
141
|
+
log?.info('Not setting up reauction');
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
//# sourceMappingURL=Banner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Banner.js","sourceRoot":"../@surfside-ads/","sources":["components/Banner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
import { CancellationToken, ConsumeNAsync, Err, InvalidRecommenderTypeError, TryDoFlat } from '@surfside/ads-core';
|
|
2
|
+
import { CreativeComponent, DEBOUNCE_THRESHOLD, ProductFeedStrategy, RecommenderTypeInputs } from './Creative';
|
|
3
|
+
export class SurfsideProductCard extends CreativeComponent {
|
|
4
|
+
_cancellationToken = new CancellationToken();
|
|
5
|
+
recommend = 'top-products';
|
|
6
|
+
strategy = ProductFeedStrategy.Hybrid;
|
|
7
|
+
_bounce;
|
|
8
|
+
static get observedAttributes() {
|
|
9
|
+
return [
|
|
10
|
+
...CreativeComponent.observedBaseAttributes,
|
|
11
|
+
'recommend',
|
|
12
|
+
'strategy'
|
|
13
|
+
];
|
|
14
|
+
}
|
|
15
|
+
getComponentName() {
|
|
16
|
+
return 'SurfsideProductCard';
|
|
17
|
+
}
|
|
18
|
+
async attributeChangedCallback(name, oldValue, newValue) {
|
|
19
|
+
const log = this.log?.with('attributeChangedCallback');
|
|
20
|
+
log?.info('detected attribute change');
|
|
21
|
+
log?.debug(name, oldValue, newValue);
|
|
22
|
+
switch (name) {
|
|
23
|
+
case 'strategy': {
|
|
24
|
+
const strategy = newValue?.toLowerCase();
|
|
25
|
+
switch (strategy) {
|
|
26
|
+
case ProductFeedStrategy.Sponsored:
|
|
27
|
+
case ProductFeedStrategy.Hybrid:
|
|
28
|
+
case ProductFeedStrategy.Recommended:
|
|
29
|
+
this.strategy = strategy;
|
|
30
|
+
break;
|
|
31
|
+
default:
|
|
32
|
+
log?.warn('Unrecognized or null strategy:', newValue);
|
|
33
|
+
break;
|
|
34
|
+
}
|
|
35
|
+
break;
|
|
36
|
+
}
|
|
37
|
+
case 'recommend': {
|
|
38
|
+
const recommend = newValue?.toLowerCase();
|
|
39
|
+
switch (recommend) {
|
|
40
|
+
case RecommenderTypeInputs.TopProducts:
|
|
41
|
+
this.recommend = 'top-products';
|
|
42
|
+
break;
|
|
43
|
+
case RecommenderTypeInputs.ForYou:
|
|
44
|
+
this.recommend = 'for-you';
|
|
45
|
+
break;
|
|
46
|
+
case RecommenderTypeInputs.PastPurchases:
|
|
47
|
+
case RecommenderTypeInputs.BuyAgain:
|
|
48
|
+
this.recommend = 'past-purchases';
|
|
49
|
+
break;
|
|
50
|
+
default:
|
|
51
|
+
log?.warn('Unrecognized or null recommender type:', newValue);
|
|
52
|
+
break;
|
|
53
|
+
}
|
|
54
|
+
break;
|
|
55
|
+
}
|
|
56
|
+
default: {
|
|
57
|
+
const baseName = name;
|
|
58
|
+
if (CreativeComponent.observedBaseAttributes.includes(baseName)) {
|
|
59
|
+
await super.baseAttributeChangedCallback(baseName, oldValue, newValue, log);
|
|
60
|
+
}
|
|
61
|
+
break;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
const totem = crypto.randomUUID();
|
|
65
|
+
this.totem = totem;
|
|
66
|
+
if (!this.attributesLoaded()) {
|
|
67
|
+
log?.warn('Attributes not ready yet...', this.getBaseAttributeValues());
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
log?.debug('Attributes ready!');
|
|
72
|
+
}
|
|
73
|
+
await this.lazyLoadApi();
|
|
74
|
+
if (totem !== this.totem) {
|
|
75
|
+
log?.debug('Totem changed between attribute callbacks. Deferring product card render until last attribute');
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
if (this._bounce !== undefined) {
|
|
79
|
+
globalThis.clearTimeout(this._bounce);
|
|
80
|
+
}
|
|
81
|
+
this._bounce = globalThis.setTimeout(() => this.render(), DEBOUNCE_THRESHOLD);
|
|
82
|
+
}
|
|
83
|
+
async connectedCallback() {
|
|
84
|
+
super.connectedCallback();
|
|
85
|
+
const log = this.log?.with('connectedCallback');
|
|
86
|
+
log?.info('connectedCallback');
|
|
87
|
+
await this.initApi();
|
|
88
|
+
const totem = crypto.randomUUID();
|
|
89
|
+
this.totem = totem;
|
|
90
|
+
if (this.attributesLoaded()) {
|
|
91
|
+
await this.lazyLoadApi();
|
|
92
|
+
if (this.totem !== totem) {
|
|
93
|
+
this.log?.debug('Totem changed during connectedCallback. Waiting for attribute callbacks to render');
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
if (this.isConnected) {
|
|
97
|
+
await this.render();
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
disconnectedCallback() {
|
|
102
|
+
super.disconnectedCallback();
|
|
103
|
+
this._cancellationToken.cancel();
|
|
104
|
+
if (this._bounce !== undefined) {
|
|
105
|
+
globalThis.clearTimeout(this._bounce);
|
|
106
|
+
this._bounce = undefined;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
async render() {
|
|
110
|
+
const log = this.log?.with('SurfsideProductCard', { zoneId: this.zoneId });
|
|
111
|
+
log?.info('Rendering carousel', this.api);
|
|
112
|
+
const stopTimer = log?.time?.('render product card');
|
|
113
|
+
this._cancellationToken.cancel();
|
|
114
|
+
const token = new CancellationToken();
|
|
115
|
+
this._cancellationToken = token;
|
|
116
|
+
const { startRequest, defaultNative, buildHybridCarousel, buildSponsoredCarousel, buildRecommendedCarousel, renderProductCard } = this.api;
|
|
117
|
+
const native = defaultNative()
|
|
118
|
+
.withManyMetaProducts(6, 80, false)
|
|
119
|
+
.withMetaBrand(80, false)
|
|
120
|
+
.build();
|
|
121
|
+
const carousel = TryDoFlat(() => {
|
|
122
|
+
const request = startRequest(this.zoneId)
|
|
123
|
+
.withSurfCategory(this.category)
|
|
124
|
+
.withKeywords(this.keywords)
|
|
125
|
+
.withNative(native)
|
|
126
|
+
.build();
|
|
127
|
+
switch (this.strategy) {
|
|
128
|
+
case ProductFeedStrategy.Hybrid:
|
|
129
|
+
return buildHybridCarousel({
|
|
130
|
+
type: this.recommend,
|
|
131
|
+
}, request);
|
|
132
|
+
case ProductFeedStrategy.Sponsored:
|
|
133
|
+
return buildSponsoredCarousel(request);
|
|
134
|
+
case ProductFeedStrategy.Recommended:
|
|
135
|
+
return buildRecommendedCarousel({
|
|
136
|
+
type: this.recommend
|
|
137
|
+
}, this.category?.[0]);
|
|
138
|
+
default:
|
|
139
|
+
return Err(new InvalidRecommenderTypeError(this.strategy));
|
|
140
|
+
}
|
|
141
|
+
});
|
|
142
|
+
if (!carousel.ok) {
|
|
143
|
+
log?.error(carousel.error);
|
|
144
|
+
return;
|
|
145
|
+
}
|
|
146
|
+
const [[builtProductCard]] = await ConsumeNAsync(carousel.value.getProduct(), 1);
|
|
147
|
+
if (this._cancellationToken.cancelled) {
|
|
148
|
+
log?.debug('Render cancelled');
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
|
+
if (builtProductCard === undefined) {
|
|
152
|
+
log?.warn('Built product card was undefined. No inventory available. Check the rest of the logs');
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
const container = renderProductCard(builtProductCard);
|
|
156
|
+
if (!container.ok) {
|
|
157
|
+
log?.error('Failed to render product card', container.error);
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
stopTimer?.();
|
|
161
|
+
this.shadow.innerHTML = '';
|
|
162
|
+
container.value.classList.add(`surf-zone-${this.zoneId}`);
|
|
163
|
+
this.shadow.appendChild(container.value);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
//# sourceMappingURL=Card.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Card.js","sourceRoot":"../@surfside-ads/","sources":["components/Card.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,262 @@
|
|
|
1
|
+
import { CancellationToken, Err, InvalidRecommenderTypeError, TryDoFlat } from '@surfside/ads-core';
|
|
2
|
+
import { CreativeComponent, DEBOUNCE_THRESHOLD, ProductFeedStrategy, RecommenderTypeInputs } from './Creative';
|
|
3
|
+
import { IntValOrThrow } from './SimpleCreative';
|
|
4
|
+
import { DefaultMinCardWidth } from '../Constants';
|
|
5
|
+
import { CreateDebugButton } from './Debug';
|
|
6
|
+
export const NextType = {
|
|
7
|
+
Product: 'product',
|
|
8
|
+
Page: 'page'
|
|
9
|
+
};
|
|
10
|
+
export class SurfsideCarousel extends CreativeComponent {
|
|
11
|
+
_cancellationToken = new CancellationToken();
|
|
12
|
+
_renderDebounce;
|
|
13
|
+
maxItems;
|
|
14
|
+
cardMinWidth = DefaultMinCardWidth;
|
|
15
|
+
cardMaxWidth;
|
|
16
|
+
strategy = ProductFeedStrategy.Hybrid;
|
|
17
|
+
recommend = 'top-products';
|
|
18
|
+
nextType = NextType.Page;
|
|
19
|
+
static get observedAttributes() {
|
|
20
|
+
return [
|
|
21
|
+
...CreativeComponent.observedBaseAttributes,
|
|
22
|
+
'max-items',
|
|
23
|
+
'card-min-width',
|
|
24
|
+
'card-max-width',
|
|
25
|
+
'strategy',
|
|
26
|
+
'recommend',
|
|
27
|
+
'next-type'
|
|
28
|
+
];
|
|
29
|
+
}
|
|
30
|
+
constructor(dependencies) {
|
|
31
|
+
super(dependencies);
|
|
32
|
+
const { logger } = dependencies;
|
|
33
|
+
logger?.info('Building carousel');
|
|
34
|
+
}
|
|
35
|
+
getComponentName() {
|
|
36
|
+
return 'SurfsideCarousel';
|
|
37
|
+
}
|
|
38
|
+
async attributeChangedCallback(name, oldValue, newValue) {
|
|
39
|
+
const log = this.log?.with('attributeChangedCallback');
|
|
40
|
+
log?.info('Carousel attribute changed');
|
|
41
|
+
switch (name) {
|
|
42
|
+
case 'max-items': {
|
|
43
|
+
try {
|
|
44
|
+
this.maxItems = IntValOrThrow(this, 'max-items', newValue);
|
|
45
|
+
}
|
|
46
|
+
catch (err) {
|
|
47
|
+
log?.warn('Failed to parse. Got', err);
|
|
48
|
+
}
|
|
49
|
+
break;
|
|
50
|
+
}
|
|
51
|
+
case 'card-min-width': {
|
|
52
|
+
try {
|
|
53
|
+
this.cardMinWidth = IntValOrThrow(this, 'card-min-width', newValue);
|
|
54
|
+
}
|
|
55
|
+
catch (err) {
|
|
56
|
+
log?.warn('Failed to parse. Got', err);
|
|
57
|
+
}
|
|
58
|
+
break;
|
|
59
|
+
}
|
|
60
|
+
case 'card-max-width': {
|
|
61
|
+
try {
|
|
62
|
+
this.cardMaxWidth = IntValOrThrow(this, 'card-max-width', newValue);
|
|
63
|
+
}
|
|
64
|
+
catch (err) {
|
|
65
|
+
log?.warn('Failed to parse. Got', err);
|
|
66
|
+
}
|
|
67
|
+
break;
|
|
68
|
+
}
|
|
69
|
+
case 'strategy': {
|
|
70
|
+
const strategy = newValue?.toLowerCase();
|
|
71
|
+
switch (strategy) {
|
|
72
|
+
case ProductFeedStrategy.Sponsored:
|
|
73
|
+
case ProductFeedStrategy.Hybrid:
|
|
74
|
+
case ProductFeedStrategy.Recommended:
|
|
75
|
+
this.strategy = strategy;
|
|
76
|
+
break;
|
|
77
|
+
default:
|
|
78
|
+
log?.warn('Unrecognized or null strategy:', newValue);
|
|
79
|
+
break;
|
|
80
|
+
}
|
|
81
|
+
break;
|
|
82
|
+
}
|
|
83
|
+
case 'recommend': {
|
|
84
|
+
const recommend = newValue?.toLowerCase();
|
|
85
|
+
switch (recommend) {
|
|
86
|
+
case RecommenderTypeInputs.TopProducts:
|
|
87
|
+
this.recommend = 'top-products';
|
|
88
|
+
break;
|
|
89
|
+
case RecommenderTypeInputs.ForYou:
|
|
90
|
+
this.recommend = 'for-you';
|
|
91
|
+
break;
|
|
92
|
+
case RecommenderTypeInputs.PastPurchases:
|
|
93
|
+
case RecommenderTypeInputs.BuyAgain:
|
|
94
|
+
this.recommend = 'past-purchases';
|
|
95
|
+
break;
|
|
96
|
+
default:
|
|
97
|
+
log?.warn('Unrecognized or null recommender type:', newValue);
|
|
98
|
+
break;
|
|
99
|
+
}
|
|
100
|
+
break;
|
|
101
|
+
}
|
|
102
|
+
case 'next-type': {
|
|
103
|
+
const nextType = newValue?.toLowerCase();
|
|
104
|
+
switch (nextType) {
|
|
105
|
+
case NextType.Page:
|
|
106
|
+
case NextType.Product:
|
|
107
|
+
this.nextType = nextType;
|
|
108
|
+
break;
|
|
109
|
+
default:
|
|
110
|
+
log?.warn('Unrecognized or null next-type:', newValue);
|
|
111
|
+
break;
|
|
112
|
+
}
|
|
113
|
+
break;
|
|
114
|
+
}
|
|
115
|
+
default: {
|
|
116
|
+
const baseName = name;
|
|
117
|
+
if (CreativeComponent.observedBaseAttributes.includes(baseName)) {
|
|
118
|
+
await super.baseAttributeChangedCallback(baseName, oldValue, newValue, log);
|
|
119
|
+
}
|
|
120
|
+
break;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
const totem = crypto.randomUUID();
|
|
124
|
+
this.totem = totem;
|
|
125
|
+
log?.debug(name, 'totem', totem);
|
|
126
|
+
if (!this.attributesLoaded()) {
|
|
127
|
+
log?.debug('Attributes not ready yet...', this.accountId);
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
else {
|
|
131
|
+
log?.debug('Attributes ready!');
|
|
132
|
+
}
|
|
133
|
+
await this.lazyLoadApi();
|
|
134
|
+
if (this.totem !== totem) {
|
|
135
|
+
log?.debug('Totem changed. Deferring rendering of carousel until last attribute changed', totem, this.totem);
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
if (this.isConnected) {
|
|
139
|
+
log?.debug(`Rendering carousel upon [${name}] changed`);
|
|
140
|
+
await this.render();
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
async connectedCallback() {
|
|
144
|
+
super.connectedCallback();
|
|
145
|
+
const log = this.log?.with('connectedCallback');
|
|
146
|
+
log?.info('connectedCallback');
|
|
147
|
+
super.readBaseAttributes();
|
|
148
|
+
await this.initApi();
|
|
149
|
+
const totem = crypto.randomUUID();
|
|
150
|
+
this.totem = totem;
|
|
151
|
+
if (this.attributesLoaded()) {
|
|
152
|
+
await this.lazyLoadApi();
|
|
153
|
+
if (this.totem !== totem) {
|
|
154
|
+
log?.debug('Attributes changed after connectedCallback, waiting to render');
|
|
155
|
+
return;
|
|
156
|
+
}
|
|
157
|
+
log?.debug('Rendering upon connectedCallback');
|
|
158
|
+
await this.render();
|
|
159
|
+
}
|
|
160
|
+
else {
|
|
161
|
+
this.log?.warn('ConnectedCallback called before attributes were all ready.');
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
disconnectedCallback() {
|
|
165
|
+
super.disconnectedCallback();
|
|
166
|
+
this._cancellationToken.cancel();
|
|
167
|
+
if (this._renderDebounce !== undefined) {
|
|
168
|
+
globalThis.clearTimeout(this._renderDebounce);
|
|
169
|
+
this._renderDebounce = undefined;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
async render() {
|
|
173
|
+
const log = this.log?.with('SurfsideCarousel', { zoneId: this.zoneId });
|
|
174
|
+
log?.info('Rendering carousel');
|
|
175
|
+
if (this._renderDebounce !== undefined) {
|
|
176
|
+
log?.debug('Debounce was not undefined');
|
|
177
|
+
globalThis.clearTimeout(this._renderDebounce);
|
|
178
|
+
}
|
|
179
|
+
this._renderDebounce = globalThis.setTimeout(async () => {
|
|
180
|
+
log?.info('Rendering carousel', this.api);
|
|
181
|
+
const stopTimer = log?.time?.('render carousel');
|
|
182
|
+
this._cancellationToken.cancel();
|
|
183
|
+
const token = new CancellationToken();
|
|
184
|
+
this._cancellationToken = token;
|
|
185
|
+
const { startRequest, defaultNative, buildHybridCarousel, buildSponsoredCarousel, buildRecommendedCarousel, renderCarousel } = this.api;
|
|
186
|
+
const carousel = TryDoFlat(() => {
|
|
187
|
+
log?.debug('Starting request');
|
|
188
|
+
const request = startRequest(this.zoneId)
|
|
189
|
+
.withSurfCategory(this.category)
|
|
190
|
+
.withKeywords(this.keywords)
|
|
191
|
+
.withProductCards(defaultNative())
|
|
192
|
+
.build();
|
|
193
|
+
switch (this.strategy) {
|
|
194
|
+
case ProductFeedStrategy.Hybrid:
|
|
195
|
+
log?.debug('building Hybrid carousel');
|
|
196
|
+
return buildHybridCarousel({
|
|
197
|
+
type: this.recommend
|
|
198
|
+
}, request);
|
|
199
|
+
case ProductFeedStrategy.Sponsored:
|
|
200
|
+
log?.debug('Building sponsored carousel');
|
|
201
|
+
return buildSponsoredCarousel(request);
|
|
202
|
+
case ProductFeedStrategy.Recommended:
|
|
203
|
+
log?.debug('Building recommended carousel');
|
|
204
|
+
return buildRecommendedCarousel({
|
|
205
|
+
type: this.recommend
|
|
206
|
+
}, this.category?.[0]);
|
|
207
|
+
default:
|
|
208
|
+
return Err(new InvalidRecommenderTypeError(this.strategy));
|
|
209
|
+
}
|
|
210
|
+
});
|
|
211
|
+
if (!carousel.ok) {
|
|
212
|
+
log?.error('Failed to build carousel!', carousel.error);
|
|
213
|
+
return;
|
|
214
|
+
}
|
|
215
|
+
log?.info('Rendering carousel');
|
|
216
|
+
const element = await renderCarousel(carousel.value, this.cardMinWidth, this.maxItems === undefined || this.maxItems === 0
|
|
217
|
+
? {
|
|
218
|
+
type: 'infinite'
|
|
219
|
+
}
|
|
220
|
+
: {
|
|
221
|
+
type: 'limited',
|
|
222
|
+
limit: this.maxItems
|
|
223
|
+
}, this.nextType, this.cardMaxWidth);
|
|
224
|
+
log?.info('rendered carousel element');
|
|
225
|
+
if (!element.ok) {
|
|
226
|
+
log?.error(element.error);
|
|
227
|
+
return;
|
|
228
|
+
}
|
|
229
|
+
if (this._cancellationToken.cancelled) {
|
|
230
|
+
log?.info('Cancelled rendering carousel');
|
|
231
|
+
return;
|
|
232
|
+
}
|
|
233
|
+
stopTimer?.();
|
|
234
|
+
element.value.element.classList.add(`surf-zone-${this.zoneId}`);
|
|
235
|
+
this.shadow.innerHTML = '';
|
|
236
|
+
this.shadow.appendChild(element.value.element);
|
|
237
|
+
if (this.isDebug) {
|
|
238
|
+
this.shadow.appendChild(CreateDebugButton('carousels', {
|
|
239
|
+
accountId: this.accountId,
|
|
240
|
+
siteId: this.siteId,
|
|
241
|
+
locationId: this.locationId,
|
|
242
|
+
zoneId: this.zoneId,
|
|
243
|
+
channelId: this.channelId,
|
|
244
|
+
minWidth: this.cardMinWidth.toString(),
|
|
245
|
+
...(this.cardMaxWidth === undefined ? {} : { cardMaxWidth: this.cardMaxWidth.toString() }),
|
|
246
|
+
...(this.maxItems === undefined ? {} : { maxItems: this.maxItems.toString() }),
|
|
247
|
+
recommend: this.recommend,
|
|
248
|
+
nextType: this.nextType,
|
|
249
|
+
strategy: this.strategy,
|
|
250
|
+
}));
|
|
251
|
+
}
|
|
252
|
+
const elementInitRes = await element.value.init();
|
|
253
|
+
if (!elementInitRes.ok) {
|
|
254
|
+
log?.error('Carousel first page was empty', elementInitRes);
|
|
255
|
+
this.remove();
|
|
256
|
+
}
|
|
257
|
+
log?.info('Appended carousel to DOM');
|
|
258
|
+
this.restartEndToEndTimer();
|
|
259
|
+
}, DEBOUNCE_THRESHOLD);
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
//# sourceMappingURL=Carousel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Carousel.js","sourceRoot":"../@surfside-ads/","sources":["components/Carousel.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,iBAAiB,EAEjB,GAAG,EACH,2BAA2B,EAE3B,SAAS,EACZ,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAGH,iBAAiB,EACjB,kBAAkB,EAElB,mBAAmB,EACnB,qBAAqB,EACxB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAE5C,MAAM,CAAC,MAAM,QAAQ,GAAG;IACpB,OAAO,EAAE,SAAS;IAClB,IAAI,EAAE,MAAM;CACN,CAAC;AAaX,MAAM,OAAO,gBAAiB,SAAQ,iBAAiB;IAC3C,kBAAkB,GAAsB,IAAI,iBAAiB,EAAE,CAAC;IAChE,eAAe,CAAa;IAE1B,QAAQ,CAAiB;IACzB,YAAY,GAAW,mBAAmB,CAAC;IAC3C,YAAY,CAAiB;IAE7B,QAAQ,GAAW,mBAAmB,CAAC,MAAM,CAAC;IAC9C,SAAS,GAAoB,cAAc,CAAC;IAC5C,QAAQ,GAAuB,QAAQ,CAAC,IAAI,CAAC;IAEhD,MAAM,KAAK,kBAAkB;QAChC,OAAO;YACH,GAAG,iBAAiB,CAAC,sBAAsB;YAC3C,WAAW;YACX,gBAAgB;YAChB,gBAAgB;YAChB,UAAU;YACV,WAAW;YACX,WAAW;SACd,CAAC;IACN,CAAC;IAED,YACI,YAAoD;QAEpD,KAAK,CAAC,YAAY,CAAC,CAAC;QACpB,MAAM,EAAE,MAAM,EAAE,GAAG,YAAY,CAAC;QAChC,MAAM,EAAE,IAAI,CAAC,mBAAmB,CAAC,CAAC;IACtC,CAAC;IAES,gBAAgB;QACtB,OAAO,kBAAkB,CAAC;IAC9B,CAAC;IAEM,KAAK,CAAC,wBAAwB,CACjC,IAAY,EACZ,QAAuB,EACvB,QAAuB;QAEvB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,0BAA0B,CAAC,CAAC;QACvD,GAAG,EAAE,IAAI,CAAC,4BAA4B,CAAC,CAAC;QACxC,QAAQ,IAAI,EAAE,CAAC;YACX,KAAK,WAAW,CAAC,CAAC,CAAC;gBACf,IAAI,CAAC;oBACD,IAAI,CAAC,QAAQ,GAAG,aAAa,CAAC,IAAI,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC;gBAC/D,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACX,GAAG,EAAE,IAAI,CAAC,sBAAsB,EAAE,GAAG,CAAC,CAAC;gBAC3C,CAAC;gBACD,MAAM;YACV,CAAC;YACD,KAAK,gBAAgB,CAAC,CAAC,CAAC;gBACpB,IAAI,CAAC;oBACD,IAAI,CAAC,YAAY,GAAG,aAAa,CAAC,IAAI,EAAE,gBAAgB,EAAE,QAAQ,CAAC,CAAC;gBACxE,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACX,GAAG,EAAE,IAAI,CAAC,sBAAsB,EAAE,GAAG,CAAC,CAAC;gBAC3C,CAAC;gBACD,MAAM;YACV,CAAC;YACD,KAAK,gBAAgB,CAAC,CAAC,CAAC;gBACpB,IAAI,CAAC;oBACD,IAAI,CAAC,YAAY,GAAG,aAAa,CAAC,IAAI,EAAE,gBAAgB,EAAE,QAAQ,CAAC,CAAC;gBACxE,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACX,GAAG,EAAE,IAAI,CAAC,sBAAsB,EAAE,GAAG,CAAC,CAAC;gBAC3C,CAAC;gBACD,MAAM;YACV,CAAC;YACD,KAAK,UAAU,CAAC,CAAC,CAAC;gBACd,MAAM,QAAQ,GAAG,QAAQ,EAAE,WAAW,EAAE,CAAC;gBACzC,QAAQ,QAAQ,EAAE,CAAC;oBACf,KAAK,mBAAmB,CAAC,SAAS,CAAC;oBACnC,KAAK,mBAAmB,CAAC,MAAM,CAAC;oBAChC,KAAK,mBAAmB,CAAC,WAAW;wBAChC,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;wBACzB,MAAM;oBACV;wBACI,GAAG,EAAE,IAAI,CAAC,gCAAgC,EAAE,QAAQ,CAAC,CAAC;wBACtD,MAAM;gBACd,CAAC;gBACD,MAAM;YACV,CAAC;YACD,KAAK,WAAW,CAAC,CAAC,CAAC;gBACf,MAAM,SAAS,GAAG,QAAQ,EAAE,WAAW,EAAE,CAAC;gBAC1C,QAAQ,SAAS,EAAE,CAAC;oBAChB,KAAK,qBAAqB,CAAC,WAAW;wBAClC,IAAI,CAAC,SAAS,GAAG,cAAc,CAAC;wBAChC,MAAM;oBACV,KAAK,qBAAqB,CAAC,MAAM;wBAC7B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;wBAC3B,MAAM;oBACV,KAAK,qBAAqB,CAAC,aAAa,CAAC;oBACzC,KAAK,qBAAqB,CAAC,QAAQ;wBAC/B,IAAI,CAAC,SAAS,GAAG,gBAAgB,CAAC;wBAClC,MAAM;oBACV;wBACI,GAAG,EAAE,IAAI,CAAC,wCAAwC,EAAE,QAAQ,CAAC,CAAC;wBAC9D,MAAM;gBACd,CAAC;gBACD,MAAM;YACV,CAAC;YACD,KAAK,WAAW,CAAC,CAAC,CAAC;gBACf,MAAM,QAAQ,GAAG,QAAQ,EAAE,WAAW,EAAE,CAAC;gBACzC,QAAQ,QAAQ,EAAE,CAAC;oBACf,KAAK,QAAQ,CAAC,IAAI,CAAC;oBACnB,KAAK,QAAQ,CAAC,OAAO;wBACjB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;wBACzB,MAAM;oBACV;wBACI,GAAG,EAAE,IAAI,CAAC,iCAAiC,EAAE,QAAQ,CAAC,CAAC;wBACvD,MAAM;gBACd,CAAC;gBACD,MAAM;YACV,CAAC;YACD,OAAO,CAAC,CAAC,CAAC;gBACN,MAAM,QAAQ,GAAG,IAA0B,CAAC;gBAC5C,IAAI,iBAAiB,CAAC,sBAAsB,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;oBAC9D,MAAM,KAAK,CAAC,4BAA4B,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC;gBAChF,CAAC;gBACD,MAAM;YACV,CAAC;QACL,CAAC;QAED,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC;QAClC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,GAAG,EAAE,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;QACjC,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,EAAE,CAAC;YAC3B,GAAG,EAAE,KAAK,CAAC,6BAA6B,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;YAC1D,OAAO;QACX,CAAC;aAAM,CAAC;YACJ,GAAG,EAAE,KAAK,CAAC,mBAAmB,CAAC,CAAC;QACpC,CAAC;QACD,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QACzB,IAAI,IAAI,CAAC,KAAK,KAAK,KAAK,EAAE,CAAC;YACvB,GAAG,EAAE,KAAK,CACN,6EAA6E,EAC7E,KAAK,EACL,IAAI,CAAC,KAAK,CACb,CAAC;YACF,OAAO;QACX,CAAC;QACD,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACnB,GAAG,EAAE,KAAK,CAAC,4BAA4B,IAAI,WAAW,CAAC,CAAC;YACxD,MAAO,IAA2C,CAAC,MAAM,EAAE,CAAC;QAChE,CAAC;IACL,CAAC;IAEM,KAAK,CAAC,iBAAiB;QAC1B,KAAK,CAAC,iBAAiB,EAAE,CAAC;QAC1B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,mBAAmB,CAAC,CAAC;QAChD,GAAG,EAAE,IAAI,CAAC,mBAAmB,CAAC,CAAC;QAC/B,KAAK,CAAC,kBAAkB,EAAE,CAAC;QAC3B,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;QACrB,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC;QAClC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,IAAI,CAAC,gBAAgB,EAAE,EAAE,CAAC;YAC1B,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;YACzB,IAAI,IAAI,CAAC,KAAK,KAAK,KAAK,EAAE,CAAC;gBACvB,GAAG,EAAE,KAAK,CAAC,+DAA+D,CAAC,CAAC;gBAC5E,OAAO;YACX,CAAC;YACD,GAAG,EAAE,KAAK,CAAC,kCAAkC,CAAC,CAAC;YAC/C,MAAO,IAA2C,CAAC,MAAM,EAAE,CAAC;QAChE,CAAC;aAAM,CAAC;YACJ,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,4DAA4D,CAAC,CAAC;QACjF,CAAC;IACL,CAAC;IAEM,oBAAoB;QACvB,KAAK,CAAC,oBAAoB,EAAE,CAAC;QAC7B,IAAI,CAAC,kBAAkB,CAAC,MAAM,EAAE,CAAC;QACjC,IAAI,IAAI,CAAC,eAAe,KAAK,SAAS,EAAE,CAAC;YACrC,UAAU,CAAC,YAAY,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;YAC9C,IAAI,CAAC,eAAe,GAAG,SAAS,CAAC;QACrC,CAAC;IACL,CAAC;IAEM,KAAK,CAAC,MAAM;QACf,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,kBAAkB,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;QACxE,GAAG,EAAE,IAAI,CAAC,oBAAoB,CAAC,CAAC;QAChC,IAAI,IAAI,CAAC,eAAe,KAAK,SAAS,EAAE,CAAC;YACrC,GAAG,EAAE,KAAK,CAAC,4BAA4B,CAAC,CAAC;YACzC,UAAU,CAAC,YAAY,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QAClD,CAAC;QACD,IAAI,CAAC,eAAe,GAAG,UAAU,CAAC,UAAU,CAAC,KAAK,IAAI,EAAE;YACpD,GAAG,EAAE,IAAI,CAAC,oBAAoB,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;YAC1C,MAAM,SAAS,GAAG,GAAG,EAAE,IAAI,EAAE,CAAC,iBAAiB,CAAC,CAAC;YACjD,IAAI,CAAC,kBAAkB,CAAC,MAAM,EAAE,CAAC;YACjC,MAAM,KAAK,GAAG,IAAI,iBAAiB,EAAE,CAAC;YACtC,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC;YAEhC,MAAM,EACF,YAAY,EACZ,aAAa,EACb,mBAAmB,EACnB,sBAAsB,EACtB,wBAAwB,EACxB,cAAc,EACjB,GAAG,IAAI,CAAC,GAAG,CAAC;YAEb,MAAM,QAAQ,GAAG,SAAS,CAAC,GAAG,EAAE;gBAC5B,GAAG,EAAE,KAAK,CAAC,kBAAkB,CAAC,CAAC;gBAC/B,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC;qBACpC,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC;qBAC/B,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC;qBAC3B,gBAAgB,CAAC,aAAa,EAAE,CAAC;qBACjC,KAAK,EAAE,CAAC;gBACb,QAAQ,IAAI,CAAC,QAAQ,EAAE,CAAC;oBACpB,KAAK,mBAAmB,CAAC,MAAM;wBAC3B,GAAG,EAAE,KAAK,CAAC,0BAA0B,CAAC,CAAC;wBACvC,OAAO,mBAAmB,CAAC;4BACvB,IAAI,EAAE,IAAI,CAAC,SAAS;yBACvB,EAAE,OAAO,CAAC,CAAC;oBAChB,KAAK,mBAAmB,CAAC,SAAS;wBAC9B,GAAG,EAAE,KAAK,CAAC,6BAA6B,CAAC,CAAC;wBAC1C,OAAO,sBAAsB,CAAC,OAAO,CAAC,CAAC;oBAC3C,KAAK,mBAAmB,CAAC,WAAW;wBAChC,GAAG,EAAE,KAAK,CAAC,+BAA+B,CAAC,CAAC;wBAC5C,OAAO,wBAAwB,CAAC;4BAC5B,IAAI,EAAE,IAAI,CAAC,SAAS;yBACvB,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;oBAC3B;wBACI,OAAO,GAAG,CAAC,IAAI,2BAA2B,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;gBACnE,CAAC;YACL,CAAC,CAAC,CAAC;YACH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACf,GAAG,EAAE,KAAK,CAAC,2BAA2B,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC;gBACxD,OAAO;YACX,CAAC;YACD,GAAG,EAAE,IAAI,CAAC,oBAAoB,CAAC,CAAC;YAChC,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,YAAY,EAClE,IAAI,CAAC,QAAQ,KAAK,SAAS,IAAI,IAAI,CAAC,QAAQ,KAAK,CAAC;gBAC9C,CAAC,CAAC;oBACE,IAAI,EAAE,UAAU;iBACnB;gBACD,CAAC,CAAC;oBACE,IAAI,EAAE,SAAS;oBACf,KAAK,EAAE,IAAI,CAAC,QAAQ;iBACvB,EACL,IAAI,CAAC,QAAQ,EACb,IAAI,CAAC,YAAY,CACpB,CAAC;YACF,GAAG,EAAE,IAAI,CAAC,2BAA2B,CAAC,CAAC;YAEvC,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC;gBACd,GAAG,EAAE,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;gBAC1B,OAAO;YACX,CAAC;YACD,IAAI,IAAI,CAAC,kBAAkB,CAAC,SAAS,EAAE,CAAC;gBACpC,GAAG,EAAE,IAAI,CAAC,8BAA8B,CAAC,CAAC;gBAC1C,OAAO;YACX,CAAC;YAED,SAAS,EAAE,EAAE,CAAC;YACd,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,aAAa,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;YAEhE,IAAI,CAAC,MAAM,CAAC,SAAS,GAAG,EAAE,CAAC;YAC3B,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAC/C,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;gBACf,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,iBAAiB,CAAC,WAAW,EAAE;oBACnD,SAAS,EAAE,IAAI,CAAC,SAAS;oBACzB,MAAM,EAAE,IAAI,CAAC,MAAM;oBACnB,UAAU,EAAE,IAAI,CAAC,UAAU;oBAC3B,MAAM,EAAE,IAAI,CAAC,MAAM;oBACnB,SAAS,EAAE,IAAI,CAAC,SAAS;oBACzB,QAAQ,EAAE,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE;oBACtC,GAAG,CAAC,IAAI,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,EAAE,CAAC;oBAC1F,GAAG,CAAC,IAAI,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,EAAE,CAAC;oBAC9E,SAAS,EAAE,IAAI,CAAC,SAAS;oBACzB,QAAQ,EAAE,IAAI,CAAC,QAAQ;oBACvB,QAAQ,EAAE,IAAI,CAAC,QAAQ;iBAC1B,CAAC,CAAC,CAAC;YACR,CAAC;YACD,MAAM,cAAc,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;YAClD,IAAI,CAAC,cAAc,CAAC,EAAE,EAAE,CAAC;gBACrB,GAAG,EAAE,KAAK,CAAC,+BAA+B,EAAE,cAAc,CAAC,CAAC;gBAC5D,IAAI,CAAC,MAAM,EAAE,CAAC;YAClB,CAAC;YACD,GAAG,EAAE,IAAI,CAAC,0BAA0B,CAAC,CAAC;YACtC,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAChC,CAAC,EACD,kBAAkB,CACjB,CAAC;IACN,CAAC;CACJ"}
|