@onlineapps/conn-base-storage 1.0.1 → 1.0.3

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.
@@ -23,30 +23,30 @@
23
23
  <div class='clearfix'>
24
24
 
25
25
  <div class='fl pad1y space-right2'>
26
- <span class="strong">77.7% </span>
26
+ <span class="strong">74.35% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>122/157</span>
28
+ <span class='fraction'>116/156</span>
29
29
  </div>
30
30
 
31
31
 
32
32
  <div class='fl pad1y space-right2'>
33
- <span class="strong">82.1% </span>
33
+ <span class="strong">67.18% </span>
34
34
  <span class="quiet">Branches</span>
35
- <span class='fraction'>78/95</span>
35
+ <span class='fraction'>43/64</span>
36
36
  </div>
37
37
 
38
38
 
39
39
  <div class='fl pad1y space-right2'>
40
- <span class="strong">76.92% </span>
40
+ <span class="strong">74.07% </span>
41
41
  <span class="quiet">Functions</span>
42
- <span class='fraction'>20/26</span>
42
+ <span class='fraction'>20/27</span>
43
43
  </div>
44
44
 
45
45
 
46
46
  <div class='fl pad1y space-right2'>
47
- <span class="strong">78.06% </span>
47
+ <span class="strong">75.16% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>121/155</span>
49
+ <span class='fraction'>115/153</span>
50
50
  </div>
51
51
 
52
52
 
@@ -561,9 +561,350 @@
561
561
  <a name='L496'></a><a href='#L496'>496</a>
562
562
  <a name='L497'></a><a href='#L497'>497</a>
563
563
  <a name='L498'></a><a href='#L498'>498</a>
564
- <a name='L499'></a><a href='#L499'>499</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">5x</span>
565
- <span class="cline-any cline-yes">5x</span>
566
- <span class="cline-any cline-yes">5x</span>
564
+ <a name='L499'></a><a href='#L499'>499</a>
565
+ <a name='L500'></a><a href='#L500'>500</a>
566
+ <a name='L501'></a><a href='#L501'>501</a>
567
+ <a name='L502'></a><a href='#L502'>502</a>
568
+ <a name='L503'></a><a href='#L503'>503</a>
569
+ <a name='L504'></a><a href='#L504'>504</a>
570
+ <a name='L505'></a><a href='#L505'>505</a>
571
+ <a name='L506'></a><a href='#L506'>506</a>
572
+ <a name='L507'></a><a href='#L507'>507</a>
573
+ <a name='L508'></a><a href='#L508'>508</a>
574
+ <a name='L509'></a><a href='#L509'>509</a>
575
+ <a name='L510'></a><a href='#L510'>510</a>
576
+ <a name='L511'></a><a href='#L511'>511</a>
577
+ <a name='L512'></a><a href='#L512'>512</a>
578
+ <a name='L513'></a><a href='#L513'>513</a>
579
+ <a name='L514'></a><a href='#L514'>514</a>
580
+ <a name='L515'></a><a href='#L515'>515</a>
581
+ <a name='L516'></a><a href='#L516'>516</a>
582
+ <a name='L517'></a><a href='#L517'>517</a>
583
+ <a name='L518'></a><a href='#L518'>518</a>
584
+ <a name='L519'></a><a href='#L519'>519</a>
585
+ <a name='L520'></a><a href='#L520'>520</a>
586
+ <a name='L521'></a><a href='#L521'>521</a>
587
+ <a name='L522'></a><a href='#L522'>522</a>
588
+ <a name='L523'></a><a href='#L523'>523</a>
589
+ <a name='L524'></a><a href='#L524'>524</a>
590
+ <a name='L525'></a><a href='#L525'>525</a>
591
+ <a name='L526'></a><a href='#L526'>526</a>
592
+ <a name='L527'></a><a href='#L527'>527</a>
593
+ <a name='L528'></a><a href='#L528'>528</a>
594
+ <a name='L529'></a><a href='#L529'>529</a>
595
+ <a name='L530'></a><a href='#L530'>530</a>
596
+ <a name='L531'></a><a href='#L531'>531</a>
597
+ <a name='L532'></a><a href='#L532'>532</a>
598
+ <a name='L533'></a><a href='#L533'>533</a>
599
+ <a name='L534'></a><a href='#L534'>534</a>
600
+ <a name='L535'></a><a href='#L535'>535</a>
601
+ <a name='L536'></a><a href='#L536'>536</a>
602
+ <a name='L537'></a><a href='#L537'>537</a>
603
+ <a name='L538'></a><a href='#L538'>538</a>
604
+ <a name='L539'></a><a href='#L539'>539</a>
605
+ <a name='L540'></a><a href='#L540'>540</a>
606
+ <a name='L541'></a><a href='#L541'>541</a>
607
+ <a name='L542'></a><a href='#L542'>542</a>
608
+ <a name='L543'></a><a href='#L543'>543</a>
609
+ <a name='L544'></a><a href='#L544'>544</a>
610
+ <a name='L545'></a><a href='#L545'>545</a>
611
+ <a name='L546'></a><a href='#L546'>546</a>
612
+ <a name='L547'></a><a href='#L547'>547</a>
613
+ <a name='L548'></a><a href='#L548'>548</a>
614
+ <a name='L549'></a><a href='#L549'>549</a>
615
+ <a name='L550'></a><a href='#L550'>550</a>
616
+ <a name='L551'></a><a href='#L551'>551</a>
617
+ <a name='L552'></a><a href='#L552'>552</a>
618
+ <a name='L553'></a><a href='#L553'>553</a>
619
+ <a name='L554'></a><a href='#L554'>554</a>
620
+ <a name='L555'></a><a href='#L555'>555</a>
621
+ <a name='L556'></a><a href='#L556'>556</a>
622
+ <a name='L557'></a><a href='#L557'>557</a>
623
+ <a name='L558'></a><a href='#L558'>558</a>
624
+ <a name='L559'></a><a href='#L559'>559</a>
625
+ <a name='L560'></a><a href='#L560'>560</a>
626
+ <a name='L561'></a><a href='#L561'>561</a>
627
+ <a name='L562'></a><a href='#L562'>562</a>
628
+ <a name='L563'></a><a href='#L563'>563</a>
629
+ <a name='L564'></a><a href='#L564'>564</a>
630
+ <a name='L565'></a><a href='#L565'>565</a>
631
+ <a name='L566'></a><a href='#L566'>566</a>
632
+ <a name='L567'></a><a href='#L567'>567</a>
633
+ <a name='L568'></a><a href='#L568'>568</a>
634
+ <a name='L569'></a><a href='#L569'>569</a>
635
+ <a name='L570'></a><a href='#L570'>570</a>
636
+ <a name='L571'></a><a href='#L571'>571</a>
637
+ <a name='L572'></a><a href='#L572'>572</a>
638
+ <a name='L573'></a><a href='#L573'>573</a>
639
+ <a name='L574'></a><a href='#L574'>574</a>
640
+ <a name='L575'></a><a href='#L575'>575</a>
641
+ <a name='L576'></a><a href='#L576'>576</a>
642
+ <a name='L577'></a><a href='#L577'>577</a>
643
+ <a name='L578'></a><a href='#L578'>578</a>
644
+ <a name='L579'></a><a href='#L579'>579</a>
645
+ <a name='L580'></a><a href='#L580'>580</a>
646
+ <a name='L581'></a><a href='#L581'>581</a>
647
+ <a name='L582'></a><a href='#L582'>582</a>
648
+ <a name='L583'></a><a href='#L583'>583</a>
649
+ <a name='L584'></a><a href='#L584'>584</a>
650
+ <a name='L585'></a><a href='#L585'>585</a>
651
+ <a name='L586'></a><a href='#L586'>586</a>
652
+ <a name='L587'></a><a href='#L587'>587</a>
653
+ <a name='L588'></a><a href='#L588'>588</a>
654
+ <a name='L589'></a><a href='#L589'>589</a>
655
+ <a name='L590'></a><a href='#L590'>590</a>
656
+ <a name='L591'></a><a href='#L591'>591</a>
657
+ <a name='L592'></a><a href='#L592'>592</a>
658
+ <a name='L593'></a><a href='#L593'>593</a>
659
+ <a name='L594'></a><a href='#L594'>594</a>
660
+ <a name='L595'></a><a href='#L595'>595</a>
661
+ <a name='L596'></a><a href='#L596'>596</a>
662
+ <a name='L597'></a><a href='#L597'>597</a>
663
+ <a name='L598'></a><a href='#L598'>598</a>
664
+ <a name='L599'></a><a href='#L599'>599</a>
665
+ <a name='L600'></a><a href='#L600'>600</a>
666
+ <a name='L601'></a><a href='#L601'>601</a>
667
+ <a name='L602'></a><a href='#L602'>602</a>
668
+ <a name='L603'></a><a href='#L603'>603</a>
669
+ <a name='L604'></a><a href='#L604'>604</a>
670
+ <a name='L605'></a><a href='#L605'>605</a>
671
+ <a name='L606'></a><a href='#L606'>606</a>
672
+ <a name='L607'></a><a href='#L607'>607</a>
673
+ <a name='L608'></a><a href='#L608'>608</a>
674
+ <a name='L609'></a><a href='#L609'>609</a>
675
+ <a name='L610'></a><a href='#L610'>610</a>
676
+ <a name='L611'></a><a href='#L611'>611</a>
677
+ <a name='L612'></a><a href='#L612'>612</a>
678
+ <a name='L613'></a><a href='#L613'>613</a>
679
+ <a name='L614'></a><a href='#L614'>614</a>
680
+ <a name='L615'></a><a href='#L615'>615</a>
681
+ <a name='L616'></a><a href='#L616'>616</a>
682
+ <a name='L617'></a><a href='#L617'>617</a>
683
+ <a name='L618'></a><a href='#L618'>618</a>
684
+ <a name='L619'></a><a href='#L619'>619</a>
685
+ <a name='L620'></a><a href='#L620'>620</a>
686
+ <a name='L621'></a><a href='#L621'>621</a>
687
+ <a name='L622'></a><a href='#L622'>622</a>
688
+ <a name='L623'></a><a href='#L623'>623</a>
689
+ <a name='L624'></a><a href='#L624'>624</a>
690
+ <a name='L625'></a><a href='#L625'>625</a>
691
+ <a name='L626'></a><a href='#L626'>626</a>
692
+ <a name='L627'></a><a href='#L627'>627</a>
693
+ <a name='L628'></a><a href='#L628'>628</a>
694
+ <a name='L629'></a><a href='#L629'>629</a>
695
+ <a name='L630'></a><a href='#L630'>630</a>
696
+ <a name='L631'></a><a href='#L631'>631</a>
697
+ <a name='L632'></a><a href='#L632'>632</a>
698
+ <a name='L633'></a><a href='#L633'>633</a>
699
+ <a name='L634'></a><a href='#L634'>634</a>
700
+ <a name='L635'></a><a href='#L635'>635</a>
701
+ <a name='L636'></a><a href='#L636'>636</a>
702
+ <a name='L637'></a><a href='#L637'>637</a>
703
+ <a name='L638'></a><a href='#L638'>638</a>
704
+ <a name='L639'></a><a href='#L639'>639</a>
705
+ <a name='L640'></a><a href='#L640'>640</a>
706
+ <a name='L641'></a><a href='#L641'>641</a>
707
+ <a name='L642'></a><a href='#L642'>642</a>
708
+ <a name='L643'></a><a href='#L643'>643</a>
709
+ <a name='L644'></a><a href='#L644'>644</a>
710
+ <a name='L645'></a><a href='#L645'>645</a>
711
+ <a name='L646'></a><a href='#L646'>646</a>
712
+ <a name='L647'></a><a href='#L647'>647</a>
713
+ <a name='L648'></a><a href='#L648'>648</a>
714
+ <a name='L649'></a><a href='#L649'>649</a>
715
+ <a name='L650'></a><a href='#L650'>650</a>
716
+ <a name='L651'></a><a href='#L651'>651</a>
717
+ <a name='L652'></a><a href='#L652'>652</a>
718
+ <a name='L653'></a><a href='#L653'>653</a>
719
+ <a name='L654'></a><a href='#L654'>654</a>
720
+ <a name='L655'></a><a href='#L655'>655</a>
721
+ <a name='L656'></a><a href='#L656'>656</a>
722
+ <a name='L657'></a><a href='#L657'>657</a>
723
+ <a name='L658'></a><a href='#L658'>658</a>
724
+ <a name='L659'></a><a href='#L659'>659</a>
725
+ <a name='L660'></a><a href='#L660'>660</a>
726
+ <a name='L661'></a><a href='#L661'>661</a>
727
+ <a name='L662'></a><a href='#L662'>662</a>
728
+ <a name='L663'></a><a href='#L663'>663</a>
729
+ <a name='L664'></a><a href='#L664'>664</a>
730
+ <a name='L665'></a><a href='#L665'>665</a>
731
+ <a name='L666'></a><a href='#L666'>666</a>
732
+ <a name='L667'></a><a href='#L667'>667</a>
733
+ <a name='L668'></a><a href='#L668'>668</a>
734
+ <a name='L669'></a><a href='#L669'>669</a>
735
+ <a name='L670'></a><a href='#L670'>670</a>
736
+ <a name='L671'></a><a href='#L671'>671</a>
737
+ <a name='L672'></a><a href='#L672'>672</a>
738
+ <a name='L673'></a><a href='#L673'>673</a>
739
+ <a name='L674'></a><a href='#L674'>674</a>
740
+ <a name='L675'></a><a href='#L675'>675</a>
741
+ <a name='L676'></a><a href='#L676'>676</a>
742
+ <a name='L677'></a><a href='#L677'>677</a>
743
+ <a name='L678'></a><a href='#L678'>678</a>
744
+ <a name='L679'></a><a href='#L679'>679</a>
745
+ <a name='L680'></a><a href='#L680'>680</a>
746
+ <a name='L681'></a><a href='#L681'>681</a>
747
+ <a name='L682'></a><a href='#L682'>682</a>
748
+ <a name='L683'></a><a href='#L683'>683</a>
749
+ <a name='L684'></a><a href='#L684'>684</a>
750
+ <a name='L685'></a><a href='#L685'>685</a>
751
+ <a name='L686'></a><a href='#L686'>686</a>
752
+ <a name='L687'></a><a href='#L687'>687</a>
753
+ <a name='L688'></a><a href='#L688'>688</a>
754
+ <a name='L689'></a><a href='#L689'>689</a>
755
+ <a name='L690'></a><a href='#L690'>690</a>
756
+ <a name='L691'></a><a href='#L691'>691</a>
757
+ <a name='L692'></a><a href='#L692'>692</a>
758
+ <a name='L693'></a><a href='#L693'>693</a>
759
+ <a name='L694'></a><a href='#L694'>694</a>
760
+ <a name='L695'></a><a href='#L695'>695</a>
761
+ <a name='L696'></a><a href='#L696'>696</a>
762
+ <a name='L697'></a><a href='#L697'>697</a>
763
+ <a name='L698'></a><a href='#L698'>698</a>
764
+ <a name='L699'></a><a href='#L699'>699</a>
765
+ <a name='L700'></a><a href='#L700'>700</a>
766
+ <a name='L701'></a><a href='#L701'>701</a>
767
+ <a name='L702'></a><a href='#L702'>702</a>
768
+ <a name='L703'></a><a href='#L703'>703</a>
769
+ <a name='L704'></a><a href='#L704'>704</a>
770
+ <a name='L705'></a><a href='#L705'>705</a>
771
+ <a name='L706'></a><a href='#L706'>706</a>
772
+ <a name='L707'></a><a href='#L707'>707</a>
773
+ <a name='L708'></a><a href='#L708'>708</a>
774
+ <a name='L709'></a><a href='#L709'>709</a>
775
+ <a name='L710'></a><a href='#L710'>710</a>
776
+ <a name='L711'></a><a href='#L711'>711</a>
777
+ <a name='L712'></a><a href='#L712'>712</a>
778
+ <a name='L713'></a><a href='#L713'>713</a>
779
+ <a name='L714'></a><a href='#L714'>714</a>
780
+ <a name='L715'></a><a href='#L715'>715</a>
781
+ <a name='L716'></a><a href='#L716'>716</a>
782
+ <a name='L717'></a><a href='#L717'>717</a>
783
+ <a name='L718'></a><a href='#L718'>718</a>
784
+ <a name='L719'></a><a href='#L719'>719</a>
785
+ <a name='L720'></a><a href='#L720'>720</a>
786
+ <a name='L721'></a><a href='#L721'>721</a>
787
+ <a name='L722'></a><a href='#L722'>722</a>
788
+ <a name='L723'></a><a href='#L723'>723</a>
789
+ <a name='L724'></a><a href='#L724'>724</a>
790
+ <a name='L725'></a><a href='#L725'>725</a>
791
+ <a name='L726'></a><a href='#L726'>726</a>
792
+ <a name='L727'></a><a href='#L727'>727</a>
793
+ <a name='L728'></a><a href='#L728'>728</a>
794
+ <a name='L729'></a><a href='#L729'>729</a>
795
+ <a name='L730'></a><a href='#L730'>730</a>
796
+ <a name='L731'></a><a href='#L731'>731</a>
797
+ <a name='L732'></a><a href='#L732'>732</a>
798
+ <a name='L733'></a><a href='#L733'>733</a>
799
+ <a name='L734'></a><a href='#L734'>734</a>
800
+ <a name='L735'></a><a href='#L735'>735</a>
801
+ <a name='L736'></a><a href='#L736'>736</a>
802
+ <a name='L737'></a><a href='#L737'>737</a>
803
+ <a name='L738'></a><a href='#L738'>738</a>
804
+ <a name='L739'></a><a href='#L739'>739</a>
805
+ <a name='L740'></a><a href='#L740'>740</a>
806
+ <a name='L741'></a><a href='#L741'>741</a>
807
+ <a name='L742'></a><a href='#L742'>742</a>
808
+ <a name='L743'></a><a href='#L743'>743</a>
809
+ <a name='L744'></a><a href='#L744'>744</a>
810
+ <a name='L745'></a><a href='#L745'>745</a>
811
+ <a name='L746'></a><a href='#L746'>746</a>
812
+ <a name='L747'></a><a href='#L747'>747</a>
813
+ <a name='L748'></a><a href='#L748'>748</a>
814
+ <a name='L749'></a><a href='#L749'>749</a>
815
+ <a name='L750'></a><a href='#L750'>750</a>
816
+ <a name='L751'></a><a href='#L751'>751</a>
817
+ <a name='L752'></a><a href='#L752'>752</a>
818
+ <a name='L753'></a><a href='#L753'>753</a>
819
+ <a name='L754'></a><a href='#L754'>754</a>
820
+ <a name='L755'></a><a href='#L755'>755</a>
821
+ <a name='L756'></a><a href='#L756'>756</a>
822
+ <a name='L757'></a><a href='#L757'>757</a>
823
+ <a name='L758'></a><a href='#L758'>758</a>
824
+ <a name='L759'></a><a href='#L759'>759</a>
825
+ <a name='L760'></a><a href='#L760'>760</a>
826
+ <a name='L761'></a><a href='#L761'>761</a>
827
+ <a name='L762'></a><a href='#L762'>762</a>
828
+ <a name='L763'></a><a href='#L763'>763</a>
829
+ <a name='L764'></a><a href='#L764'>764</a>
830
+ <a name='L765'></a><a href='#L765'>765</a>
831
+ <a name='L766'></a><a href='#L766'>766</a>
832
+ <a name='L767'></a><a href='#L767'>767</a>
833
+ <a name='L768'></a><a href='#L768'>768</a>
834
+ <a name='L769'></a><a href='#L769'>769</a>
835
+ <a name='L770'></a><a href='#L770'>770</a>
836
+ <a name='L771'></a><a href='#L771'>771</a>
837
+ <a name='L772'></a><a href='#L772'>772</a>
838
+ <a name='L773'></a><a href='#L773'>773</a>
839
+ <a name='L774'></a><a href='#L774'>774</a>
840
+ <a name='L775'></a><a href='#L775'>775</a>
841
+ <a name='L776'></a><a href='#L776'>776</a>
842
+ <a name='L777'></a><a href='#L777'>777</a>
843
+ <a name='L778'></a><a href='#L778'>778</a>
844
+ <a name='L779'></a><a href='#L779'>779</a>
845
+ <a name='L780'></a><a href='#L780'>780</a>
846
+ <a name='L781'></a><a href='#L781'>781</a>
847
+ <a name='L782'></a><a href='#L782'>782</a>
848
+ <a name='L783'></a><a href='#L783'>783</a>
849
+ <a name='L784'></a><a href='#L784'>784</a>
850
+ <a name='L785'></a><a href='#L785'>785</a>
851
+ <a name='L786'></a><a href='#L786'>786</a>
852
+ <a name='L787'></a><a href='#L787'>787</a>
853
+ <a name='L788'></a><a href='#L788'>788</a>
854
+ <a name='L789'></a><a href='#L789'>789</a>
855
+ <a name='L790'></a><a href='#L790'>790</a>
856
+ <a name='L791'></a><a href='#L791'>791</a>
857
+ <a name='L792'></a><a href='#L792'>792</a>
858
+ <a name='L793'></a><a href='#L793'>793</a>
859
+ <a name='L794'></a><a href='#L794'>794</a>
860
+ <a name='L795'></a><a href='#L795'>795</a>
861
+ <a name='L796'></a><a href='#L796'>796</a>
862
+ <a name='L797'></a><a href='#L797'>797</a>
863
+ <a name='L798'></a><a href='#L798'>798</a>
864
+ <a name='L799'></a><a href='#L799'>799</a>
865
+ <a name='L800'></a><a href='#L800'>800</a>
866
+ <a name='L801'></a><a href='#L801'>801</a>
867
+ <a name='L802'></a><a href='#L802'>802</a>
868
+ <a name='L803'></a><a href='#L803'>803</a>
869
+ <a name='L804'></a><a href='#L804'>804</a>
870
+ <a name='L805'></a><a href='#L805'>805</a>
871
+ <a name='L806'></a><a href='#L806'>806</a>
872
+ <a name='L807'></a><a href='#L807'>807</a>
873
+ <a name='L808'></a><a href='#L808'>808</a>
874
+ <a name='L809'></a><a href='#L809'>809</a>
875
+ <a name='L810'></a><a href='#L810'>810</a>
876
+ <a name='L811'></a><a href='#L811'>811</a>
877
+ <a name='L812'></a><a href='#L812'>812</a>
878
+ <a name='L813'></a><a href='#L813'>813</a>
879
+ <a name='L814'></a><a href='#L814'>814</a>
880
+ <a name='L815'></a><a href='#L815'>815</a>
881
+ <a name='L816'></a><a href='#L816'>816</a>
882
+ <a name='L817'></a><a href='#L817'>817</a>
883
+ <a name='L818'></a><a href='#L818'>818</a>
884
+ <a name='L819'></a><a href='#L819'>819</a>
885
+ <a name='L820'></a><a href='#L820'>820</a>
886
+ <a name='L821'></a><a href='#L821'>821</a>
887
+ <a name='L822'></a><a href='#L822'>822</a>
888
+ <a name='L823'></a><a href='#L823'>823</a>
889
+ <a name='L824'></a><a href='#L824'>824</a>
890
+ <a name='L825'></a><a href='#L825'>825</a>
891
+ <a name='L826'></a><a href='#L826'>826</a>
892
+ <a name='L827'></a><a href='#L827'>827</a>
893
+ <a name='L828'></a><a href='#L828'>828</a>
894
+ <a name='L829'></a><a href='#L829'>829</a>
895
+ <a name='L830'></a><a href='#L830'>830</a>
896
+ <a name='L831'></a><a href='#L831'>831</a>
897
+ <a name='L832'></a><a href='#L832'>832</a>
898
+ <a name='L833'></a><a href='#L833'>833</a>
899
+ <a name='L834'></a><a href='#L834'>834</a>
900
+ <a name='L835'></a><a href='#L835'>835</a>
901
+ <a name='L836'></a><a href='#L836'>836</a>
902
+ <a name='L837'></a><a href='#L837'>837</a>
903
+ <a name='L838'></a><a href='#L838'>838</a>
904
+ <a name='L839'></a><a href='#L839'>839</a>
905
+ <a name='L840'></a><a href='#L840'>840</a>
906
+ <a name='L841'></a><a href='#L841'>841</a>
907
+ <a name='L842'></a><a href='#L842'>842</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
567
908
  <span class="cline-any cline-neutral">&nbsp;</span>
568
909
  <span class="cline-any cline-neutral">&nbsp;</span>
569
910
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -572,9 +913,12 @@
572
913
  <span class="cline-any cline-neutral">&nbsp;</span>
573
914
  <span class="cline-any cline-neutral">&nbsp;</span>
574
915
  <span class="cline-any cline-neutral">&nbsp;</span>
575
- <span class="cline-any cline-yes">132x</span>
576
916
  <span class="cline-any cline-neutral">&nbsp;</span>
577
917
  <span class="cline-any cline-neutral">&nbsp;</span>
918
+ <span class="cline-any cline-yes">2x</span>
919
+ <span class="cline-any cline-yes">2x</span>
920
+ <span class="cline-any cline-yes">2x</span>
921
+ <span class="cline-any cline-yes">2x</span>
578
922
  <span class="cline-any cline-neutral">&nbsp;</span>
579
923
  <span class="cline-any cline-neutral">&nbsp;</span>
580
924
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -584,7 +928,6 @@
584
928
  <span class="cline-any cline-neutral">&nbsp;</span>
585
929
  <span class="cline-any cline-neutral">&nbsp;</span>
586
930
  <span class="cline-any cline-neutral">&nbsp;</span>
587
- <span class="cline-any cline-yes">132x</span>
588
931
  <span class="cline-any cline-neutral">&nbsp;</span>
589
932
  <span class="cline-any cline-neutral">&nbsp;</span>
590
933
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -592,29 +935,19 @@
592
935
  <span class="cline-any cline-neutral">&nbsp;</span>
593
936
  <span class="cline-any cline-neutral">&nbsp;</span>
594
937
  <span class="cline-any cline-neutral">&nbsp;</span>
595
- <span class="cline-any cline-yes">132x</span>
596
- <span class="cline-any cline-yes">132x</span>
597
938
  <span class="cline-any cline-neutral">&nbsp;</span>
598
939
  <span class="cline-any cline-neutral">&nbsp;</span>
599
- <span class="cline-any cline-yes">132x</span>
600
940
  <span class="cline-any cline-neutral">&nbsp;</span>
601
941
  <span class="cline-any cline-neutral">&nbsp;</span>
602
942
  <span class="cline-any cline-neutral">&nbsp;</span>
603
943
  <span class="cline-any cline-neutral">&nbsp;</span>
604
944
  <span class="cline-any cline-neutral">&nbsp;</span>
605
945
  <span class="cline-any cline-neutral">&nbsp;</span>
606
- <span class="cline-any cline-yes">132x</span>
607
946
  <span class="cline-any cline-neutral">&nbsp;</span>
608
947
  <span class="cline-any cline-neutral">&nbsp;</span>
609
- <span class="cline-any cline-yes">132x</span>
610
- <span class="cline-any cline-yes">132x</span>
611
- <span class="cline-any cline-yes">132x</span>
612
- <span class="cline-any cline-yes">132x</span>
613
948
  <span class="cline-any cline-neutral">&nbsp;</span>
614
949
  <span class="cline-any cline-neutral">&nbsp;</span>
615
- <span class="cline-any cline-yes">132x</span>
616
950
  <span class="cline-any cline-neutral">&nbsp;</span>
617
- <span class="cline-any cline-yes">132x</span>
618
951
  <span class="cline-any cline-neutral">&nbsp;</span>
619
952
  <span class="cline-any cline-neutral">&nbsp;</span>
620
953
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -625,17 +958,11 @@
625
958
  <span class="cline-any cline-neutral">&nbsp;</span>
626
959
  <span class="cline-any cline-neutral">&nbsp;</span>
627
960
  <span class="cline-any cline-neutral">&nbsp;</span>
628
- <span class="cline-any cline-yes">35x</span>
629
961
  <span class="cline-any cline-neutral">&nbsp;</span>
630
- <span class="cline-any cline-yes">35x</span>
631
962
  <span class="cline-any cline-neutral">&nbsp;</span>
632
- <span class="cline-any cline-yes">29x</span>
633
963
  <span class="cline-any cline-neutral">&nbsp;</span>
634
- <span class="cline-any cline-yes">4x</span>
635
- <span class="cline-any cline-yes">4x</span>
636
964
  <span class="cline-any cline-neutral">&nbsp;</span>
637
965
  <span class="cline-any cline-neutral">&nbsp;</span>
638
- <span class="cline-any cline-yes">4x</span>
639
966
  <span class="cline-any cline-neutral">&nbsp;</span>
640
967
  <span class="cline-any cline-neutral">&nbsp;</span>
641
968
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -647,18 +974,14 @@
647
974
  <span class="cline-any cline-neutral">&nbsp;</span>
648
975
  <span class="cline-any cline-neutral">&nbsp;</span>
649
976
  <span class="cline-any cline-neutral">&nbsp;</span>
650
- <span class="cline-any cline-yes">4x</span>
651
977
  <span class="cline-any cline-neutral">&nbsp;</span>
652
978
  <span class="cline-any cline-neutral">&nbsp;</span>
979
+ <span class="cline-any cline-yes">71x</span>
653
980
  <span class="cline-any cline-neutral">&nbsp;</span>
654
981
  <span class="cline-any cline-neutral">&nbsp;</span>
982
+ <span class="cline-any cline-yes">71x</span>
655
983
  <span class="cline-any cline-neutral">&nbsp;</span>
656
- <span class="cline-any cline-yes">29x</span>
657
- <span class="cline-any cline-yes">29x</span>
658
- <span class="cline-any cline-yes">29x</span>
659
984
  <span class="cline-any cline-neutral">&nbsp;</span>
660
- <span class="cline-any cline-yes">6x</span>
661
- <span class="cline-any cline-yes">6x</span>
662
985
  <span class="cline-any cline-neutral">&nbsp;</span>
663
986
  <span class="cline-any cline-neutral">&nbsp;</span>
664
987
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -667,59 +990,130 @@
667
990
  <span class="cline-any cline-neutral">&nbsp;</span>
668
991
  <span class="cline-any cline-neutral">&nbsp;</span>
669
992
  <span class="cline-any cline-neutral">&nbsp;</span>
670
- <span class="cline-any cline-yes">62x</span>
671
- <span class="cline-any cline-yes">4x</span>
672
- <span class="cline-any cline-yes">58x</span>
673
- <span class="cline-any cline-yes">1x</span>
674
- <span class="cline-any cline-yes">57x</span>
675
993
  <span class="cline-any cline-neutral">&nbsp;</span>
676
- <span class="cline-any cline-yes">16x</span>
677
- <span class="cline-any cline-yes">16x</span>
994
+ <span class="cline-any cline-yes">71x</span>
678
995
  <span class="cline-any cline-neutral">&nbsp;</span>
679
996
  <span class="cline-any cline-neutral">&nbsp;</span>
680
- <span class="cline-any cline-yes">4x</span>
681
997
  <span class="cline-any cline-neutral">&nbsp;</span>
682
998
  <span class="cline-any cline-neutral">&nbsp;</span>
683
999
  <span class="cline-any cline-neutral">&nbsp;</span>
684
- <span class="cline-any cline-yes">62x</span>
685
1000
  <span class="cline-any cline-neutral">&nbsp;</span>
686
1001
  <span class="cline-any cline-neutral">&nbsp;</span>
687
1002
  <span class="cline-any cline-neutral">&nbsp;</span>
1003
+ <span class="cline-any cline-yes">71x</span>
1004
+ <span class="cline-any cline-yes">71x</span>
688
1005
  <span class="cline-any cline-neutral">&nbsp;</span>
1006
+ <span class="cline-any cline-yes">71x</span>
689
1007
  <span class="cline-any cline-neutral">&nbsp;</span>
690
1008
  <span class="cline-any cline-neutral">&nbsp;</span>
1009
+ <span class="cline-any cline-yes">71x</span>
691
1010
  <span class="cline-any cline-neutral">&nbsp;</span>
692
1011
  <span class="cline-any cline-neutral">&nbsp;</span>
693
1012
  <span class="cline-any cline-neutral">&nbsp;</span>
694
1013
  <span class="cline-any cline-neutral">&nbsp;</span>
695
- <span class="cline-any cline-yes">20x</span>
696
1014
  <span class="cline-any cline-neutral">&nbsp;</span>
697
- <span class="cline-any cline-yes">20x</span>
698
1015
  <span class="cline-any cline-neutral">&nbsp;</span>
699
1016
  <span class="cline-any cline-neutral">&nbsp;</span>
700
1017
  <span class="cline-any cline-neutral">&nbsp;</span>
701
- <span class="cline-any cline-yes">20x</span>
702
- <span class="cline-any cline-yes">1x</span>
703
- <span class="cline-any cline-yes">19x</span>
1018
+ <span class="cline-any cline-neutral">&nbsp;</span>
1019
+ <span class="cline-any cline-neutral">&nbsp;</span>
1020
+ <span class="cline-any cline-yes">71x</span>
1021
+ <span class="cline-any cline-yes">71x</span>
1022
+ <span class="cline-any cline-yes">71x</span>
1023
+ <span class="cline-any cline-yes">71x</span>
1024
+ <span class="cline-any cline-neutral">&nbsp;</span>
1025
+ <span class="cline-any cline-neutral">&nbsp;</span>
1026
+ <span class="cline-any cline-yes">71x</span>
1027
+ <span class="cline-any cline-neutral">&nbsp;</span>
1028
+ <span class="cline-any cline-neutral">&nbsp;</span>
1029
+ <span class="cline-any cline-yes">71x</span>
1030
+ <span class="cline-any cline-neutral">&nbsp;</span>
1031
+ <span class="cline-any cline-yes">71x</span>
1032
+ <span class="cline-any cline-neutral">&nbsp;</span>
1033
+ <span class="cline-any cline-neutral">&nbsp;</span>
1034
+ <span class="cline-any cline-neutral">&nbsp;</span>
1035
+ <span class="cline-any cline-neutral">&nbsp;</span>
1036
+ <span class="cline-any cline-neutral">&nbsp;</span>
1037
+ <span class="cline-any cline-neutral">&nbsp;</span>
1038
+ <span class="cline-any cline-neutral">&nbsp;</span>
1039
+ <span class="cline-any cline-neutral">&nbsp;</span>
1040
+ <span class="cline-any cline-neutral">&nbsp;</span>
1041
+ <span class="cline-any cline-neutral">&nbsp;</span>
1042
+ <span class="cline-any cline-neutral">&nbsp;</span>
1043
+ <span class="cline-any cline-neutral">&nbsp;</span>
1044
+ <span class="cline-any cline-neutral">&nbsp;</span>
1045
+ <span class="cline-any cline-neutral">&nbsp;</span>
1046
+ <span class="cline-any cline-neutral">&nbsp;</span>
1047
+ <span class="cline-any cline-neutral">&nbsp;</span>
1048
+ <span class="cline-any cline-neutral">&nbsp;</span>
1049
+ <span class="cline-any cline-neutral">&nbsp;</span>
1050
+ <span class="cline-any cline-neutral">&nbsp;</span>
1051
+ <span class="cline-any cline-neutral">&nbsp;</span>
1052
+ <span class="cline-any cline-neutral">&nbsp;</span>
1053
+ <span class="cline-any cline-neutral">&nbsp;</span>
1054
+ <span class="cline-any cline-neutral">&nbsp;</span>
1055
+ <span class="cline-any cline-neutral">&nbsp;</span>
1056
+ <span class="cline-any cline-yes">22x</span>
1057
+ <span class="cline-any cline-neutral">&nbsp;</span>
1058
+ <span class="cline-any cline-yes">22x</span>
1059
+ <span class="cline-any cline-neutral">&nbsp;</span>
1060
+ <span class="cline-any cline-neutral">&nbsp;</span>
1061
+ <span class="cline-any cline-yes">22x</span>
1062
+ <span class="cline-any cline-neutral">&nbsp;</span>
1063
+ <span class="cline-any cline-yes">18x</span>
1064
+ <span class="cline-any cline-yes">3x</span>
1065
+ <span class="cline-any cline-neutral">&nbsp;</span>
1066
+ <span class="cline-any cline-neutral">&nbsp;</span>
1067
+ <span class="cline-any cline-yes">3x</span>
1068
+ <span class="cline-any cline-neutral">&nbsp;</span>
1069
+ <span class="cline-any cline-neutral">&nbsp;</span>
1070
+ <span class="cline-any cline-neutral">&nbsp;</span>
1071
+ <span class="cline-any cline-neutral">&nbsp;</span>
1072
+ <span class="cline-any cline-neutral">&nbsp;</span>
1073
+ <span class="cline-any cline-neutral">&nbsp;</span>
1074
+ <span class="cline-any cline-neutral">&nbsp;</span>
1075
+ <span class="cline-any cline-neutral">&nbsp;</span>
1076
+ <span class="cline-any cline-neutral">&nbsp;</span>
1077
+ <span class="cline-any cline-neutral">&nbsp;</span>
1078
+ <span class="cline-any cline-neutral">&nbsp;</span>
1079
+ <span class="cline-any cline-yes">3x</span>
1080
+ <span class="cline-any cline-neutral">&nbsp;</span>
1081
+ <span class="cline-any cline-neutral">&nbsp;</span>
1082
+ <span class="cline-any cline-neutral">&nbsp;</span>
1083
+ <span class="cline-any cline-neutral">&nbsp;</span>
1084
+ <span class="cline-any cline-neutral">&nbsp;</span>
1085
+ <span class="cline-any cline-yes">18x</span>
1086
+ <span class="cline-any cline-yes">18x</span>
1087
+ <span class="cline-any cline-yes">18x</span>
1088
+ <span class="cline-any cline-neutral">&nbsp;</span>
1089
+ <span class="cline-any cline-yes">4x</span>
704
1090
  <span class="cline-any cline-yes">4x</span>
705
1091
  <span class="cline-any cline-neutral">&nbsp;</span>
706
- <span class="cline-any cline-yes">15x</span>
707
1092
  <span class="cline-any cline-neutral">&nbsp;</span>
708
1093
  <span class="cline-any cline-neutral">&nbsp;</span>
709
1094
  <span class="cline-any cline-neutral">&nbsp;</span>
710
- <span class="cline-any cline-yes">20x</span>
711
1095
  <span class="cline-any cline-neutral">&nbsp;</span>
712
1096
  <span class="cline-any cline-neutral">&nbsp;</span>
713
- <span class="cline-any cline-yes">20x</span>
714
1097
  <span class="cline-any cline-neutral">&nbsp;</span>
715
1098
  <span class="cline-any cline-neutral">&nbsp;</span>
716
1099
  <span class="cline-any cline-neutral">&nbsp;</span>
717
1100
  <span class="cline-any cline-neutral">&nbsp;</span>
718
- <span class="cline-any cline-yes">20x</span>
719
- <span class="cline-any cline-yes">20x</span>
720
- <span class="cline-any cline-yes">9x</span>
721
1101
  <span class="cline-any cline-neutral">&nbsp;</span>
722
- <span class="cline-any cline-yes">9x</span>
1102
+ <span class="cline-any cline-neutral">&nbsp;</span>
1103
+ <span class="cline-any cline-neutral">&nbsp;</span>
1104
+ <span class="cline-any cline-neutral">&nbsp;</span>
1105
+ <span class="cline-any cline-neutral">&nbsp;</span>
1106
+ <span class="cline-any cline-neutral">&nbsp;</span>
1107
+ <span class="cline-any cline-neutral">&nbsp;</span>
1108
+ <span class="cline-any cline-neutral">&nbsp;</span>
1109
+ <span class="cline-any cline-neutral">&nbsp;</span>
1110
+ <span class="cline-any cline-neutral">&nbsp;</span>
1111
+ <span class="cline-any cline-yes">26x</span>
1112
+ <span class="cline-any cline-neutral">&nbsp;</span>
1113
+ <span class="cline-any cline-neutral">&nbsp;</span>
1114
+ <span class="cline-any cline-neutral">&nbsp;</span>
1115
+ <span class="cline-any cline-neutral">&nbsp;</span>
1116
+ <span class="cline-any cline-neutral">&nbsp;</span>
723
1117
  <span class="cline-any cline-neutral">&nbsp;</span>
724
1118
  <span class="cline-any cline-neutral">&nbsp;</span>
725
1119
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -731,7 +1125,6 @@
731
1125
  <span class="cline-any cline-neutral">&nbsp;</span>
732
1126
  <span class="cline-any cline-neutral">&nbsp;</span>
733
1127
  <span class="cline-any cline-neutral">&nbsp;</span>
734
- <span class="cline-any cline-yes">11x</span>
735
1128
  <span class="cline-any cline-neutral">&nbsp;</span>
736
1129
  <span class="cline-any cline-neutral">&nbsp;</span>
737
1130
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -743,9 +1136,7 @@
743
1136
  <span class="cline-any cline-neutral">&nbsp;</span>
744
1137
  <span class="cline-any cline-neutral">&nbsp;</span>
745
1138
  <span class="cline-any cline-neutral">&nbsp;</span>
746
- <span class="cline-any cline-yes">9x</span>
747
1139
  <span class="cline-any cline-neutral">&nbsp;</span>
748
- <span class="cline-any cline-yes">9x</span>
749
1140
  <span class="cline-any cline-neutral">&nbsp;</span>
750
1141
  <span class="cline-any cline-neutral">&nbsp;</span>
751
1142
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -754,8 +1145,6 @@
754
1145
  <span class="cline-any cline-neutral">&nbsp;</span>
755
1146
  <span class="cline-any cline-neutral">&nbsp;</span>
756
1147
  <span class="cline-any cline-neutral">&nbsp;</span>
757
- <span class="cline-any cline-yes">2x</span>
758
- <span class="cline-any cline-yes">2x</span>
759
1148
  <span class="cline-any cline-neutral">&nbsp;</span>
760
1149
  <span class="cline-any cline-neutral">&nbsp;</span>
761
1150
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -764,47 +1153,143 @@
764
1153
  <span class="cline-any cline-neutral">&nbsp;</span>
765
1154
  <span class="cline-any cline-neutral">&nbsp;</span>
766
1155
  <span class="cline-any cline-yes">10x</span>
1156
+ <span class="cline-any cline-neutral">&nbsp;</span>
767
1157
  <span class="cline-any cline-yes">10x</span>
768
1158
  <span class="cline-any cline-neutral">&nbsp;</span>
769
1159
  <span class="cline-any cline-neutral">&nbsp;</span>
770
- <span class="cline-any cline-yes">10x</span>
1160
+ <span class="cline-any cline-neutral">&nbsp;</span>
771
1161
  <span class="cline-any cline-yes">10x</span>
772
1162
  <span class="cline-any cline-yes">1x</span>
1163
+ <span class="cline-any cline-yes">9x</span>
773
1164
  <span class="cline-any cline-yes">1x</span>
774
1165
  <span class="cline-any cline-neutral">&nbsp;</span>
1166
+ <span class="cline-any cline-yes">8x</span>
775
1167
  <span class="cline-any cline-neutral">&nbsp;</span>
776
1168
  <span class="cline-any cline-neutral">&nbsp;</span>
777
- <span class="cline-any cline-yes">9x</span>
778
1169
  <span class="cline-any cline-neutral">&nbsp;</span>
1170
+ <span class="cline-any cline-yes">10x</span>
779
1171
  <span class="cline-any cline-neutral">&nbsp;</span>
780
- <span class="cline-any cline-yes">8x</span>
781
- <span class="cline-any cline-yes">8x</span>
782
- <span class="cline-any cline-yes">8x</span>
783
1172
  <span class="cline-any cline-neutral">&nbsp;</span>
784
- <span class="cline-any cline-yes">8x</span>
1173
+ <span class="cline-any cline-yes">10x</span>
785
1174
  <span class="cline-any cline-neutral">&nbsp;</span>
786
1175
  <span class="cline-any cline-neutral">&nbsp;</span>
787
- <span class="cline-any cline-yes">8x</span>
788
- <span class="cline-any cline-yes">5x</span>
789
1176
  <span class="cline-any cline-neutral">&nbsp;</span>
790
- <span class="cline-any cline-yes">5x</span>
1177
+ <span class="cline-any cline-neutral">&nbsp;</span>
1178
+ <span class="cline-any cline-yes">10x</span>
1179
+ <span class="cline-any cline-yes">10x</span>
1180
+ <span class="cline-any cline-yes">2x</span>
1181
+ <span class="cline-any cline-neutral">&nbsp;</span>
791
1182
  <span class="cline-any cline-yes">2x</span>
792
1183
  <span class="cline-any cline-neutral">&nbsp;</span>
793
1184
  <span class="cline-any cline-neutral">&nbsp;</span>
794
1185
  <span class="cline-any cline-neutral">&nbsp;</span>
795
1186
  <span class="cline-any cline-neutral">&nbsp;</span>
796
- <span class="cline-any cline-yes">3x</span>
797
1187
  <span class="cline-any cline-neutral">&nbsp;</span>
798
1188
  <span class="cline-any cline-neutral">&nbsp;</span>
799
1189
  <span class="cline-any cline-neutral">&nbsp;</span>
1190
+ <span class="cline-any cline-neutral">&nbsp;</span>
1191
+ <span class="cline-any cline-neutral">&nbsp;</span>
1192
+ <span class="cline-any cline-yes">8x</span>
1193
+ <span class="cline-any cline-neutral">&nbsp;</span>
1194
+ <span class="cline-any cline-neutral">&nbsp;</span>
1195
+ <span class="cline-any cline-neutral">&nbsp;</span>
1196
+ <span class="cline-any cline-neutral">&nbsp;</span>
1197
+ <span class="cline-any cline-neutral">&nbsp;</span>
1198
+ <span class="cline-any cline-neutral">&nbsp;</span>
1199
+ <span class="cline-any cline-neutral">&nbsp;</span>
1200
+ <span class="cline-any cline-neutral">&nbsp;</span>
1201
+ <span class="cline-any cline-neutral">&nbsp;</span>
1202
+ <span class="cline-any cline-neutral">&nbsp;</span>
1203
+ <span class="cline-any cline-yes">6x</span>
1204
+ <span class="cline-any cline-neutral">&nbsp;</span>
800
1205
  <span class="cline-any cline-yes">6x</span>
801
1206
  <span class="cline-any cline-neutral">&nbsp;</span>
802
1207
  <span class="cline-any cline-neutral">&nbsp;</span>
1208
+ <span class="cline-any cline-neutral">&nbsp;</span>
1209
+ <span class="cline-any cline-neutral">&nbsp;</span>
1210
+ <span class="cline-any cline-neutral">&nbsp;</span>
1211
+ <span class="cline-any cline-neutral">&nbsp;</span>
1212
+ <span class="cline-any cline-neutral">&nbsp;</span>
1213
+ <span class="cline-any cline-neutral">&nbsp;</span>
1214
+ <span class="cline-any cline-yes">2x</span>
1215
+ <span class="cline-any cline-yes">2x</span>
1216
+ <span class="cline-any cline-neutral">&nbsp;</span>
1217
+ <span class="cline-any cline-neutral">&nbsp;</span>
1218
+ <span class="cline-any cline-neutral">&nbsp;</span>
1219
+ <span class="cline-any cline-neutral">&nbsp;</span>
1220
+ <span class="cline-any cline-neutral">&nbsp;</span>
1221
+ <span class="cline-any cline-neutral">&nbsp;</span>
1222
+ <span class="cline-any cline-neutral">&nbsp;</span>
1223
+ <span class="cline-any cline-neutral">&nbsp;</span>
1224
+ <span class="cline-any cline-neutral">&nbsp;</span>
1225
+ <span class="cline-any cline-neutral">&nbsp;</span>
1226
+ <span class="cline-any cline-neutral">&nbsp;</span>
1227
+ <span class="cline-any cline-neutral">&nbsp;</span>
1228
+ <span class="cline-any cline-neutral">&nbsp;</span>
1229
+ <span class="cline-any cline-neutral">&nbsp;</span>
1230
+ <span class="cline-any cline-neutral">&nbsp;</span>
1231
+ <span class="cline-any cline-neutral">&nbsp;</span>
1232
+ <span class="cline-any cline-neutral">&nbsp;</span>
1233
+ <span class="cline-any cline-neutral">&nbsp;</span>
1234
+ <span class="cline-any cline-neutral">&nbsp;</span>
1235
+ <span class="cline-any cline-neutral">&nbsp;</span>
1236
+ <span class="cline-any cline-neutral">&nbsp;</span>
1237
+ <span class="cline-any cline-neutral">&nbsp;</span>
1238
+ <span class="cline-any cline-neutral">&nbsp;</span>
1239
+ <span class="cline-any cline-neutral">&nbsp;</span>
1240
+ <span class="cline-any cline-neutral">&nbsp;</span>
1241
+ <span class="cline-any cline-neutral">&nbsp;</span>
1242
+ <span class="cline-any cline-neutral">&nbsp;</span>
1243
+ <span class="cline-any cline-neutral">&nbsp;</span>
1244
+ <span class="cline-any cline-neutral">&nbsp;</span>
1245
+ <span class="cline-any cline-neutral">&nbsp;</span>
1246
+ <span class="cline-any cline-neutral">&nbsp;</span>
1247
+ <span class="cline-any cline-neutral">&nbsp;</span>
1248
+ <span class="cline-any cline-neutral">&nbsp;</span>
1249
+ <span class="cline-any cline-neutral">&nbsp;</span>
1250
+ <span class="cline-any cline-neutral">&nbsp;</span>
1251
+ <span class="cline-any cline-neutral">&nbsp;</span>
1252
+ <span class="cline-any cline-neutral">&nbsp;</span>
1253
+ <span class="cline-any cline-yes">6x</span>
803
1254
  <span class="cline-any cline-yes">6x</span>
804
- <span class="cline-any cline-yes">3x</span>
805
1255
  <span class="cline-any cline-neutral">&nbsp;</span>
806
1256
  <span class="cline-any cline-neutral">&nbsp;</span>
807
1257
  <span class="cline-any cline-yes">6x</span>
1258
+ <span class="cline-any cline-yes">6x</span>
1259
+ <span class="cline-any cline-yes">1x</span>
1260
+ <span class="cline-any cline-yes">1x</span>
1261
+ <span class="cline-any cline-neutral">&nbsp;</span>
1262
+ <span class="cline-any cline-neutral">&nbsp;</span>
1263
+ <span class="cline-any cline-neutral">&nbsp;</span>
1264
+ <span class="cline-any cline-yes">5x</span>
1265
+ <span class="cline-any cline-neutral">&nbsp;</span>
1266
+ <span class="cline-any cline-neutral">&nbsp;</span>
1267
+ <span class="cline-any cline-yes">4x</span>
1268
+ <span class="cline-any cline-yes">4x</span>
1269
+ <span class="cline-any cline-yes">4x</span>
1270
+ <span class="cline-any cline-neutral">&nbsp;</span>
1271
+ <span class="cline-any cline-yes">4x</span>
1272
+ <span class="cline-any cline-neutral">&nbsp;</span>
1273
+ <span class="cline-any cline-neutral">&nbsp;</span>
1274
+ <span class="cline-any cline-yes">4x</span>
1275
+ <span class="cline-any cline-yes">4x</span>
1276
+ <span class="cline-any cline-yes">4x</span>
1277
+ <span class="cline-any cline-yes">2x</span>
1278
+ <span class="cline-any cline-neutral">&nbsp;</span>
1279
+ <span class="cline-any cline-neutral">&nbsp;</span>
1280
+ <span class="cline-any cline-neutral">&nbsp;</span>
1281
+ <span class="cline-any cline-yes">2x</span>
1282
+ <span class="cline-any cline-neutral">&nbsp;</span>
1283
+ <span class="cline-any cline-neutral">&nbsp;</span>
1284
+ <span class="cline-any cline-neutral">&nbsp;</span>
1285
+ <span class="cline-any cline-yes">2x</span>
1286
+ <span class="cline-any cline-neutral">&nbsp;</span>
1287
+ <span class="cline-any cline-neutral">&nbsp;</span>
1288
+ <span class="cline-any cline-yes">2x</span>
1289
+ <span class="cline-any cline-yes">2x</span>
1290
+ <span class="cline-any cline-neutral">&nbsp;</span>
1291
+ <span class="cline-any cline-neutral">&nbsp;</span>
1292
+ <span class="cline-any cline-yes">2x</span>
808
1293
  <span class="cline-any cline-neutral">&nbsp;</span>
809
1294
  <span class="cline-any cline-neutral">&nbsp;</span>
810
1295
  <span class="cline-any cline-yes">3x</span>
@@ -816,10 +1301,25 @@
816
1301
  <span class="cline-any cline-neutral">&nbsp;</span>
817
1302
  <span class="cline-any cline-neutral">&nbsp;</span>
818
1303
  <span class="cline-any cline-neutral">&nbsp;</span>
819
- <span class="cline-any cline-no">&nbsp;</span>
820
- <span class="cline-any cline-no">&nbsp;</span>
821
1304
  <span class="cline-any cline-neutral">&nbsp;</span>
822
- <span class="cline-any cline-no">&nbsp;</span>
1305
+ <span class="cline-any cline-neutral">&nbsp;</span>
1306
+ <span class="cline-any cline-neutral">&nbsp;</span>
1307
+ <span class="cline-any cline-neutral">&nbsp;</span>
1308
+ <span class="cline-any cline-neutral">&nbsp;</span>
1309
+ <span class="cline-any cline-neutral">&nbsp;</span>
1310
+ <span class="cline-any cline-neutral">&nbsp;</span>
1311
+ <span class="cline-any cline-neutral">&nbsp;</span>
1312
+ <span class="cline-any cline-neutral">&nbsp;</span>
1313
+ <span class="cline-any cline-neutral">&nbsp;</span>
1314
+ <span class="cline-any cline-neutral">&nbsp;</span>
1315
+ <span class="cline-any cline-neutral">&nbsp;</span>
1316
+ <span class="cline-any cline-neutral">&nbsp;</span>
1317
+ <span class="cline-any cline-neutral">&nbsp;</span>
1318
+ <span class="cline-any cline-neutral">&nbsp;</span>
1319
+ <span class="cline-any cline-neutral">&nbsp;</span>
1320
+ <span class="cline-any cline-neutral">&nbsp;</span>
1321
+ <span class="cline-any cline-neutral">&nbsp;</span>
1322
+ <span class="cline-any cline-neutral">&nbsp;</span>
823
1323
  <span class="cline-any cline-neutral">&nbsp;</span>
824
1324
  <span class="cline-any cline-neutral">&nbsp;</span>
825
1325
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -830,24 +1330,49 @@
830
1330
  <span class="cline-any cline-neutral">&nbsp;</span>
831
1331
  <span class="cline-any cline-neutral">&nbsp;</span>
832
1332
  <span class="cline-any cline-no">&nbsp;</span>
1333
+ <span class="cline-any cline-neutral">&nbsp;</span>
1334
+ <span class="cline-any cline-no">&nbsp;</span>
833
1335
  <span class="cline-any cline-no">&nbsp;</span>
834
1336
  <span class="cline-any cline-neutral">&nbsp;</span>
835
1337
  <span class="cline-any cline-neutral">&nbsp;</span>
1338
+ <span class="cline-any cline-no">&nbsp;</span>
1339
+ <span class="cline-any cline-no">&nbsp;</span>
1340
+ <span class="cline-any cline-neutral">&nbsp;</span>
1341
+ <span class="cline-any cline-neutral">&nbsp;</span>
1342
+ <span class="cline-any cline-neutral">&nbsp;</span>
1343
+ <span class="cline-any cline-neutral">&nbsp;</span>
1344
+ <span class="cline-any cline-neutral">&nbsp;</span>
1345
+ <span class="cline-any cline-neutral">&nbsp;</span>
1346
+ <span class="cline-any cline-neutral">&nbsp;</span>
1347
+ <span class="cline-any cline-neutral">&nbsp;</span>
1348
+ <span class="cline-any cline-neutral">&nbsp;</span>
1349
+ <span class="cline-any cline-neutral">&nbsp;</span>
1350
+ <span class="cline-any cline-neutral">&nbsp;</span>
1351
+ <span class="cline-any cline-neutral">&nbsp;</span>
1352
+ <span class="cline-any cline-neutral">&nbsp;</span>
1353
+ <span class="cline-any cline-neutral">&nbsp;</span>
1354
+ <span class="cline-any cline-neutral">&nbsp;</span>
1355
+ <span class="cline-any cline-neutral">&nbsp;</span>
1356
+ <span class="cline-any cline-neutral">&nbsp;</span>
1357
+ <span class="cline-any cline-neutral">&nbsp;</span>
1358
+ <span class="cline-any cline-neutral">&nbsp;</span>
836
1359
  <span class="cline-any cline-neutral">&nbsp;</span>
837
1360
  <span class="cline-any cline-neutral">&nbsp;</span>
838
1361
  <span class="cline-any cline-neutral">&nbsp;</span>
839
1362
  <span class="cline-any cline-neutral">&nbsp;</span>
840
1363
  <span class="cline-any cline-neutral">&nbsp;</span>
841
- <span class="cline-any cline-no">&nbsp;</span>
842
- <span class="cline-any cline-no">&nbsp;</span>
843
1364
  <span class="cline-any cline-neutral">&nbsp;</span>
844
1365
  <span class="cline-any cline-no">&nbsp;</span>
845
1366
  <span class="cline-any cline-no">&nbsp;</span>
846
1367
  <span class="cline-any cline-neutral">&nbsp;</span>
847
- <span class="cline-any cline-no">&nbsp;</span>
848
1368
  <span class="cline-any cline-neutral">&nbsp;</span>
849
1369
  <span class="cline-any cline-no">&nbsp;</span>
850
1370
  <span class="cline-any cline-neutral">&nbsp;</span>
1371
+ <span class="cline-any cline-neutral">&nbsp;</span>
1372
+ <span class="cline-any cline-no">&nbsp;</span>
1373
+ <span class="cline-any cline-no">&nbsp;</span>
1374
+ <span class="cline-any cline-no">&nbsp;</span>
1375
+ <span class="cline-any cline-no">&nbsp;</span>
851
1376
  <span class="cline-any cline-no">&nbsp;</span>
852
1377
  <span class="cline-any cline-neutral">&nbsp;</span>
853
1378
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -860,6 +1385,10 @@
860
1385
  <span class="cline-any cline-no">&nbsp;</span>
861
1386
  <span class="cline-any cline-neutral">&nbsp;</span>
862
1387
  <span class="cline-any cline-neutral">&nbsp;</span>
1388
+ <span class="cline-any cline-neutral">&nbsp;</span>
1389
+ <span class="cline-any cline-no">&nbsp;</span>
1390
+ <span class="cline-any cline-neutral">&nbsp;</span>
1391
+ <span class="cline-any cline-neutral">&nbsp;</span>
863
1392
  <span class="cline-any cline-no">&nbsp;</span>
864
1393
  <span class="cline-any cline-no">&nbsp;</span>
865
1394
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -869,9 +1398,23 @@
869
1398
  <span class="cline-any cline-neutral">&nbsp;</span>
870
1399
  <span class="cline-any cline-neutral">&nbsp;</span>
871
1400
  <span class="cline-any cline-neutral">&nbsp;</span>
1401
+ <span class="cline-any cline-neutral">&nbsp;</span>
1402
+ <span class="cline-any cline-neutral">&nbsp;</span>
1403
+ <span class="cline-any cline-neutral">&nbsp;</span>
1404
+ <span class="cline-any cline-neutral">&nbsp;</span>
1405
+ <span class="cline-any cline-neutral">&nbsp;</span>
1406
+ <span class="cline-any cline-neutral">&nbsp;</span>
1407
+ <span class="cline-any cline-neutral">&nbsp;</span>
1408
+ <span class="cline-any cline-neutral">&nbsp;</span>
1409
+ <span class="cline-any cline-neutral">&nbsp;</span>
1410
+ <span class="cline-any cline-neutral">&nbsp;</span>
1411
+ <span class="cline-any cline-neutral">&nbsp;</span>
1412
+ <span class="cline-any cline-neutral">&nbsp;</span>
1413
+ <span class="cline-any cline-neutral">&nbsp;</span>
872
1414
  <span class="cline-any cline-no">&nbsp;</span>
873
1415
  <span class="cline-any cline-no">&nbsp;</span>
874
1416
  <span class="cline-any cline-neutral">&nbsp;</span>
1417
+ <span class="cline-any cline-neutral">&nbsp;</span>
875
1418
  <span class="cline-any cline-no">&nbsp;</span>
876
1419
  <span class="cline-any cline-no">&nbsp;</span>
877
1420
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -893,6 +1436,15 @@
893
1436
  <span class="cline-any cline-neutral">&nbsp;</span>
894
1437
  <span class="cline-any cline-neutral">&nbsp;</span>
895
1438
  <span class="cline-any cline-neutral">&nbsp;</span>
1439
+ <span class="cline-any cline-neutral">&nbsp;</span>
1440
+ <span class="cline-any cline-neutral">&nbsp;</span>
1441
+ <span class="cline-any cline-neutral">&nbsp;</span>
1442
+ <span class="cline-any cline-neutral">&nbsp;</span>
1443
+ <span class="cline-any cline-neutral">&nbsp;</span>
1444
+ <span class="cline-any cline-neutral">&nbsp;</span>
1445
+ <span class="cline-any cline-neutral">&nbsp;</span>
1446
+ <span class="cline-any cline-neutral">&nbsp;</span>
1447
+ <span class="cline-any cline-neutral">&nbsp;</span>
896
1448
  <span class="cline-any cline-no">&nbsp;</span>
897
1449
  <span class="cline-any cline-no">&nbsp;</span>
898
1450
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -906,33 +1458,49 @@
906
1458
  <span class="cline-any cline-neutral">&nbsp;</span>
907
1459
  <span class="cline-any cline-neutral">&nbsp;</span>
908
1460
  <span class="cline-any cline-neutral">&nbsp;</span>
909
- <span class="cline-any cline-yes">1015x</span>
910
- <span class="cline-any cline-yes">3x</span>
911
- <span class="cline-any cline-yes">3x</span>
912
1461
  <span class="cline-any cline-neutral">&nbsp;</span>
913
1462
  <span class="cline-any cline-neutral">&nbsp;</span>
914
1463
  <span class="cline-any cline-neutral">&nbsp;</span>
915
- <span class="cline-any cline-yes">1015x</span>
916
1464
  <span class="cline-any cline-neutral">&nbsp;</span>
917
1465
  <span class="cline-any cline-neutral">&nbsp;</span>
918
1466
  <span class="cline-any cline-neutral">&nbsp;</span>
1467
+ <span class="cline-any cline-yes">2x</span>
1468
+ <span class="cline-any cline-no">&nbsp;</span>
1469
+ <span class="cline-any cline-no">&nbsp;</span>
919
1470
  <span class="cline-any cline-neutral">&nbsp;</span>
920
1471
  <span class="cline-any cline-neutral">&nbsp;</span>
921
1472
  <span class="cline-any cline-neutral">&nbsp;</span>
1473
+ <span class="cline-any cline-yes">2x</span>
922
1474
  <span class="cline-any cline-neutral">&nbsp;</span>
923
- <span class="cline-any cline-yes">6x</span>
924
- <span class="cline-any cline-yes">6x</span>
925
1475
  <span class="cline-any cline-neutral">&nbsp;</span>
926
- <span class="cline-any cline-yes">5x</span>
927
- <span class="cline-any cline-yes">3x</span>
928
- <span class="cline-any cline-yes">2x</span>
929
1476
  <span class="cline-any cline-neutral">&nbsp;</span>
930
1477
  <span class="cline-any cline-neutral">&nbsp;</span>
931
- <span class="cline-any cline-yes">4x</span>
1478
+ <span class="cline-any cline-neutral">&nbsp;</span>
1479
+ <span class="cline-any cline-neutral">&nbsp;</span>
1480
+ <span class="cline-any cline-neutral">&nbsp;</span>
1481
+ <span class="cline-any cline-neutral">&nbsp;</span>
1482
+ <span class="cline-any cline-neutral">&nbsp;</span>
1483
+ <span class="cline-any cline-neutral">&nbsp;</span>
1484
+ <span class="cline-any cline-neutral">&nbsp;</span>
1485
+ <span class="cline-any cline-neutral">&nbsp;</span>
1486
+ <span class="cline-any cline-neutral">&nbsp;</span>
1487
+ <span class="cline-any cline-neutral">&nbsp;</span>
1488
+ <span class="cline-any cline-neutral">&nbsp;</span>
1489
+ <span class="cline-any cline-neutral">&nbsp;</span>
1490
+ <span class="cline-any cline-neutral">&nbsp;</span>
1491
+ <span class="cline-any cline-yes">3x</span>
1492
+ <span class="cline-any cline-neutral">&nbsp;</span>
1493
+ <span class="cline-any cline-yes">3x</span>
932
1494
  <span class="cline-any cline-neutral">&nbsp;</span>
933
1495
  <span class="cline-any cline-yes">2x</span>
1496
+ <span class="cline-any cline-yes">1x</span>
1497
+ <span class="cline-any cline-neutral">&nbsp;</span>
1498
+ <span class="cline-any cline-neutral">&nbsp;</span>
934
1499
  <span class="cline-any cline-yes">2x</span>
935
1500
  <span class="cline-any cline-neutral">&nbsp;</span>
1501
+ <span class="cline-any cline-yes">1x</span>
1502
+ <span class="cline-any cline-yes">1x</span>
1503
+ <span class="cline-any cline-neutral">&nbsp;</span>
936
1504
  <span class="cline-any cline-neutral">&nbsp;</span>
937
1505
  <span class="cline-any cline-neutral">&nbsp;</span>
938
1506
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -940,18 +1508,35 @@
940
1508
  <span class="cline-any cline-neutral">&nbsp;</span>
941
1509
  <span class="cline-any cline-neutral">&nbsp;</span>
942
1510
  <span class="cline-any cline-neutral">&nbsp;</span>
943
- <span class="cline-any cline-yes">132x</span>
944
- <span class="cline-any cline-yes">132x</span>
945
- <span class="cline-any cline-yes">132x</span>
946
1511
  <span class="cline-any cline-neutral">&nbsp;</span>
947
- <span class="cline-any cline-yes">132x</span>
948
1512
  <span class="cline-any cline-neutral">&nbsp;</span>
949
1513
  <span class="cline-any cline-neutral">&nbsp;</span>
950
1514
  <span class="cline-any cline-neutral">&nbsp;</span>
951
- <span class="cline-any cline-yes">4x</span>
952
1515
  <span class="cline-any cline-neutral">&nbsp;</span>
953
1516
  <span class="cline-any cline-neutral">&nbsp;</span>
954
- <span class="cline-any cline-yes">128x</span>
1517
+ <span class="cline-any cline-neutral">&nbsp;</span>
1518
+ <span class="cline-any cline-neutral">&nbsp;</span>
1519
+ <span class="cline-any cline-yes">71x</span>
1520
+ <span class="cline-any cline-yes">71x</span>
1521
+ <span class="cline-any cline-yes">71x</span>
1522
+ <span class="cline-any cline-neutral">&nbsp;</span>
1523
+ <span class="cline-any cline-yes">71x</span>
1524
+ <span class="cline-any cline-neutral">&nbsp;</span>
1525
+ <span class="cline-any cline-neutral">&nbsp;</span>
1526
+ <span class="cline-any cline-neutral">&nbsp;</span>
1527
+ <span class="cline-any cline-yes">5x</span>
1528
+ <span class="cline-any cline-neutral">&nbsp;</span>
1529
+ <span class="cline-any cline-neutral">&nbsp;</span>
1530
+ <span class="cline-any cline-yes">66x</span>
1531
+ <span class="cline-any cline-neutral">&nbsp;</span>
1532
+ <span class="cline-any cline-neutral">&nbsp;</span>
1533
+ <span class="cline-any cline-neutral">&nbsp;</span>
1534
+ <span class="cline-any cline-neutral">&nbsp;</span>
1535
+ <span class="cline-any cline-neutral">&nbsp;</span>
1536
+ <span class="cline-any cline-neutral">&nbsp;</span>
1537
+ <span class="cline-any cline-neutral">&nbsp;</span>
1538
+ <span class="cline-any cline-neutral">&nbsp;</span>
1539
+ <span class="cline-any cline-neutral">&nbsp;</span>
955
1540
  <span class="cline-any cline-neutral">&nbsp;</span>
956
1541
  <span class="cline-any cline-neutral">&nbsp;</span>
957
1542
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -969,6 +1554,14 @@
969
1554
  <span class="cline-any cline-neutral">&nbsp;</span>
970
1555
  <span class="cline-any cline-neutral">&nbsp;</span>
971
1556
  <span class="cline-any cline-neutral">&nbsp;</span>
1557
+ <span class="cline-any cline-neutral">&nbsp;</span>
1558
+ <span class="cline-any cline-neutral">&nbsp;</span>
1559
+ <span class="cline-any cline-neutral">&nbsp;</span>
1560
+ <span class="cline-any cline-neutral">&nbsp;</span>
1561
+ <span class="cline-any cline-neutral">&nbsp;</span>
1562
+ <span class="cline-any cline-neutral">&nbsp;</span>
1563
+ <span class="cline-any cline-neutral">&nbsp;</span>
1564
+ <span class="cline-any cline-neutral">&nbsp;</span>
972
1565
  <span class="cline-any cline-yes">6x</span>
973
1566
  <span class="cline-any cline-yes">6x</span>
974
1567
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -978,26 +1571,30 @@
978
1571
  <span class="cline-any cline-neutral">&nbsp;</span>
979
1572
  <span class="cline-any cline-neutral">&nbsp;</span>
980
1573
  <span class="cline-any cline-neutral">&nbsp;</span>
981
- <span class="cline-any cline-yes">22x</span>
1574
+ <span class="cline-any cline-neutral">&nbsp;</span>
1575
+ <span class="cline-any cline-neutral">&nbsp;</span>
1576
+ <span class="cline-any cline-neutral">&nbsp;</span>
1577
+ <span class="cline-any cline-neutral">&nbsp;</span>
1578
+ <span class="cline-any cline-neutral">&nbsp;</span>
1579
+ <span class="cline-any cline-neutral">&nbsp;</span>
1580
+ <span class="cline-any cline-yes">20x</span>
982
1581
  <span class="cline-any cline-yes">9x</span>
983
1582
  <span class="cline-any cline-yes">9x</span>
984
1583
  <span class="cline-any cline-neutral">&nbsp;</span>
985
- <span class="cline-any cline-yes">22x</span>
1584
+ <span class="cline-any cline-yes">20x</span>
986
1585
  <span class="cline-any cline-neutral">&nbsp;</span>
987
1586
  <span class="cline-any cline-neutral">&nbsp;</span>
988
1587
  <span class="cline-any cline-neutral">&nbsp;</span>
989
1588
  <span class="cline-any cline-neutral">&nbsp;</span>
990
1589
  <span class="cline-any cline-neutral">&nbsp;</span>
991
1590
  <span class="cline-any cline-neutral">&nbsp;</span>
992
- <span class="cline-any cline-yes">14x</span>
993
1591
  <span class="cline-any cline-neutral">&nbsp;</span>
994
1592
  <span class="cline-any cline-neutral">&nbsp;</span>
995
1593
  <span class="cline-any cline-neutral">&nbsp;</span>
996
1594
  <span class="cline-any cline-neutral">&nbsp;</span>
997
1595
  <span class="cline-any cline-neutral">&nbsp;</span>
1596
+ <span class="cline-any cline-yes">10x</span>
998
1597
  <span class="cline-any cline-neutral">&nbsp;</span>
999
- <span class="cline-any cline-yes">3x</span>
1000
- <span class="cline-any cline-yes">3x</span>
1001
1598
  <span class="cline-any cline-neutral">&nbsp;</span>
1002
1599
  <span class="cline-any cline-neutral">&nbsp;</span>
1003
1600
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -1005,7 +1602,47 @@
1005
1602
  <span class="cline-any cline-neutral">&nbsp;</span>
1006
1603
  <span class="cline-any cline-neutral">&nbsp;</span>
1007
1604
  <span class="cline-any cline-neutral">&nbsp;</span>
1008
- <span class="cline-any cline-yes">33x</span>
1605
+ <span class="cline-any cline-neutral">&nbsp;</span>
1606
+ <span class="cline-any cline-neutral">&nbsp;</span>
1607
+ <span class="cline-any cline-neutral">&nbsp;</span>
1608
+ <span class="cline-any cline-neutral">&nbsp;</span>
1609
+ <span class="cline-any cline-neutral">&nbsp;</span>
1610
+ <span class="cline-any cline-yes">2x</span>
1611
+ <span class="cline-any cline-yes">2x</span>
1612
+ <span class="cline-any cline-neutral">&nbsp;</span>
1613
+ <span class="cline-any cline-neutral">&nbsp;</span>
1614
+ <span class="cline-any cline-neutral">&nbsp;</span>
1615
+ <span class="cline-any cline-neutral">&nbsp;</span>
1616
+ <span class="cline-any cline-neutral">&nbsp;</span>
1617
+ <span class="cline-any cline-neutral">&nbsp;</span>
1618
+ <span class="cline-any cline-neutral">&nbsp;</span>
1619
+ <span class="cline-any cline-neutral">&nbsp;</span>
1620
+ <span class="cline-any cline-neutral">&nbsp;</span>
1621
+ <span class="cline-any cline-neutral">&nbsp;</span>
1622
+ <span class="cline-any cline-neutral">&nbsp;</span>
1623
+ <span class="cline-any cline-neutral">&nbsp;</span>
1624
+ <span class="cline-any cline-neutral">&nbsp;</span>
1625
+ <span class="cline-any cline-neutral">&nbsp;</span>
1626
+ <span class="cline-any cline-neutral">&nbsp;</span>
1627
+ <span class="cline-any cline-yes">11x</span>
1628
+ <span class="cline-any cline-neutral">&nbsp;</span>
1629
+ <span class="cline-any cline-neutral">&nbsp;</span>
1630
+ <span class="cline-any cline-neutral">&nbsp;</span>
1631
+ <span class="cline-any cline-neutral">&nbsp;</span>
1632
+ <span class="cline-any cline-neutral">&nbsp;</span>
1633
+ <span class="cline-any cline-neutral">&nbsp;</span>
1634
+ <span class="cline-any cline-neutral">&nbsp;</span>
1635
+ <span class="cline-any cline-neutral">&nbsp;</span>
1636
+ <span class="cline-any cline-neutral">&nbsp;</span>
1637
+ <span class="cline-any cline-neutral">&nbsp;</span>
1638
+ <span class="cline-any cline-neutral">&nbsp;</span>
1639
+ <span class="cline-any cline-neutral">&nbsp;</span>
1640
+ <span class="cline-any cline-neutral">&nbsp;</span>
1641
+ <span class="cline-any cline-yes">8x</span>
1642
+ <span class="cline-any cline-neutral">&nbsp;</span>
1643
+ <span class="cline-any cline-neutral">&nbsp;</span>
1644
+ <span class="cline-any cline-neutral">&nbsp;</span>
1645
+ <span class="cline-any cline-neutral">&nbsp;</span>
1009
1646
  <span class="cline-any cline-neutral">&nbsp;</span>
1010
1647
  <span class="cline-any cline-neutral">&nbsp;</span>
1011
1648
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -1014,7 +1651,6 @@
1014
1651
  <span class="cline-any cline-neutral">&nbsp;</span>
1015
1652
  <span class="cline-any cline-neutral">&nbsp;</span>
1016
1653
  <span class="cline-any cline-neutral">&nbsp;</span>
1017
- <span class="cline-any cline-yes">19x</span>
1018
1654
  <span class="cline-any cline-neutral">&nbsp;</span>
1019
1655
  <span class="cline-any cline-neutral">&nbsp;</span>
1020
1656
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -1033,6 +1669,15 @@
1033
1669
  <span class="cline-any cline-neutral">&nbsp;</span>
1034
1670
  <span class="cline-any cline-neutral">&nbsp;</span>
1035
1671
  <span class="cline-any cline-neutral">&nbsp;</span>
1672
+ <span class="cline-any cline-neutral">&nbsp;</span>
1673
+ <span class="cline-any cline-neutral">&nbsp;</span>
1674
+ <span class="cline-any cline-neutral">&nbsp;</span>
1675
+ <span class="cline-any cline-neutral">&nbsp;</span>
1676
+ <span class="cline-any cline-neutral">&nbsp;</span>
1677
+ <span class="cline-any cline-neutral">&nbsp;</span>
1678
+ <span class="cline-any cline-neutral">&nbsp;</span>
1679
+ <span class="cline-any cline-neutral">&nbsp;</span>
1680
+ <span class="cline-any cline-neutral">&nbsp;</span>
1036
1681
  <span class="cline-any cline-yes">4x</span>
1037
1682
  <span class="cline-any cline-yes">4x</span>
1038
1683
  <span class="cline-any cline-yes">4x</span>
@@ -1059,19 +1704,124 @@
1059
1704
  <span class="cline-any cline-neutral">&nbsp;</span>
1060
1705
  <span class="cline-any cline-neutral">&nbsp;</span>
1061
1706
  <span class="cline-any cline-neutral">&nbsp;</span>
1062
- <span class="cline-any cline-yes">5x</span></td><td class="text"><pre class="prettyprint lang-js">const Minio = require('minio');
1063
- const crypto = require('crypto');
1707
+ <span class="cline-any cline-neutral">&nbsp;</span>
1708
+ <span class="cline-any cline-neutral">&nbsp;</span>
1709
+ <span class="cline-any cline-neutral">&nbsp;</span>
1710
+ <span class="cline-any cline-neutral">&nbsp;</span>
1711
+ <span class="cline-any cline-neutral">&nbsp;</span>
1712
+ <span class="cline-any cline-neutral">&nbsp;</span>
1713
+ <span class="cline-any cline-neutral">&nbsp;</span>
1714
+ <span class="cline-any cline-neutral">&nbsp;</span>
1715
+ <span class="cline-any cline-neutral">&nbsp;</span>
1716
+ <span class="cline-any cline-neutral">&nbsp;</span>
1717
+ <span class="cline-any cline-neutral">&nbsp;</span>
1718
+ <span class="cline-any cline-neutral">&nbsp;</span>
1719
+ <span class="cline-any cline-neutral">&nbsp;</span>
1720
+ <span class="cline-any cline-neutral">&nbsp;</span>
1721
+ <span class="cline-any cline-neutral">&nbsp;</span>
1722
+ <span class="cline-any cline-neutral">&nbsp;</span>
1723
+ <span class="cline-any cline-neutral">&nbsp;</span>
1724
+ <span class="cline-any cline-neutral">&nbsp;</span>
1725
+ <span class="cline-any cline-neutral">&nbsp;</span>
1726
+ <span class="cline-any cline-yes">2x</span>
1727
+ <span class="cline-any cline-neutral">&nbsp;</span>
1728
+ <span class="cline-any cline-neutral">&nbsp;</span>
1729
+ <span class="cline-any cline-neutral">&nbsp;</span>
1730
+ <span class="cline-any cline-neutral">&nbsp;</span>
1731
+ <span class="cline-any cline-neutral">&nbsp;</span>
1732
+ <span class="cline-any cline-neutral">&nbsp;</span>
1733
+ <span class="cline-any cline-neutral">&nbsp;</span>
1734
+ <span class="cline-any cline-neutral">&nbsp;</span>
1735
+ <span class="cline-any cline-neutral">&nbsp;</span>
1736
+ <span class="cline-any cline-neutral">&nbsp;</span>
1737
+ <span class="cline-any cline-neutral">&nbsp;</span>
1738
+ <span class="cline-any cline-neutral">&nbsp;</span>
1739
+ <span class="cline-any cline-neutral">&nbsp;</span>
1740
+ <span class="cline-any cline-neutral">&nbsp;</span>
1741
+ <span class="cline-any cline-neutral">&nbsp;</span>
1742
+ <span class="cline-any cline-yes">2x</span>
1743
+ <span class="cline-any cline-neutral">&nbsp;</span>
1744
+ <span class="cline-any cline-neutral">&nbsp;</span>
1745
+ <span class="cline-any cline-neutral">&nbsp;</span>
1746
+ <span class="cline-any cline-neutral">&nbsp;</span>
1747
+ <span class="cline-any cline-neutral">&nbsp;</span>
1748
+ <span class="cline-any cline-yes">2x</span></td><td class="text"><pre class="prettyprint lang-js">/**
1749
+ * @module @onlineapps/conn-base-storage
1750
+ * @description MinIO storage connector with automatic SHA256 fingerprinting for OA Drive.
1751
+ * Provides immutable content storage with verification, caching, and presigned URLs.
1752
+ *
1753
+ * @see {@link https://github.com/onlineapps/oa-drive/tree/main/shared/connector/conn-base-storage|GitHub Repository}
1754
+ * @author OA Drive Team
1755
+ * @license MIT
1756
+ * @since 1.0.0
1757
+ */
1758
+ &nbsp;
1759
+ const { StorageCore } = require('@onlineapps/storage-core');
1064
1760
  const winston = require('winston');
1761
+ const SharedUrlAdapter = require('./sharedUrlAdapter');
1762
+ const runtimeCfg = require('./config');
1065
1763
  &nbsp;
1066
1764
  /**
1067
- * Storage Connector for MinIO with automatic fingerprinting
1068
- * Provides immutable content storage with verification
1765
+ * Storage connector for MinIO with automatic fingerprinting
1766
+ *
1767
+ * @class StorageConnector
1768
+ *
1769
+ * @example &lt;caption&gt;Basic Usage&lt;/caption&gt;
1770
+ * const storage = new StorageConnector({
1771
+ * endPoint: 'minio.example.com',
1772
+ * port: 9000,
1773
+ * accessKey: 'minioadmin',
1774
+ * secretKey: 'minioadmin'
1775
+ * });
1776
+ *
1777
+ * await storage.initialize();
1778
+ * const result = await storage.uploadWithFingerprint(
1779
+ * 'documents',
1780
+ * { type: 'invoice', amount: 1500 },
1781
+ * 'invoices'
1782
+ * );
1783
+ *
1784
+ * @example &lt;caption&gt;With Caching&lt;/caption&gt;
1785
+ * const storage = new StorageConnector({
1786
+ * cacheEnabled: true,
1787
+ * maxCacheSize: 200
1788
+ * });
1069
1789
  */
1070
1790
  class StorageConnector {
1071
- constructor(config = {}) {
1791
+ /**
1792
+ * Creates a new StorageConnector instance
1793
+ *
1794
+ * @constructor
1795
+ * @param {Object} [config={}] - Configuration options
1796
+ * @param {string} [config.endPoint='localhost'] - MinIO server endpoint
1797
+ * @param {number} [config.port=9000] - MinIO server port
1798
+ * @param {boolean} [config.useSSL=false] - Use SSL/TLS
1799
+ * @param {string} [config.accessKey='minioadmin'] - Access key
1800
+ * @param {string} [config.secretKey='minioadmin'] - Secret key
1801
+ * @param {string} [config.defaultBucket='api-storage'] - Default bucket name
1802
+ * @param {boolean} [config.cacheEnabled=true] - Enable content caching
1803
+ * @param {number} [config.maxCacheSize=100] - Maximum cache entries
1804
+ * @param {string} [config.logLevel='info'] - Logging level
1805
+ *
1806
+ * @example &lt;caption&gt;Full Configuration&lt;/caption&gt;
1807
+ * const storage = new StorageConnector({
1808
+ * endPoint: 'minio.example.com',
1809
+ * port: 9000,
1810
+ * useSSL: true,
1811
+ * accessKey: 'AKIAIOSFODNN7EXAMPLE',
1812
+ * secretKey: 'wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY',
1813
+ * defaultBucket: 'production-storage',
1814
+ * cacheEnabled: true,
1815
+ * maxCacheSize: 500
1816
+ * });
1817
+ */
1818
+ constructor(config = <span class="branch-0 cbranch-no" title="branch not covered" >{})</span> {
1819
+ // Resolve runtime configuration for wrapper behavior
1820
+ const resolved = runtimeCfg.resolve(config);
1821
+ &nbsp;
1072
1822
  // Logger setup
1073
1823
  this.logger = winston.createLogger({
1074
- level: config.logLevel || 'info',
1824
+ level: resolved.logLevel,
1075
1825
  format: winston.format.combine(
1076
1826
  winston.format.timestamp(),
1077
1827
  winston.format.json()
@@ -1081,58 +1831,80 @@ class StorageConnector {
1081
1831
  ]
1082
1832
  });
1083
1833
  &nbsp;
1084
- // MinIO client configuration
1085
- const minioConfig = {
1086
- endPoint: config.endPoint || process.env.MINIO_ENDPOINT || 'localhost',
1087
- port: parseInt(config.port || process.env.MINIO_PORT || 9000),
1088
- useSSL: config.useSSL || process.env.MINIO_USE_SSL === 'true',
1089
- accessKey: config.accessKey || process.env.MINIO_ACCESS_KEY || 'minioadmin',
1090
- secretKey: config.secretKey || process.env.MINIO_SECRET_KEY || 'minioadmin'
1091
- };
1834
+ // Create StorageCore instance (handles MinIO client internally)
1835
+ this.core = new StorageCore({
1836
+ endPoint: resolved.endPoint,
1837
+ port: resolved.port,
1838
+ useSSL: resolved.useSSL,
1839
+ accessKey: resolved.accessKey,
1840
+ secretKey: resolved.secretKey
1841
+ });
1842
+ &nbsp;
1843
+ // Expose MinIO client for backward compatibility
1844
+ this.client = this.core.client;
1845
+ this.minioClient = this.core.client;
1092
1846
  &nbsp;
1093
- this.client = new Minio.Client(minioConfig);
1094
- this.defaultBucket = config.defaultBucket || process.env.MINIO_DEFAULT_BUCKET || 'api-storage';
1847
+ this.defaultBucket = resolved.defaultBucket;
1095
1848
  &nbsp;
1096
1849
  // Store config for access in tests
1097
1850
  this.config = {
1098
- ...minioConfig,
1099
- bucketName: this.validateBucketName(config.bucketName || 'oa-drive-storage'),
1100
- cacheMaxSize: config.cacheMaxSize || 100
1851
+ endPoint: this.core.config.endPoint,
1852
+ port: this.core.config.port,
1853
+ useSSL: this.core.config.useSSL,
1854
+ accessKey: this.core.config.accessKey,
1855
+ secretKey: this.core.config.secretKey,
1856
+ bucketName: this.validateBucketName(config.bucketName || resolved.bucketName),
1857
+ cacheMaxSize: resolved.cacheMaxSize
1101
1858
  };
1102
- &nbsp;
1103
- // MinIO client
1104
- this.minioClient = this.client;
1105
1859
  &nbsp;
1106
1860
  // Cache configuration
1107
1861
  this.cacheEnabled = config.cacheEnabled !== false;
1108
1862
  this.cache = new Map();
1109
1863
  this.contentCache = new Map();
1110
- this.maxCacheSize = config.maxCacheSize || 100; // Max items in cache
1864
+ this.maxCacheSize = resolved.maxCacheSize;
1111
1865
  &nbsp;
1112
1866
  // Track initialization
1113
1867
  this.initialized = false;
1868
+ &nbsp;
1869
+ // Initialize shared URL adapter
1870
+ this.sharedUrl = new SharedUrlAdapter(this);
1114
1871
  &nbsp;
1115
1872
  this.logger.info('StorageConnector initialized', {
1116
- endpoint: minioConfig.endPoint,
1117
- port: minioConfig.port,
1873
+ endpoint: this.core.config.endPoint,
1874
+ port: this.core.config.port,
1118
1875
  defaultBucket: this.defaultBucket
1119
1876
  });
1120
1877
  }
1121
1878
  &nbsp;
1122
1879
  /**
1123
1880
  * Initialize connector and ensure bucket exists
1881
+ *
1882
+ * @async
1883
+ * @method initialize
1884
+ * @returns {Promise&lt;boolean&gt;} Returns true when initialized
1885
+ *
1886
+ * @throws {Error} If initialization fails
1887
+ *
1888
+ * @example
1889
+ * try {
1890
+ * await storage.initialize();
1891
+ * console.log('Storage ready');
1892
+ * } catch (error) {
1893
+ * console.error('Failed to initialize:', error);
1894
+ * }
1124
1895
  */
1125
1896
  async initialize() {
1126
1897
  try {
1127
- // Check if default bucket exists
1128
- const bucketExists = await this.client.bucketExists(this.defaultBucket);
1898
+ // Initialize StorageCore
1899
+ await this.core.initialize();
1129
1900
  &nbsp;
1130
- if (!bucketExists) {
1131
- // Create bucket with versioning
1132
- await this.client.makeBucket(this.defaultBucket, 'us-east-1');
1901
+ // Ensure default bucket exists (using StorageCore)
1902
+ const created = await this.core.ensureBucket(this.defaultBucket);
1903
+ &nbsp;
1904
+ if (created) {
1133
1905
  this.logger.info(`Bucket ${this.defaultBucket} created`);
1134
1906
  &nbsp;
1135
- // Set bucket policy for read access
1907
+ // Set bucket policy for read access (business-specific feature)
1136
1908
  const policy = {
1137
1909
  Version: '2012-10-17',
1138
1910
  Statement: [
@@ -1162,32 +1934,63 @@ class StorageConnector {
1162
1934
  &nbsp;
1163
1935
  /**
1164
1936
  * Generate SHA256 fingerprint for content
1937
+ *
1938
+ * @method generateFingerprint
1939
+ * @param {string|Buffer|Object} content - Content to fingerprint
1940
+ * @returns {string} SHA256 hash in hex format
1941
+ *
1942
+ * @example &lt;caption&gt;String Content&lt;/caption&gt;
1943
+ * const hash = storage.generateFingerprint('Hello World');
1944
+ * // Returns: SHA256 hash
1945
+ *
1946
+ * @example &lt;caption&gt;Object Content&lt;/caption&gt;
1947
+ * const hash = storage.generateFingerprint({ name: 'John', age: 30 });
1948
+ * // Returns consistent hash for the object
1165
1949
  */
1166
1950
  generateFingerprint(content) {
1167
- // Handle undefined and null
1168
- if (content === undefined || content === null) {
1169
- content = String(content);
1170
- } else if (typeof content === 'symbol') {
1171
- content = content.toString();
1172
- } else if (typeof content !== 'string' &amp;&amp; !Buffer.isBuffer(content)) {
1173
- // Handle circular references
1174
- try {
1175
- content = JSON.stringify(content);
1176
- } catch (err) {
1177
- // If circular reference, use a deterministic string representation
1178
- content = '[Circular Reference]';
1179
- }
1180
- }
1181
- &nbsp;
1182
- return crypto
1183
- .createHash('sha256')
1184
- .update(content)
1185
- .digest('hex');
1951
+ // Delegate to StorageCore
1952
+ return this.core.calculateFingerprint(content);
1186
1953
  }
1187
1954
  &nbsp;
1188
1955
  /**
1189
1956
  * Upload content with automatic fingerprinting
1190
- * Returns the fingerprint and storage path
1957
+ *
1958
+ * @async
1959
+ * @method uploadWithFingerprint
1960
+ * @param {string} bucket - Bucket name
1961
+ * @param {string|Buffer|Object} content - Content to upload
1962
+ * @param {string} [pathPrefix=''] - Path prefix for organization
1963
+ * @returns {Promise&lt;UploadResult&gt;} Upload result with fingerprint
1964
+ * @returns {string} result.fingerprint - SHA256 fingerprint
1965
+ * @returns {string} result.bucket - Bucket name
1966
+ * @returns {string} result.path - Storage path
1967
+ * @returns {string} result.url - Public URL
1968
+ * @returns {boolean} result.existed - Whether object already existed
1969
+ *
1970
+ * @throws {Error} If upload fails
1971
+ *
1972
+ * @example &lt;caption&gt;Upload JSON Object&lt;/caption&gt;
1973
+ * const result = await storage.uploadWithFingerprint(
1974
+ * 'invoices',
1975
+ * { invoiceId: 'INV-123', amount: 1500 },
1976
+ * '2024/01'
1977
+ * );
1978
+ * console.log(`Stored at: ${result.url}`);
1979
+ * console.log(`Fingerprint: ${result.fingerprint}`);
1980
+ *
1981
+ * @example &lt;caption&gt;Upload String Content&lt;/caption&gt;
1982
+ * const result = await storage.uploadWithFingerprint(
1983
+ * 'documents',
1984
+ * 'Important document content',
1985
+ * 'contracts'
1986
+ * );
1987
+ *
1988
+ * @example &lt;caption&gt;Upload Buffer&lt;/caption&gt;
1989
+ * const buffer = Buffer.from('Binary data');
1990
+ * const result = await storage.uploadWithFingerprint(
1991
+ * 'files',
1992
+ * buffer
1993
+ * );
1191
1994
  */
1192
1995
  async uploadWithFingerprint(bucket, content, pathPrefix = '') {
1193
1996
  try {
@@ -1212,9 +2015,9 @@ class StorageConnector {
1212
2015
  ? `${pathPrefix}/${fingerprint}.json`
1213
2016
  : `${fingerprint}.json`;
1214
2017
  &nbsp;
1215
- // Check if object already exists (immutable)
1216
- try {
1217
- await this.client.statObject(bucket, path);
2018
+ // Check if object already exists (immutable) - using StorageCore
2019
+ const exists = await this.core.objectExists(bucket, path);
2020
+ if (exists) {
1218
2021
  this.logger.debug(`Object already exists: ${bucket}/${path}`);
1219
2022
  &nbsp;
1220
2023
  return {
@@ -1224,16 +2027,13 @@ class StorageConnector {
1224
2027
  url: this.getPublicUrl(bucket, path),
1225
2028
  existed: true
1226
2029
  };
1227
- } catch (err) {
1228
- // Object doesn't exist, proceed with upload
1229
2030
  }
1230
2031
  &nbsp;
1231
- // Upload to MinIO
1232
- await this.client.putObject(
2032
+ // Upload to MinIO - using StorageCore
2033
+ await this.core.putObject(
1233
2034
  bucket,
1234
2035
  path,
1235
2036
  buffer,
1236
- buffer.length,
1237
2037
  {
1238
2038
  'Content-Type': 'application/json',
1239
2039
  'x-amz-meta-fingerprint': fingerprint,
@@ -1259,6 +2059,36 @@ class StorageConnector {
1259
2059
  &nbsp;
1260
2060
  /**
1261
2061
  * Download content and verify fingerprint
2062
+ *
2063
+ * @async
2064
+ * @method downloadWithVerification
2065
+ * @param {string} bucket - Bucket name
2066
+ * @param {string} path - Object path
2067
+ * @param {string} expectedFingerprint - Expected SHA256 fingerprint
2068
+ * @returns {Promise&lt;string&gt;} Content as string
2069
+ *
2070
+ * @throws {Error} If download fails or fingerprint mismatch
2071
+ *
2072
+ * @example &lt;caption&gt;Download with Verification&lt;/caption&gt;
2073
+ * const content = await storage.downloadWithVerification(
2074
+ * 'invoices',
2075
+ * '2024/01/abc123.json',
2076
+ * 'abc123...'
2077
+ * );
2078
+ * const data = JSON.parse(content);
2079
+ *
2080
+ * @example &lt;caption&gt;Handle Verification Failure&lt;/caption&gt;
2081
+ * try {
2082
+ * const content = await storage.downloadWithVerification(
2083
+ * 'documents',
2084
+ * 'contract.json',
2085
+ * expectedHash
2086
+ * );
2087
+ * } catch (error) {
2088
+ * if (error.message.includes('Fingerprint mismatch')) {
2089
+ * console.error('Content has been tampered!');
2090
+ * }
2091
+ * }
1262
2092
  */
1263
2093
  async downloadWithVerification(bucket, path, expectedFingerprint) {
1264
2094
  try {
@@ -1271,8 +2101,8 @@ class StorageConnector {
1271
2101
  return this.contentCache.get(cacheKey);
1272
2102
  }
1273
2103
  &nbsp;
1274
- // Download from MinIO
1275
- const stream = await this.client.getObject(bucket, path);
2104
+ // Download from MinIO - using StorageCore
2105
+ const stream = await this.core.getObject(bucket, path);
1276
2106
  &nbsp;
1277
2107
  // Collect stream data
1278
2108
  const chunks = [];
@@ -1281,16 +2111,14 @@ class StorageConnector {
1281
2111
  }
1282
2112
  const buffer = Buffer.concat(chunks);
1283
2113
  &nbsp;
1284
- // Verify fingerprint if provided
1285
- if (expectedFingerprint) {
1286
- const actualFingerprint = this.generateFingerprint(buffer);
1287
- &nbsp;
2114
+ // Verify fingerprint if provided - using StorageCore
2115
+ <span class="missing-if-branch" title="else path not taken" >E</span>if (expectedFingerprint) {
2116
+ const actualFingerprint = this.core.calculateFingerprint(buffer);
1288
2117
  if (actualFingerprint !== expectedFingerprint) {
1289
2118
  throw new Error(
1290
2119
  `Fingerprint mismatch! Expected: ${expectedFingerprint}, Got: ${actualFingerprint}`
1291
2120
  );
1292
2121
  }
1293
- &nbsp;
1294
2122
  this.logger.debug(`Fingerprint verified for ${bucket}/${path}`);
1295
2123
  }
1296
2124
  &nbsp;
@@ -1298,7 +2126,7 @@ class StorageConnector {
1298
2126
  const content = buffer.toString('utf8');
1299
2127
  &nbsp;
1300
2128
  // Update cache
1301
- if (this.cacheEnabled &amp;&amp; expectedFingerprint) {
2129
+ <span class="missing-if-branch" title="else path not taken" >E</span>if (this.cacheEnabled &amp;&amp; expectedFingerprint) {
1302
2130
  this.updateCache(cacheKey, content);
1303
2131
  }
1304
2132
  &nbsp;
@@ -1312,16 +2140,37 @@ class StorageConnector {
1312
2140
  &nbsp;
1313
2141
  /**
1314
2142
  * Get pre-signed URL for direct access
2143
+ *
2144
+ * @async
2145
+ * @method getPresignedUrl
2146
+ * @param {string} bucket - Bucket name
2147
+ * @param {string} path - Object path
2148
+ * @param {number} [expiry=3600] - URL expiry in seconds
2149
+ * @returns {Promise&lt;string&gt;} Pre-signed URL
2150
+ *
2151
+ * @throws {Error} If URL generation fails
2152
+ *
2153
+ * @example &lt;caption&gt;Generate Temporary URL&lt;/caption&gt;
2154
+ * const url = await storage.getPresignedUrl(
2155
+ * 'invoices',
2156
+ * '2024/01/invoice-123.json',
2157
+ * 7200 // 2 hours
2158
+ * );
2159
+ * // Share URL with external service
2160
+ *
2161
+ * @example &lt;caption&gt;Short-lived URL&lt;/caption&gt;
2162
+ * const url = await storage.getPresignedUrl(
2163
+ * 'temp',
2164
+ * 'report.pdf',
2165
+ * 300 // 5 minutes
2166
+ * );
1315
2167
  */
1316
2168
  <span class="fstat-no" title="function not covered" > as</span>ync getPresignedUrl(bucket, path, expiry = <span class="branch-0 cbranch-no" title="branch not covered" >3600)</span> {
1317
2169
  <span class="cstat-no" title="statement not covered" > try {</span>
1318
2170
  <span class="cstat-no" title="statement not covered" > bucket = bucket || this.defaultBucket;</span>
1319
2171
  &nbsp;
1320
- const url = <span class="cstat-no" title="statement not covered" >await this.client.presignedGetObject(</span>
1321
- bucket,
1322
- path,
1323
- expiry
1324
- );
2172
+ // Use StorageCore
2173
+ const url = <span class="cstat-no" title="statement not covered" >await this.core.getPresignedUrl(bucket, path, expiry);</span>
1325
2174
  &nbsp;
1326
2175
  <span class="cstat-no" title="statement not covered" > this.logger.debug(`Generated presigned URL for ${bucket}/${path}`);</span>
1327
2176
  <span class="cstat-no" title="statement not covered" > return url;</span>
@@ -1334,25 +2183,48 @@ class StorageConnector {
1334
2183
  &nbsp;
1335
2184
  /**
1336
2185
  * List objects with fingerprint metadata
2186
+ *
2187
+ * @async
2188
+ * @method listWithFingerprints
2189
+ * @param {string} bucket - Bucket name
2190
+ * @param {string} [prefix=''] - Path prefix to filter
2191
+ * @returns {Promise&lt;Array&lt;ObjectInfo&gt;&gt;} List of objects with metadata
2192
+ *
2193
+ * @example &lt;caption&gt;List All Objects&lt;/caption&gt;
2194
+ * const objects = await storage.listWithFingerprints('invoices');
2195
+ * objects.forEach(obj =&gt; {
2196
+ * console.log(`${obj.name}: ${obj.fingerprint}`);
2197
+ * });
2198
+ *
2199
+ * @example &lt;caption&gt;List with Prefix&lt;/caption&gt;
2200
+ * const objects = await storage.listWithFingerprints(
2201
+ * 'documents',
2202
+ * '2024/01/'
2203
+ * );
1337
2204
  */
1338
2205
  <span class="fstat-no" title="function not covered" > as</span>ync listWithFingerprints(bucket, prefix = <span class="branch-0 cbranch-no" title="branch not covered" >'')</span> {
1339
2206
  <span class="cstat-no" title="statement not covered" > try {</span>
1340
2207
  <span class="cstat-no" title="statement not covered" > bucket = bucket || this.defaultBucket;</span>
1341
2208
  &nbsp;
2209
+ // Use StorageCore to list objects
2210
+ const objectNames = <span class="cstat-no" title="statement not covered" >await this.core.listByPrefix(bucket, prefix, true);</span>
2211
+ &nbsp;
2212
+ // Get metadata for each object
1342
2213
  const objects = <span class="cstat-no" title="statement not covered" >[];</span>
1343
- const stream = <span class="cstat-no" title="statement not covered" >this.client.listObjectsV2(bucket, prefix, true);</span>
1344
- &nbsp;
1345
- <span class="cstat-no" title="statement not covered" > for await (const obj of stream) {</span>
1346
- // Get metadata for each object
1347
- const stat = <span class="cstat-no" title="statement not covered" >await this.client.statObject(bucket, obj.name);</span>
1348
- &nbsp;
1349
- <span class="cstat-no" title="statement not covered" > objects.push({</span>
1350
- name: obj.name,
1351
- size: obj.size,
1352
- lastModified: obj.lastModified,
1353
- fingerprint: stat.metaData['x-amz-meta-fingerprint'],
1354
- uploadedAt: stat.metaData['x-amz-meta-uploaded-at']
1355
- });
2214
+ <span class="cstat-no" title="statement not covered" > for (const name of objectNames) {</span>
2215
+ <span class="cstat-no" title="statement not covered" > try {</span>
2216
+ const stat = <span class="cstat-no" title="statement not covered" >await this.core.statObject(bucket, name);</span>
2217
+ <span class="cstat-no" title="statement not covered" > objects.push({</span>
2218
+ name,
2219
+ size: stat.size,
2220
+ lastModified: stat.lastModified,
2221
+ fingerprint: stat.metaData?.['x-amz-meta-fingerprint'],
2222
+ uploadedAt: stat.metaData?.['x-amz-meta-uploaded-at']
2223
+ });
2224
+ } catch (err) {
2225
+ // Skip objects that can't be stat'd
2226
+ <span class="cstat-no" title="statement not covered" > this.logger.warn(`Failed to stat object ${name}`, err);</span>
2227
+ }
1356
2228
  }
1357
2229
  &nbsp;
1358
2230
  <span class="cstat-no" title="statement not covered" > return objects;</span>
@@ -1365,12 +2237,26 @@ class StorageConnector {
1365
2237
  &nbsp;
1366
2238
  /**
1367
2239
  * Delete object (use with caution - breaks immutability)
2240
+ *
2241
+ * @async
2242
+ * @method deleteObject
2243
+ * @param {string} bucket - Bucket name
2244
+ * @param {string} path - Object path
2245
+ * @returns {Promise&lt;boolean&gt;} Returns true on successful deletion
2246
+ *
2247
+ * @throws {Error} If deletion fails
2248
+ *
2249
+ * @warning This breaks immutability - use only when necessary
2250
+ *
2251
+ * @example
2252
+ * await storage.deleteObject('temp', 'temporary-file.json');
1368
2253
  */
1369
2254
  <span class="fstat-no" title="function not covered" > as</span>ync deleteObject(bucket, path) {
1370
2255
  <span class="cstat-no" title="statement not covered" > try {</span>
1371
2256
  <span class="cstat-no" title="statement not covered" > bucket = bucket || this.defaultBucket;</span>
1372
2257
  &nbsp;
1373
- <span class="cstat-no" title="statement not covered" > await this.client.removeObject(bucket, path);</span>
2258
+ // Use StorageCore
2259
+ <span class="cstat-no" title="statement not covered" > await this.core.deleteObject(bucket, path);</span>
1374
2260
  <span class="cstat-no" title="statement not covered" > this.logger.warn(`Deleted object: ${bucket}/${path}`);</span>
1375
2261
  &nbsp;
1376
2262
  // Clear from cache
@@ -1389,6 +2275,15 @@ class StorageConnector {
1389
2275
  &nbsp;
1390
2276
  /**
1391
2277
  * Get public URL for an object
2278
+ *
2279
+ * @method getPublicUrl
2280
+ * @param {string} bucket - Bucket name
2281
+ * @param {string} path - Object path
2282
+ * @returns {string} Public URL
2283
+ *
2284
+ * @example
2285
+ * const url = storage.getPublicUrl('invoices', '2024/invoice-123.json');
2286
+ * // Returns: http://localhost:9000/invoices/2024/invoice-123.json
1392
2287
  */
1393
2288
  <span class="fstat-no" title="function not covered" > ge</span>tPublicUrl(bucket, path) {
1394
2289
  const protocol = <span class="cstat-no" title="statement not covered" >this.client.useSSL ? 'https' : 'http';</span>
@@ -1401,12 +2296,18 @@ class StorageConnector {
1401
2296
  &nbsp;
1402
2297
  /**
1403
2298
  * Update cache with LRU eviction
2299
+ *
2300
+ * @private
2301
+ * @method updateCache
2302
+ * @param {string} key - Cache key
2303
+ * @param {*} value - Value to cache
2304
+ * @returns {void}
1404
2305
  */
1405
2306
  updateCache(key, value) {
1406
2307
  // Remove oldest entry if cache is full
1407
- if (this.contentCache.size &gt;= this.maxCacheSize) {
1408
- const firstKey = this.contentCache.keys().next().value;
1409
- this.contentCache.delete(firstKey);
2308
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (this.contentCache.size &gt;= this.maxCacheSize) {
2309
+ const firstKey = <span class="cstat-no" title="statement not covered" >this.contentCache.keys().next().value;</span>
2310
+ <span class="cstat-no" title="statement not covered" > this.contentCache.delete(firstKey);</span>
1410
2311
  }
1411
2312
  &nbsp;
1412
2313
  // Add new entry
@@ -1416,13 +2317,23 @@ class StorageConnector {
1416
2317
  &nbsp;
1417
2318
  /**
1418
2319
  * Create bucket if not exists
2320
+ *
2321
+ * @async
2322
+ * @method ensureBucket
2323
+ * @param {string} bucketName - Bucket name to ensure
2324
+ * @returns {Promise&lt;boolean&gt;} Returns true when bucket exists
2325
+ *
2326
+ * @throws {Error} If bucket creation fails
2327
+ *
2328
+ * @example
2329
+ * await storage.ensureBucket('new-bucket');
1419
2330
  */
1420
2331
  async ensureBucket(bucketName) {
1421
2332
  try {
1422
- const exists = await this.client.bucketExists(bucketName);
2333
+ // Use StorageCore
2334
+ const created = await this.core.ensureBucket(bucketName);
1423
2335
  &nbsp;
1424
- if (!exists) {
1425
- await this.client.makeBucket(bucketName, 'us-east-1');
2336
+ if (created) {
1426
2337
  this.logger.info(`Bucket ${bucketName} created`);
1427
2338
  }
1428
2339
  &nbsp;
@@ -1435,6 +2346,14 @@ class StorageConnector {
1435
2346
  &nbsp;
1436
2347
  /**
1437
2348
  * Validate bucket name according to S3 standards
2349
+ *
2350
+ * @method validateBucketName
2351
+ * @param {string} name - Bucket name to validate
2352
+ * @returns {string} Valid bucket name or default
2353
+ *
2354
+ * @example
2355
+ * const validName = storage.validateBucketName('My-Bucket');
2356
+ * // Returns: 'oa-drive-storage' (invalid characters)
1438
2357
  */
1439
2358
  validateBucketName(name) {
1440
2359
  // S3 bucket naming rules
@@ -1453,7 +2372,16 @@ class StorageConnector {
1453
2372
  }
1454
2373
  &nbsp;
1455
2374
  /**
1456
- * Get object name with fingerprint
2375
+ * Get object name with fingerprint appended
2376
+ *
2377
+ * @method getObjectNameWithFingerprint
2378
+ * @param {string} originalName - Original file name
2379
+ * @param {string} fingerprint - SHA256 fingerprint
2380
+ * @returns {string} Name with fingerprint
2381
+ *
2382
+ * @example
2383
+ * const name = storage.getObjectNameWithFingerprint('document.pdf', 'abc123...');
2384
+ * // Returns: 'document-abc123...pdf'
1457
2385
  */
1458
2386
  getObjectNameWithFingerprint(originalName, fingerprint) {
1459
2387
  const parts = originalName.split('.');
@@ -1464,6 +2392,14 @@ class StorageConnector {
1464
2392
  &nbsp;
1465
2393
  /**
1466
2394
  * Extract fingerprint from object name
2395
+ *
2396
+ * @method extractFingerprintFromName
2397
+ * @param {string} objectName - Object name with fingerprint
2398
+ * @returns {string|null} Extracted fingerprint or null
2399
+ *
2400
+ * @example
2401
+ * const fp = storage.extractFingerprintFromName('document-abc123def456.pdf');
2402
+ * // Returns: 'abc123def456' if valid format
1467
2403
  */
1468
2404
  extractFingerprintFromName(objectName) {
1469
2405
  // Match pattern: name-&lt;64-char-hex&gt;.extension
@@ -1473,6 +2409,12 @@ class StorageConnector {
1473
2409
  &nbsp;
1474
2410
  /**
1475
2411
  * Add item to cache with size limit
2412
+ *
2413
+ * @private
2414
+ * @method addToCache
2415
+ * @param {string} key - Cache key
2416
+ * @param {*} value - Value to cache
2417
+ * @returns {void}
1476
2418
  */
1477
2419
  addToCache(key, value) {
1478
2420
  // Remove oldest if at max size
@@ -1485,6 +2427,11 @@ class StorageConnector {
1485
2427
  &nbsp;
1486
2428
  /**
1487
2429
  * Get item from cache
2430
+ *
2431
+ * @private
2432
+ * @method getFromCache
2433
+ * @param {string} key - Cache key
2434
+ * @returns {*} Cached value or undefined
1488
2435
  */
1489
2436
  getFromCache(key) {
1490
2437
  return this.cache.get(key);
@@ -1492,6 +2439,13 @@ class StorageConnector {
1492
2439
  &nbsp;
1493
2440
  /**
1494
2441
  * Clear all caches
2442
+ *
2443
+ * @method clearCache
2444
+ * @returns {void}
2445
+ *
2446
+ * @example
2447
+ * storage.clearCache();
2448
+ * // All cached content cleared
1495
2449
  */
1496
2450
  clearCache() {
1497
2451
  this.cache.clear();
@@ -1500,7 +2454,15 @@ class StorageConnector {
1500
2454
  &nbsp;
1501
2455
  /**
1502
2456
  * Get internal URL for service-to-service communication
1503
- * Returns abstract internal:// URL that will be resolved by adapter
2457
+ *
2458
+ * @method getInternalUrl
2459
+ * @param {string} bucket - Bucket name
2460
+ * @param {string} path - Object path
2461
+ * @returns {string} Internal URL with internal:// protocol
2462
+ *
2463
+ * @example
2464
+ * const url = storage.getInternalUrl('invoices', 'invoice-123.json');
2465
+ * // Returns: 'internal://storage/invoices/invoice-123.json'
1504
2466
  */
1505
2467
  getInternalUrl(bucket, path) {
1506
2468
  return `internal://storage/${bucket}/${path}`;
@@ -1508,7 +2470,12 @@ class StorageConnector {
1508
2470
  &nbsp;
1509
2471
  /**
1510
2472
  * Get public URL for an object
2473
+ *
1511
2474
  * @deprecated Use getInternalUrl() for service-to-service communication
2475
+ * @method getPublicUrl
2476
+ * @param {string} bucket - Bucket name
2477
+ * @param {string} path - Object path
2478
+ * @returns {string} Internal URL for backward compatibility
1512
2479
  */
1513
2480
  getPublicUrl(bucket, path) {
1514
2481
  // Pro zpětnou kompatibilitu, vrací internal URL
@@ -1517,10 +2484,22 @@ class StorageConnector {
1517
2484
  &nbsp;
1518
2485
  /**
1519
2486
  * Get presigned URL for temporary access
2487
+ *
2488
+ * @async
2489
+ * @method getPresignedUrl
2490
+ * @param {string} bucket - Bucket name
2491
+ * @param {string} objectName - Object name
2492
+ * @param {number} [expiry=86400] - URL expiry in seconds (default 24 hours)
2493
+ * @returns {Promise&lt;string&gt;} Pre-signed URL
2494
+ *
2495
+ * @throws {Error} If URL generation fails
2496
+ *
2497
+ * @example
2498
+ * const url = await storage.getPresignedUrl('documents', 'contract.pdf', 3600);
1520
2499
  */
1521
2500
  async getPresignedUrl(bucket, objectName, expiry = 86400) {
1522
2501
  try {
1523
- return await this.client.presignedGetUrl('GET', bucket, objectName, expiry);
2502
+ return await this.client.presignedUrl('GET', bucket, objectName, expiry);
1524
2503
  } catch (error) {
1525
2504
  <span class="cstat-no" title="statement not covered" > this.logger.error('Failed to generate presigned URL', error);</span>
1526
2505
  <span class="cstat-no" title="statement not covered" > throw error;</span>
@@ -1528,7 +2507,16 @@ class StorageConnector {
1528
2507
  }
1529
2508
  &nbsp;
1530
2509
  /**
1531
- * List objects with fingerprints
2510
+ * List objects with extracted fingerprints
2511
+ *
2512
+ * @async
2513
+ * @method listObjectsWithFingerprints
2514
+ * @param {string} bucket - Bucket name
2515
+ * @param {string} [prefix=''] - Path prefix to filter
2516
+ * @returns {Promise&lt;Array&lt;Object&gt;&gt;} List of objects with fingerprints
2517
+ *
2518
+ * @example
2519
+ * const objects = await storage.listObjectsWithFingerprints('invoices', '2024/');
1532
2520
  */
1533
2521
  async listObjectsWithFingerprints(bucket, prefix = '') {
1534
2522
  try {
@@ -1557,14 +2545,55 @@ class StorageConnector {
1557
2545
  }
1558
2546
  }
1559
2547
  &nbsp;
1560
- module.exports = StorageConnector;</pre></td></tr></table></pre>
2548
+ /**
2549
+ * @typedef {Object} UploadResult
2550
+ * @property {string} fingerprint - SHA256 fingerprint of content
2551
+ * @property {string} bucket - Bucket name
2552
+ * @property {string} path - Storage path
2553
+ * @property {string} url - Public or internal URL
2554
+ * @property {boolean} existed - Whether object already existed
2555
+ */
2556
+ &nbsp;
2557
+ /**
2558
+ * @typedef {Object} ObjectInfo
2559
+ * @property {string} name - Object name
2560
+ * @property {number} size - Object size in bytes
2561
+ * @property {Date} lastModified - Last modification date
2562
+ * @property {string} [fingerprint] - SHA256 fingerprint if available
2563
+ * @property {string} [uploadedAt] - Upload timestamp
2564
+ */
2565
+ &nbsp;
2566
+ // Export main class
2567
+ module.exports = StorageConnector;
2568
+ &nbsp;
2569
+ /**
2570
+ * Factory function to create storage instance
2571
+ *
2572
+ * @function create
2573
+ * @param {Object} config - Configuration object
2574
+ * @returns {StorageConnector} New storage connector instance
2575
+ *
2576
+ * @example
2577
+ * const storage = StorageConnector.create({
2578
+ * endPoint: 'minio.example.com',
2579
+ * accessKey: 'key',
2580
+ * secretKey: 'secret'
2581
+ * });
2582
+ */
2583
+ module.exports.create = <span class="fstat-no" title="function not covered" >(c</span>onfig) =&gt; <span class="cstat-no" title="statement not covered" >new StorageConnector(config);</span>
2584
+ &nbsp;
2585
+ /**
2586
+ * Current version
2587
+ * @constant {string}
2588
+ */
2589
+ module.exports.VERSION = '1.0.0';</pre></td></tr></table></pre>
1561
2590
 
1562
2591
  <div class='push'></div><!-- for sticky footer -->
1563
2592
  </div><!-- /wrapper -->
1564
2593
  <div class='footer quiet pad2 space-top1 center small'>
1565
2594
  Code coverage generated by
1566
2595
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
1567
- at 2025-09-16T13:05:27.726Z
2596
+ at 2025-12-22T11:22:15.884Z
1568
2597
  </div>
1569
2598
  <script src="prettify.js"></script>
1570
2599
  <script>