@betarena/ad-engine 0.0.51 → 0.0.55

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.
@@ -42,23 +42,25 @@
42
42
 
43
43
  // import '@fontsource/roboto';
44
44
 
45
- import { betarenaEndpoint } from './constants/instance.js';
45
+ import { removeNull } from '@betarena/scores-lib/dist/functions/func.common.js';
46
46
  import { betarenaAdEngineStore } from './_store.js';
47
- import { postMod } from './utils/fetch.js';
47
+ import { betarenaEndpoint } from './constants/instance.js';
48
+ import { storeSession } from './store/session.js';
49
+ import { logger } from './utils/debug.js';
48
50
  import { detectDeviceType } from './utils/device.js';
51
+ import { postMod } from './utils/fetch.js';
49
52
  import { getUserLocation } from './utils/geo.js';
50
- import { removeNull } from '@betarena/scores-lib/dist/functions/func.common.js';
51
- import { storeSession } from './store/session.js';
52
53
 
53
- import WidgetAdvertSlide from './Advert-Slide-Child.svelte';
54
54
  import WidgetAdGeneral from './Advert-General-Child.svelte';
55
+ import AdvertInterScrollerChild from './Advert-InterScroller-Child.svelte';
56
+ import WidgetAdvertSlide from './Advert-Slide-Child.svelte';
55
57
  import DevInfoBox from './misc/admin/Dev-Info-Box.svelte';
56
58
 
57
59
  import '../style/app.scss';
58
60
 
61
+ import type { AdsCreativeMain } from '@betarena/scores-lib/types/_AUTO-HASURA_.js';
59
62
  import type { IAdsRequestBody, IAdsResponseBody } from '@betarena/scores-lib/types/ad-engine/index.js';
60
63
  import type { GeoJsResponse } from './types/geojs.js';
61
- import type { AdsCreativeMain } from '@betarena/scores-lib/types/_AUTO-HASURA_.js';
62
64
 
63
65
  // #endregion ➤ 📦 Package Imports
64
66
 
@@ -126,12 +128,12 @@
126
128
  * @description
127
129
  * 📝 `Map` where, `key=ZoneId` and `value=HTMLElement`
128
130
  */
129
- betarenaAdsInjectMap: Map < number, Element > = new Map(),
131
+ mapBetarenaAdvertStandardElement = new Map < number, Element > (),
130
132
  /**
131
133
  * @description
132
- * 📝 temporary data
134
+ * 📝 `Map` where, `key=CreativeId` and `value=AdvertObject` (temporary)
133
135
  */
134
- creativeDataMap: Map < number, AdsCreativeMain > = new Map()
136
+ mapCreative = new Map < number, AdsCreativeMain > ()
135
137
  ;
136
138
 
137
139
  // #endregion ➤ 📌 VARIABLES
@@ -166,13 +168,22 @@
166
168
  * @description
167
169
  * 📝 `List` of `HTMLElements` identified on `page` for a target `zone`.
168
170
  */
169
- htmlElementList = document.querySelectorAll('[data-betarena-zone-id]')
171
+ listElementTarget = document.querySelectorAll('[data-betarena-zone-id]')
170
172
  ;
171
173
 
174
+ // [🐞]
175
+ logger
176
+ (
177
+ [
178
+ '🚏 checkpoint ➤ generateElementMap(..) // START',
179
+ `🔹 [var] ➤ listElementTarget.length ${listElementTarget.length}`
180
+ ]
181
+ );
182
+
172
183
  // ╭─────
173
- // │ NOTE: |:| loop over elements detected as betarena elegible ads
184
+ // │ NOTE: |:| loop over elements detected as betarena elegible ads (global/outer)
174
185
  // ╰─────
175
- for (const elem of htmlElementList)
186
+ for (const elem of listElementTarget)
176
187
  {
177
188
  const
178
189
  /**
@@ -184,7 +195,7 @@
184
195
 
185
196
  if (!value) continue;
186
197
 
187
- betarenaAdsInjectMap.set(parseInt(value), elem);
198
+ mapBetarenaAdvertStandardElement.set(parseInt(value), elem);
188
199
  }
189
200
 
190
201
  return
@@ -226,39 +237,47 @@
226
237
  ;
227
238
 
228
239
  // [🐞]
229
- console.log('response', response);
240
+ logger
241
+ (
242
+ [
243
+ '🚏 checkpoint ➤ injectBetarenaAds(..) // START',
244
+ `🔹 [var] ➤ response ${JSON.stringify(response)}`
245
+ ]
246
+ );
230
247
 
231
- creativeDataMap = new Map((response as IAdsResponseBody).ads ?? []);
248
+ mapCreative = new Map((response as IAdsResponseBody).ads ?? []);
232
249
 
233
250
  const
234
251
  /**
235
252
  * @description
236
- * 📝 `Map`
253
+ * 📝 `Map` where, `key=ZoneId` and `value=listCampaignId`
237
254
  */
238
255
  mapZoneIdToCampaignId = new Map ((response as IAdsResponseBody).mapZoneIdToCampaignId),
239
256
  /**
240
257
  * @description
241
- * 📝 `Map`
258
+ * 📝 `Map` where, `key=CampaignId` and `value=listCreativeId`
242
259
  */
243
260
  mapCampaignIdToCreativeId = new Map ((response as IAdsResponseBody).mapCampaignIdToCreativeId),
244
261
  /**
245
262
  * @description
246
- * 📝 `Map`
263
+ * 📝 `Map` where, `key=ZoneId` and `value=listAuthorId`
247
264
  */
248
265
  mapZoneToAuthorIds = new Map ((response as IAdsResponseBody).mapZoneIdToAuthorIds),
249
266
  /**
250
267
  * @description
251
- * 📝 `Map`
268
+ * 📝 `Map` where, `key=ZoneId` and `value=listTagId`
252
269
  */
253
270
  mapZoneToTagIds = new Map ((response as IAdsResponseBody).mapZoneIdToTagIds)
254
271
  ;
255
272
 
256
273
  // ╭─────
257
274
  // │ NOTE:
258
- // │ ➤ [1] loop over retrieved/fetched elements, and
259
- // │ ➤ [2] inject target `ads` in specific locations
275
+ // │ ➤ [1] loop over retrieved/fetched elements identified in 'document',
276
+ // │ ➤ [2] and inject target 'ADVERTS' in target specific locations.
277
+ // ┣─────
278
+ // ┃ ZONE-ID :: 1,2,3
260
279
  // ╰─────
261
- for (const [zoneId, element] of betarenaAdsInjectMap)
280
+ for (const [zoneId, element] of mapBetarenaAdvertStandardElement)
262
281
  {
263
282
  if (!geoLocation) continue;
264
283
 
@@ -276,55 +295,100 @@
276
295
  creativeAdData
277
296
  = removeNull
278
297
  (
279
- campaignIds.map
280
- (
281
- x =>
282
- {
283
- if (mapCampaignIdToCreativeId.has(x))
298
+ campaignIds
299
+ // ╭─────
300
+ // │ NOTE:
301
+ // │ |: Filter out `campaign ids` that have no `creative ids`
302
+ // ╰─────
303
+ .filter
304
+ (
305
+ x =>
284
306
  {
285
- const
286
- /**
287
- * @description
288
- * 📝 **creative ids**
289
- */
290
- creativeIds = mapCampaignIdToCreativeId.get(x)!
307
+ if (mapCampaignIdToCreativeId.has(x))
308
+ return true;
291
309
  ;
292
-
293
- for (const creativeId of creativeIds)
310
+ return false;
311
+ }
312
+ )
313
+ // ╭─────
314
+ // │ NOTE:
315
+ // │ |: Map over `campaign ids` and return `creative data`
316
+ // ╰─────
317
+ .map
318
+ (
319
+ x =>
320
+ {
321
+ // ╭─────
322
+ // │ NOTE:
323
+ // │ |: Loop over creative data and inject adverts
324
+ // ╰─────
325
+ for (const creativeId of mapCampaignIdToCreativeId.get(x)!)
294
326
  {
295
- if (creativeDataMap.has(creativeId))
296
- return creativeDataMap.get(creativeId);
327
+ if (mapCreative.has(creativeId))
328
+ return mapCreative.get(creativeId);
297
329
  ;
298
330
  }
299
331
  }
300
- }
301
- )
332
+ )
302
333
  ) as AdsCreativeMain[]
303
334
  ;
304
335
 
305
336
  // [🐞]
306
- // console.log('creativeAdData', creativeAdData);
307
-
308
- for (const adData of (creativeAdData ?? []))
337
+ logger
338
+ (
339
+ [
340
+ `🔹 [var] ➤ creativeAdData.length ${creativeAdData.length}`
341
+ ]
342
+ );
343
+
344
+ // ╭─────
345
+ // │ NOTE:
346
+ // │ |: Loop over creative data and inject adverts
347
+ // ╰─────
348
+ if (zoneId == 1)
309
349
  {
310
- new WidgetAdGeneral
311
- (
312
- {
313
- target: element,
314
- props:
350
+ for (const adData of (creativeAdData ?? []))
351
+ new WidgetAdGeneral
352
+ (
315
353
  {
316
- adData
354
+ target: element,
355
+ props:
356
+ {
357
+ adData
358
+ }
317
359
  }
318
- }
319
- );
360
+ );
361
+ ;
362
+ }
363
+ else if (zoneId == 2 || zoneId == 3)
364
+ {
365
+ for (const adData of (creativeAdData ?? []))
366
+ new AdvertInterScrollerChild
367
+ (
368
+ {
369
+ target: element,
370
+ props:
371
+ {
372
+ instanceNode: element,
373
+ objectAdverData: adData
374
+ }
375
+ }
376
+ );
377
+ ;
320
378
  }
321
379
  }
322
380
 
323
381
  // ╭─────
324
- // │ CHECK |:| for injection of 'global' placements ads (based on global page data)
382
+ // │ CHECK
383
+ // │ |: for case of injection of 'GLOBAL' placements for adverts,
384
+ // │ |: (a.k.a slider / popup ads)
325
385
  // ╰─────
326
386
  if (authorId || authorArticleTagIds.length > 0)
327
387
  {
388
+ // ╭─────
389
+ // │ NOTE:
390
+ // │ |: Loop over creative data and inject adverts
391
+ // ╰─────
328
392
  for (const [zoneId, authorIds] of mapZoneToAuthorIds)
329
393
  {
330
394
  if (!authorId || (authorIds.length > 0 && !authorIds.includes(authorId)))
@@ -361,8 +425,8 @@
361
425
 
362
426
  for (const creativeId of creativeIds)
363
427
  {
364
- if (creativeDataMap.has(creativeId))
365
- return creativeDataMap.get(creativeId);
428
+ if (mapCreative.has(creativeId))
429
+ return mapCreative.get(creativeId);
366
430
  ;
367
431
  }
368
432
  }
@@ -372,10 +436,19 @@
372
436
  ;
373
437
 
374
438
  // [🐞]
375
- console.log('creativeAdData-HERE1', creativeAdData);
439
+ logger
440
+ (
441
+ [
442
+ '🚏 checkpoint ➤ injectBetarenaAds(..) // CHECKPOINT-1',
443
+ `🔹 [var] ➤ creativeAdData ${creativeAdData.length}`
444
+ ]
445
+ );
376
446
 
447
+ // ╭─────
448
+ // │ NOTE:
449
+ // │ |: Loop over creative data and inject adverts
450
+ // ╰─────
377
451
  for (const adData of creativeAdData)
378
- {
379
452
  new WidgetAdvertSlide
380
453
  (
381
454
  {
@@ -386,9 +459,13 @@
386
459
  }
387
460
  }
388
461
  );
389
- }
462
+ ;
390
463
  }
391
464
 
465
+ // ╭─────
466
+ // │ NOTE:
467
+ // │ |: Loop over creative data and inject adverts
468
+ // ╰─────
392
469
  for (const [zoneId, tagIds] of mapZoneToTagIds)
393
470
  {
394
471
  if (tagIds.length > 0 && authorArticleTagIds.filter(x => { return tagIds.includes(x) } ).length == 0)
@@ -425,8 +502,8 @@
425
502
 
426
503
  for (const creativeId of creativeIds)
427
504
  {
428
- if (creativeDataMap.has(creativeId))
429
- return creativeDataMap.get(creativeId);
505
+ if (mapCreative.has(creativeId))
506
+ return mapCreative.get(creativeId);
430
507
  ;
431
508
  }
432
509
  }
@@ -436,10 +513,19 @@
436
513
  ;
437
514
 
438
515
  // [🐞]
439
- console.log('creativeAdData-HERE2', creativeAdData);
516
+ logger
517
+ (
518
+ [
519
+ '🚏 checkpoint ➤ injectBetarenaAds(..) // CHECKPOINT-2',
520
+ `🔹 [var] ➤ creativeAdData ${creativeAdData.length}`
521
+ ]
522
+ );
440
523
 
524
+ // ╭─────
525
+ // │ NOTE:
526
+ // │ |: Loop over creative data and inject adverts
527
+ // ╰─────
441
528
  for (const adData of creativeAdData)
442
- {
443
529
  new WidgetAdvertSlide
444
530
  (
445
531
  {
@@ -450,16 +536,26 @@
450
536
  }
451
537
  }
452
538
  );
453
- }
539
+ ;
454
540
  }
455
541
  }
456
542
  // ╭─────
457
- // │ CHECK |:| for case where no author or tag ids are present (global ads), but the ads are still fetched
543
+ // │ CHECK
544
+ // │ |: otherwise, case where (1) no authorId or (2) tagIds are present (global ads),
545
+ // │ |: but data for ads was still fetched (a.k.a Data was RETRIVED/HIT)
458
546
  // ╰─────
459
547
  else
460
548
  {
461
- for (const [adId, adData] of creativeDataMap)
462
- {
549
+ // [🐞]
550
+ logger
551
+ (
552
+ [
553
+ '🚏 checkpoint ➤ injectBetarenaAds(..) // CHECKPOINT-3',
554
+ `🔹 [var] ➤ mapCreative.length ${mapCreative.size}`
555
+ ]
556
+ );
557
+
558
+ for (const [, adData] of mapCreative)
463
559
  new WidgetAdvertSlide
464
560
  (
465
561
  {
@@ -470,7 +566,7 @@
470
566
  }
471
567
  }
472
568
  );
473
- }
569
+ ;
474
570
  }
475
571
 
476
572
  return;
@@ -494,17 +590,25 @@
494
590
  generateElementMap();
495
591
 
496
592
  // [🐞]
497
- // console.log('elements', betarenaAdsInjectMap);
498
- // console.log('elements', zoneIds);
593
+ logger
594
+ (
595
+ [
596
+ '🚏 checkpoint ➤ initialize(..) // START',
597
+ `🔹 [var] ➤ mapBetarenaAdvertStandardElement.size ${mapBetarenaAdvertStandardElement.size}`
598
+ // `🔹 [var] ➤ zoneIds ${JSON.stringify(zoneIds)}`
599
+ ]
600
+ );
499
601
 
500
602
  injectBetarenaAds
501
603
  (
502
604
  {
503
605
  deviceType,
504
- isoCountryCode: geoLocation?.country_code ?? 'EN',
606
+ // deviceType: 'mobile',
607
+ isoCountryCode: geoLocation.country_code ?? 'EN',
608
+ // isoCountryCode: 'BR',
505
609
  authorId,
506
610
  tagIds: authorArticleTagIds,
507
- zoneIds: [...betarenaAdsInjectMap.keys()]
611
+ zoneIds: [...mapBetarenaAdvertStandardElement.keys()]
508
612
  }
509
613
  );
510
614
 
@@ -527,7 +631,11 @@
527
631
  async () =>
528
632
  {
529
633
  betarenaAdEngineStore.useLocalStorage();
530
- await initialize();
634
+ // ╭─────
635
+ // │ NOTE:
636
+ // │ |: Delay initialization to ensure all elements are loaded on page
637
+ // ╰─────
638
+ setTimeout(() => { initialize(); return; }, 1000);
531
639
  return;
532
640
  }
533
641
  );
@@ -564,14 +672,14 @@
564
672
  ╰──────────────────────────────────────────────────────────────────────────────────╯
565
673
  -->
566
674
 
567
- {#if import.meta.env.DEV}
675
+ {#if false}
568
676
  <!--
569
677
  ╭─────
570
678
  │ [🐞]
571
679
  │ ➤ Testing Configuration(s)
572
680
  ╰─────
573
681
  -->
574
- <!-- <DevInfoBox>
682
+ <DevInfoBox>
575
683
  <p>
576
684
  [detected] Device Type :|: {deviceType}
577
685
  </p>
@@ -579,7 +687,7 @@
579
687
  [detected] Geo-Location :|: {geoLocation?.country_code}
580
688
  </p>
581
689
  <p>
582
- [detected] Page Advert Snippets Number :|: {betarenaAdsInjectMap.size}
690
+ [detected] Page Advert Snippets Number :|: {mapBetarenaAdvertStandardElement.size}
583
691
  </p>
584
692
  <p>
585
693
  [properties] AuthorId :|: {authorId}
@@ -588,9 +696,9 @@
588
696
  [properties] AuthorArticleTagIds :|: [{authorArticleTagIds}]
589
697
  </p>
590
698
  <p>
591
- [data] Adverts Fetched Number :|: {creativeDataMap.size}
699
+ [data] Adverts Fetched Number :|: {mapCreative.size}
592
700
  </p>
593
- </DevInfoBox> -->
701
+ </DevInfoBox>
594
702
 
595
703
  <!--
596
704
  ╭─────
@@ -598,17 +706,247 @@
598
706
  │ ➤ Testing Advert(s)
599
707
  ╰─────
600
708
  -->
601
- <!--
602
- <div
709
+ <!-- <div
603
710
  data-betarena-zone-id=1
604
711
  >
605
- </div>
712
+ </div> -->
606
713
 
607
714
  <hr>
608
715
 
609
716
  <div
610
717
  data-betarena-zone-id=2
611
718
  >
719
+ <p>
720
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
721
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
722
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
723
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
724
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
725
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
726
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
727
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
728
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
729
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
730
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
731
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
732
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
733
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
734
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
735
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
736
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
737
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
738
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
739
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
740
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
741
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
742
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
743
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
744
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
745
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
746
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
747
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
748
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
749
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
750
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
751
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
752
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
753
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
754
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
755
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
756
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
757
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
758
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
759
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
760
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
761
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
762
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
763
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
764
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
765
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
766
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
767
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
768
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
769
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
770
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
771
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
772
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
773
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
774
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
775
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
776
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
777
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
778
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
779
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
780
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
781
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
782
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
783
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
784
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
785
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
786
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
787
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
788
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
789
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
790
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
791
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
792
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
793
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
794
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
795
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
796
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
797
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
798
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
799
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
800
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
801
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
802
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
803
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
804
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
805
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
806
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
807
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
808
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
809
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
810
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
811
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
812
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
813
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
814
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
815
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
816
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
817
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
818
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
819
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
820
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
821
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
822
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
823
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
824
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
825
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
826
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
827
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
828
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
829
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
830
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
831
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
832
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
833
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
834
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
835
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
836
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
837
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
838
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
839
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
840
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
841
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
842
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
843
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
844
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
845
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
846
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
847
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
848
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
849
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
850
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
851
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
852
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
853
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
854
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
855
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
856
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
857
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
858
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
859
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
860
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
861
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
862
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
863
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
864
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
865
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
866
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
867
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
868
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
869
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
870
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
871
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
872
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
873
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
874
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
875
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
876
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
877
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
878
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
879
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
880
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
881
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
882
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
883
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
884
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
885
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
886
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
887
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
888
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
889
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
890
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
891
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
892
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
893
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
894
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
895
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
896
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
897
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
898
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
899
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
900
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
901
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
902
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
903
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
904
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
905
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
906
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
907
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
908
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
909
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
910
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
911
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
912
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
913
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
914
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
915
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
916
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
917
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
918
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
919
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
920
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
921
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
922
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
923
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
924
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
925
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
926
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
927
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
928
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
929
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
930
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
931
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
932
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
933
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
934
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
935
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
936
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
937
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
938
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
939
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
940
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
941
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
942
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
943
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
944
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
945
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
946
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
947
+ </p>
948
+ <p>
949
+ Loren ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec purus feugiat, vestibulum mi id,
950
+ </p>
612
951
  </div>
613
- -->
614
952
  {/if}