diff --git a/aaanalysis/feature_engineering/_backend/cpp/sequence_feature.py b/aaanalysis/feature_engineering/_backend/cpp/sequence_feature.py index e0afe54c..3860f5ed 100644 --- a/aaanalysis/feature_engineering/_backend/cpp/sequence_feature.py +++ b/aaanalysis/feature_engineering/_backend/cpp/sequence_feature.py @@ -136,6 +136,50 @@ def get_df_feat_(features=None, df_parts=None, labels=None, return df +# Scale-composition baseline featurization +def get_scale_composition_(df_parts=None, df_scales=None): + """Per-sequence scale average over the concatenated sequence parts (vectorized). + + For each row of ``df_parts`` the part strings are concatenated into one span; every + residue that is not a (single-letter) index label of ``df_scales`` (gaps ``'-'`` and + any other non-canonical symbol) is dropped, and the remaining residues' scale rows are + averaged column-wise into one value per scale, giving the ``(n_seq, n_scales)`` matrix. + A row whose span has no scored residue (empty / all-non-canonical) becomes all-``NaN``; + ``n_kept`` reports the number of averaged residues per row so the frontend can warn. + + Implementation: all residues of all spans are flattened into one byte array and mapped + to scale rows via a 256-entry lookup table; a single ``np.bincount`` tallies a small + per-sequence residue-count matrix ``(n_seq, n_letters)``, and one BLAS matmul against + the scale matrix yields the per-sequence sums — no per-sequence Python loop or + ``DataFrame.loc``, and the wide part scales with ``n_scales`` as a matmul, not a scatter. + """ + n_seq = len(df_parts) + scales_arr = df_scales.to_numpy(dtype=float) # (n_letters, n_scales) + n_letters = scales_arr.shape[0] + # Byte -> scale-row lookup (-1 = non-scored); only single-character labels can match a residue + lut = np.full(256, -1, dtype=np.intp) + for row, aa in enumerate(df_scales.index): + if len(aa) == 1 and ord(aa) < 256: + lut[ord(aa)] = row + # Flatten every residue of every span, tracking its owning sequence + # (df_parts columns are guaranteed str by the frontend's get_df_parts) + spans = df_parts.agg("".join, axis=1).to_list() + lengths = np.fromiter((len(s) for s in spans), dtype=np.intp, count=n_seq) + codes = np.frombuffer("".join(spans).encode("latin-1", "replace"), dtype=np.uint8) + seq_ids = np.repeat(np.arange(n_seq), lengths) + rows = lut[codes] # scale row per residue + valid = rows >= 0 + seq_ids, rows = seq_ids[valid], rows[valid] + # Per-sequence residue-count matrix (n_seq, n_letters) from one bincount, then sums via matmul + counts = np.bincount(seq_ids * n_letters + rows, + minlength=n_seq * n_letters).reshape(n_seq, n_letters) + n_kept = counts.sum(axis=1).astype(int) + sums = counts @ scales_arr # (n_seq, n_scales) + with np.errstate(invalid="ignore"): + X = sums / n_kept[:, None] # 0 / 0 -> NaN (empty rows) + return X, n_kept + + # Multi-class / regression label conversion def get_labels_ovr_(labels=None, label_test=1, label_ref=0): """One-vs-rest: per class, a full-length binary array (class -> test, rest -> ref).""" diff --git a/aaanalysis/feature_engineering/_sequence_feature.py b/aaanalysis/feature_engineering/_sequence_feature.py index 7d8e1cdb..bce94a0e 100644 --- a/aaanalysis/feature_engineering/_sequence_feature.py +++ b/aaanalysis/feature_engineering/_sequence_feature.py @@ -26,7 +26,7 @@ get_positions_, get_amino_acids_, get_df_pos_, get_df_pos_parts_) from ._backend.cpp.sequence_feature import (get_split_kws_, get_features_, get_feature_names_, - get_feature_descriptions_, get_df_feat_, + get_feature_descriptions_, get_df_feat_, get_scale_composition_, get_labels_ovr_, get_labels_ovo_, get_labels_quantile_, get_labels_tiered_) from ._backend.cpp_run import _pick_feature_matrix_builder @@ -853,6 +853,97 @@ def feature_matrix(self, start += n return list_X if batch else list_X[0] + def scale_composition(self, + df_seq: pd.DataFrame, + df_scales: Optional[pd.DataFrame] = None, + list_parts: Optional[Union[str, List[str]]] = None, + return_df: bool = False, + ) -> Union[ut.ArrayLike2D, pd.DataFrame]: + """ + Create the scale-composition baseline matrix for given sequences and scales. + + Builds the no-positional-split **scale-based baseline** featurization: for each + sequence the requested Parts are concatenated into one span, and every scale is + averaged over the residues of that span, yielding one value per scale. The result + is the ``(n_seq, n_scales)`` matrix ``X`` — the sequence's mean profile in + scale-space, the scale-based analogue of amino-acid composition. Unlike + :meth:`SequenceFeature.feature_matrix`, which averages each scale over the residues + of a specific Part-Split, this method averages each scale over the **whole span** + (a single mean per scale), with no positional information. + + **Application.** Use this to build a **baseline feature set** for a prediction + model: fit the same classifier on this scale-composition ``X`` and on a + :class:`CPP` :meth:`feature_matrix` and compare the scores to show how much the + positional Part-Split-Scale features add over a plain scale-average encoding (the + "scale baseline vs CPP" comparison). It is *not* a positional feature set — reach + for :class:`CPP` when you need where-along-the-sequence information. + + .. versionadded:: 1.1.0 + + Parameters + ---------- + df_seq : pd.DataFrame, shape (n_samples, n_seq_info) + DataFrame containing an ``entry`` column with unique protein identifiers and sequence information + in a distinct format: **Position-based**, **Part-based**, **Sequence-based**, or **Sequence-TMD-based** + (the same input accepted by :meth:`SequenceFeature.get_df_parts`). + df_scales : pd.DataFrame, shape (n_letters, n_scales), optional + DataFrame of scales with letters (amino acids) as index. Default from :meth:`load_scales` + unless specified in ``options['df_scales']``. The index defines which residues are scored; + residues absent from it are dropped before averaging. + list_parts : str or list of str, optional + Names of the sequence parts to average over (see :class:`SequenceFeature` for valid parts). + If ``None`` (default), the whole TMD-JMD span ``jmd_n`` + ``tmd`` + ``jmd_c`` (the ``tmd_jmd`` + part) is used. Multiple parts are concatenated per sequence before averaging. + return_df : bool, default=False + If ``True``, return a labeled ``pd.DataFrame`` (rows indexed like ``df_parts``, one column per + scale) instead of a plain numpy array. + + Returns + ------- + X : array-like, shape (n_samples, n_scales) + Scale-average matrix containing, per sequence, the mean of each scale over the span residues. + Returned as a ``pd.DataFrame`` (scale names as columns) when ``return_df=True``. + + Notes + ----- + * **Missing / non-canonical residues**: a residue is averaged only if it is an index label of + ``df_scales``. Gap symbols (``'-'``) and any other non-canonical symbol (e.g. ``'X'``) are + dropped per the package convention, so the mean is taken over the scored residues only. + * A sequence whose span has **no** scored residue (empty span, or all residues non-canonical) + yields an all-``NaN`` row; a ``UserWarning`` naming the count is emitted when ``verbose=True``. + * This is a no-positional-split mean only; positional splits remain the job of :class:`CPP`. + + See Also + -------- + * :meth:`SequenceFeature.feature_matrix` for the positional Part-Split-Scale feature matrix. + * :meth:`SequenceFeature.get_df_parts` for the part-slicing used to build the span. + + Examples + -------- + .. include:: examples/sf_scale_composition.rst + """ + # Load defaults + if df_scales is None: + df_scales = ut.load_default_scales() + # Check input + ut.check_df_seq(df_seq=df_seq) + check_df_scales(df_scales=df_scales) + ut.check_bool(name="return_df", val=return_df) + list_parts = ut.check_list_parts(list_parts=list_parts, return_default=False, accept_none=True) + # Resolve parts: None -> whole TMD-JMD span (jmd_n + tmd + jmd_c, the "tmd_jmd" part) + list_parts_used = ["tmd_jmd"] if list_parts is None else list_parts + # Build the sequence parts and the scale-average matrix + df_parts = self.get_df_parts(df_seq=df_seq, list_parts=list_parts_used) + X, n_kept = get_scale_composition_(df_parts=df_parts, df_scales=df_scales) + # Warn about rows that had no scored residue (all-NaN output) + n_empty = int((n_kept == 0).sum()) + if n_empty > 0 and self.verbose: + warnings.warn(f"{n_empty} sequence(s) have no scored residue in the selected parts " + f"(empty or all non-canonical); their scale-average row is all-NaN.") + if return_df: + return pd.DataFrame(X, index=df_parts.index, columns=list(df_scales.columns)) + return X + def prune_by_variance(self, df_feat: pd.DataFrame, df_parts: Optional[pd.DataFrame] = None, diff --git a/docs/source/index/release_notes.rst b/docs/source/index/release_notes.rst index c715505d..f449801f 100644 --- a/docs/source/index/release_notes.rst +++ b/docs/source/index/release_notes.rst @@ -58,6 +58,15 @@ Added - **SequenceFeature.get_labels_quantile / get_labels_tiered**: Discretize a continuous target into binary ``labels`` — a single quantile cut, or a fixed positive set swept against stepwise-lowered negative cuts (each tier row-matched). +- **SequenceFeature.scale_composition**: Scale-composition baseline featurizer that turns + sequences + scales into a ``(n_seq, n_scales)`` matrix by averaging each scale over a + sequence span (``list_parts=None`` → whole ``jmd_n`` + ``tmd`` + ``jmd_c``), dropping + missing / non-canonical residues — the sequence's mean profile in scale-space (the + scale-based analogue of amino-acid composition). The no-positional-split baseline to + compare against ``feature_matrix`` / CPP; optional ``return_df=True`` for a labeled frame. +- **SequenceFeature.get_df_parts_from_windows**: Assemble a reference ``df_parts`` from + per-part window sets (e.g. ``AAWindowSampler.sample_synthetic`` output). +- **SequenceFeature.get_seq_kws**: Return one protein's ``{jmd_n_seq, tmd_seq, jmd_c_seq}`` - :meth:`~aaanalysis.SequenceFeature.get_df_parts_from_windows`: Assemble a reference ``df_parts`` from per-part window sets (e.g. :meth:`~aaanalysis.AAWindowSampler.sample_synthetic` output). - :meth:`~aaanalysis.SequenceFeature.get_seq_kws`: Return one protein's ``{jmd_n_seq, tmd_seq, jmd_c_seq}`` diff --git a/examples/feature_engineering/sf_scale_composition.ipynb b/examples/feature_engineering/sf_scale_composition.ipynb new file mode 100644 index 00000000..da2749a5 --- /dev/null +++ b/examples/feature_engineering/sf_scale_composition.ipynb @@ -0,0 +1,7299 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "9acb0004", + "metadata": {}, + "source": [ + "``SequenceFeature().scale_composition()`` builds a **baseline feature set** for a prediction model. For each sequence it averages every scale over the residues of a span, giving the ``(n_seq, n_scales)`` matrix ``X`` — the sequence's mean profile in scale-space (the scale-based analogue of amino-acid composition), with no positional information. Its purpose is **comparison**: fit the same classifier on this ``X`` and on a :class:`CPP` ``feature_matrix``, and compare the scores to see how much CPP's positional Part-Split-Scale features add over a plain scale average. Here we load the ``DOM_GSEC`` example dataset and the bundled scales (see [Breimann25]_):" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "8e60701a", + "metadata": { + "execution": { + "iopub.execute_input": "2026-07-03T19:32:57.502737Z", + "iopub.status.busy": "2026-07-03T19:32:57.502420Z", + "iopub.status.idle": "2026-07-03T19:32:58.952045Z", + "shell.execute_reply": "2026-07-03T19:32:58.951746Z" + } + }, + "outputs": [], + "source": [ + "import aaanalysis as aa\n", + "aa.options[\"verbose\"] = False\n", + "df_seq = aa.load_dataset(name=\"DOM_GSEC\")\n", + "df_scales = aa.load_scales()\n", + "sf = aa.SequenceFeature()" + ] + }, + { + "cell_type": "markdown", + "id": "a4a1a500", + "metadata": {}, + "source": [ + "By default (``list_parts=None``) the whole TMD-JMD span (``jmd_n`` + ``tmd`` + ``jmd_c``) is averaged. Residues that are not in the scale index (gaps ``'-'`` and other non-canonical symbols) are dropped before averaging:" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "3bbd88cf", + "metadata": { + "execution": { + "iopub.execute_input": "2026-07-03T19:32:58.953279Z", + "iopub.status.busy": "2026-07-03T19:32:58.953208Z", + "iopub.status.idle": "2026-07-03T19:32:58.970492Z", + "shell.execute_reply": "2026-07-03T19:32:58.970301Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "n samples: 126\n", + "n scales: 586\n", + "Shape of X: (126, 586)\n" + ] + } + ], + "source": [ + "X = sf.scale_composition(df_seq=df_seq, df_scales=df_scales)\n", + "print(f\"n samples: {X.shape[0]}\")\n", + "print(f\"n scales: {X.shape[1]}\")\n", + "print(f\"Shape of X: {X.shape}\")" + ] + }, + { + "cell_type": "markdown", + "id": "3f9c4c67", + "metadata": {}, + "source": [ + "With ``return_df=True`` the matrix is returned as a labeled ``pd.DataFrame`` (rows indexed by protein entry, one column per scale):" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "2deceb47", + "metadata": { + "execution": { + "iopub.execute_input": "2026-07-03T19:32:58.971539Z", + "iopub.status.busy": "2026-07-03T19:32:58.971465Z", + "iopub.status.idle": "2026-07-03T19:32:59.068314Z", + "shell.execute_reply": "2026-07-03T19:32:59.068111Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "DataFrame shape: (126, 586)\n" + ] + }, + { + "data": { + "text/html": [ + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
 ANDN920101ARGP820101ARGP820102ARGP820103BEGF750101BEGF750102BEGF750103BHAR880101BIGC670101BIOV880101BIOV880102BROC820101BROC820102BULH740101BULH740102BUNA790101BUNA790102BUNA790103BURA740101BURA740102CHAM810101CHAM820101CHAM820102CHAM830101CHAM830102CHAM830103CHAM830104CHAM830105CHAM830106CHAM830107CHAM830108CHOC750101CHOC760101CHOC760102CHOC760103CHOC760104CHOP780101CHOP780201CHOP780202CHOP780203CHOP780204CHOP780205CHOP780206CHOP780207CHOP780208CHOP780209CHOP780210CHOP780211CHOP780212CHOP780213CHOP780214CHOP780215CHOP780216CIDH920101CIDH920102CIDH920103CIDH920104CIDH920105COHE430101CRAJ730101CRAJ730102CRAJ730103DAWD720101DAYM780101DAYM780201DESM900101DESM900102EISD840101EISD860101EISD860102EISD860103FASG760101FASG760102FASG760103FASG760104FASG760105FAUJ830101FAUJ880101FAUJ880102FAUJ880103FAUJ880104FAUJ880105FAUJ880106FAUJ880107FAUJ880108FAUJ880109FAUJ880110FAUJ880111FAUJ880112FAUJ880113FINA770101FINA910101FINA910102FINA910103FINA910104GARJ730101GEIM800101GEIM800102GEIM800103GEIM800104GEIM800105GEIM800106GEIM800107GEIM800108GEIM800109GEIM800110GEIM800111GOLD730101GOLD730102GRAR740101GRAR740102GRAR740103GUYH850101HOPA770101HOPT810101HUTJ700101HUTJ700102HUTJ700103ISOY800101ISOY800102ISOY800103ISOY800104ISOY800105ISOY800106ISOY800107ISOY800108JANJ780101JANJ780102JANJ780103JANJ790101JANJ790102JOND750101JOND750102JOND920101JOND920102JUKT750101JUNJ780101KANM800101KANM800102KANM800103KANM800104KARP850101KARP850102KARP850103KHAG800101KLEP840101KRIW710101KRIW790101KRIW790102KRIW790103KYTJ820101LAWE840101LEVM760101LEVM760102LEVM760103LEVM760104LEVM760105LEVM760106LEVM760107LEVM780101LEVM780102LEVM780103LEVM780104LEVM780105LEVM780106LEWP710101LIFS790101LIFS790102LIFS790103MANP780101MAXF760101MAXF760102MAXF760103MAXF760104MAXF760105MAXF760106MCMT640101MEEJ800101MEEJ800102MEEJ810101MEEJ810102MEIH800101MEIH800102MEIH800103MIYS850101NAGK730101NAGK730102NAGK730103NAKH900101NAKH900102NAKH900103NAKH900104NAKH900105NAKH900106NAKH900107NAKH900108NAKH900109NAKH900110NAKH900111NAKH900112NAKH900113NAKH920101NAKH920102NAKH920103NAKH920104NAKH920105NAKH920106NAKH920107NAKH920108NISK800101NISK860101NOZY710101OOBM770101OOBM770102OOBM770103OOBM770104OOBM770105OOBM850101OOBM850102OOBM850103OOBM850104OOBM850105PALJ810101PALJ810102PALJ810103PALJ810104PALJ810105PALJ810106PALJ810107PALJ810108PALJ810109PALJ810110PALJ810111PALJ810112PALJ810113PALJ810114PALJ810115PALJ810116PARJ860101PLIV810101PONP800101PONP800102PONP800103PONP800104PONP800105PONP800106PONP800107PONP800108PRAM820101PRAM820102PRAM820103PRAM900101PRAM900102PRAM900103PRAM900104PTIO830101PTIO830102QIAN880101QIAN880102QIAN880103QIAN880104QIAN880105QIAN880106QIAN880107QIAN880108QIAN880109QIAN880110QIAN880111QIAN880112QIAN880113QIAN880114QIAN880115QIAN880116QIAN880117QIAN880118QIAN880119QIAN880120QIAN880121QIAN880122QIAN880123QIAN880124QIAN880125QIAN880126QIAN880127QIAN880128QIAN880129QIAN880130QIAN880131QIAN880132QIAN880133QIAN880134QIAN880135QIAN880136QIAN880137QIAN880138QIAN880139RACS770101RACS770102RACS770103RACS820101RACS820102RACS820103RACS820104RACS820105RACS820106RACS820107RACS820108RACS820109RACS820110RACS820111RACS820112RACS820113RACS820114RADA880101RADA880102RADA880103RADA880104RADA880105RADA880106RADA880107RADA880108RICJ880101RICJ880102RICJ880103RICJ880104RICJ880105RICJ880106RICJ880107RICJ880108RICJ880109RICJ880110RICJ880111RICJ880112RICJ880113RICJ880114RICJ880115RICJ880116RICJ880117ROBB760101ROBB760102ROBB760103ROBB760104ROBB760105ROBB760106ROBB760107ROBB760108ROBB760109ROBB760110ROBB760111ROBB760112ROBB760113ROBB790101ROSG850101ROSG850102ROSM880101ROSM880102ROSM880103SIMZ760101SNEP660101SNEP660102SNEP660103SNEP660104SUEM840101SUEM840102SWER830101TANS770101TANS770102TANS770103TANS770104TANS770105TANS770106TANS770107TANS770108TANS770109TANS770110VASM830101VASM830102VASM830103VELV850101VENT840101VHEG790101WARP780101WEBA780101WERD780101WERD780102WERD780103WERD780104WOEC730101WOLR810101WOLS870101WOLS870102WOLS870103YUTK870101YUTK870102YUTK870103YUTK870104ZASB820101ZIMJ680101ZIMJ680102ZIMJ680103ZIMJ680104ZIMJ680105AURR980101AURR980102AURR980103AURR980104AURR980105AURR980106AURR980107AURR980108AURR980109AURR980110AURR980111AURR980112AURR980113AURR980114AURR980115AURR980116AURR980117AURR980118AURR980119AURR980120ONEK900101ONEK900102VINM940101VINM940102VINM940103VINM940104MUNV940101MUNV940102MUNV940103MUNV940104MUNV940105WIMW960101KIMC930101MONM990101BLAM930101PARS000101PARS000102KUMS000101KUMS000102KUMS000103KUMS000104TAKK010101FODM020101NADH010101NADH010102NADH010103NADH010104NADH010105NADH010106NADH010107MONM990201KOEP990101KOEP990102CEDJ970101CEDJ970102CEDJ970103CEDJ970104CEDJ970105FUKS010101FUKS010102FUKS010103FUKS010104FUKS010105FUKS010106FUKS010107FUKS010108FUKS010109FUKS010110FUKS010111FUKS010112MITS020101TSAJ990101TSAJ990102COSI940101PONP930101WILM950101WILM950102WILM950103WILM950104KUHL950101GUOD860101JURD980101BASU050101BASU050102BASU050103SUYM030101PUNT030101PUNT030102GEOR030101GEOR030102GEOR030103GEOR030104GEOR030105GEOR030106GEOR030107GEOR030108GEOR030109ZHOH040101ZHOH040102ZHOH040103BAEK050101HARY940101PONJ960101DIGM050101WOLR790101OLSK800101KIDA850101GUYH850102GUYH850104GUYH850105JACR890101COWR900101BLAS910101CASG920101CORJ870101CORJ870102CORJ870103CORJ870104CORJ870105CORJ870106CORJ870107CORJ870108MIYS990101MIYS990102MIYS990103MIYS990104MIYS990105ENGD860101FASG890101KARS160101KARS160102KARS160103KARS160104KARS160105KARS160106KARS160107KARS160108KARS160109KARS160110KARS160111KARS160112KARS160113KARS160114KARS160115KARS160116KARS160117KARS160118KARS160119KARS160120KARS160121KARS160122LINS030101LINS030102LINS030103LINS030104LINS030105LINS030106LINS030107LINS030108LINS030109LINS030110LINS030111LINS030112LINS030113LINS030114LINS030115LINS030116LINS030117LINS030118LINS030119LINS030120LINS030121KOEH090101KOEH090102KOEH090103KOEH090104KOEH090105KOEH090106KOEH090107KOEH090108KOEH090109KOEH090110KOEH090111KOEH090112
entry                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          
P050670.3483950.3742090.3210230.3618370.6411160.5857670.4123490.5433720.4607210.5419300.5945350.4229530.5408840.5465120.5506050.9552090.4429530.6862790.5234420.4800230.6489300.3510930.3712090.3208600.5130470.5930230.3023260.1861400.3581400.0930230.2790700.4304190.4482560.2357670.5833020.5623490.3631630.4903950.5832090.3971160.1953490.6022330.5311400.4653720.5320230.4531860.3594650.3657670.2816980.2009070.3249300.2330700.3056510.5801630.4633490.4658600.4656510.4910470.5712790.4600930.5891860.4103720.5914420.6375350.5166510.5453020.6195350.7397670.6254420.1374420.5740000.3747210.5958370.8370700.4858140.6866050.4907210.5805120.7094880.3858600.4247210.6546280.4375350.6495120.1960470.1279070.1860470.1395350.0465120.7719070.5876280.1601160.0273260.3186050.6304420.0730930.4362790.4832560.4974880.3859530.5301400.7016280.5916740.2933490.4879770.3376980.2846740.4323950.4541630.1342090.3622330.4508600.4459770.2698600.4629070.4087210.4547910.3825810.5550700.5352330.3878600.1711160.3316740.4215580.2555350.2381400.2824190.5918140.2827910.3651860.6883260.3737910.8821630.5938840.6581630.6511860.6492090.5296510.5336280.5443490.5368140.4702330.5028140.4441400.2399300.5232560.6351160.4608600.3461160.4567210.5951630.3745350.4592790.4643720.8628840.3033720.4529770.5088840.2083260.5200700.5548600.2954420.5043020.5366510.3054420.3322560.5525810.4625350.5244650.5388370.4642790.6190470.2280230.2005810.2646980.2938140.3390000.6292790.4100470.3398600.3018370.4883950.4111630.5629300.5020700.4319300.6620700.3904650.5907210.6132090.3673490.4595580.3315810.4203260.4759300.4763950.5362090.4412090.4350470.3176050.3686740.6031860.4670930.6255810.4788140.3810470.6264420.5821860.4579300.4827910.5443020.2584190.3320000.3379070.4903950.6934190.6016510.7199530.7317210.4559070.5177210.5312330.4680700.4964880.5730230.5537440.3099070.3389770.4795810.4335810.4297210.4611630.4984650.5143720.3452090.4827440.4222790.3720930.5002330.4799530.5178370.4928840.5125810.5241630.6063260.4163720.4780000.5143950.5306980.4415810.6819070.2282790.5200700.5548600.3049770.7362330.4755810.4887670.5335120.4086050.5414880.5371160.6035580.6605580.7170700.7222560.7055580.6625120.6066510.4850930.4690700.5555580.5198600.6424190.6137670.5844650.5732090.6137670.6634190.5090470.4605350.4546050.4721860.5555350.4825350.5240470.4196740.2814190.3237440.3393720.2342090.2429070.3426280.2806980.3520470.5123950.4946980.4253490.2812790.3577910.4230930.5401630.2456980.4218370.3032330.3855580.6703720.1665120.3042090.5616050.4763720.3480230.1938600.7712560.5628840.6127670.7965810.7676280.5698840.7553950.5808370.4214650.4214650.2194190.2315120.2445580.1651400.3503720.4787440.5255580.4046980.4162330.5210930.3855350.3085580.2758600.4690000.3400000.5350700.1903260.7813020.7773490.5184880.6008840.3001630.3758370.3007910.3761630.4476280.3669070.3866510.4042330.3901860.6082560.2609070.3521400.3579530.4680000.6027670.6515120.3098600.3453950.5729070.2286280.4656510.4635350.4363950.5908140.1754650.3936740.4471630.2235580.3105350.3122560.4670470.5603020.4756980.3043020.2474880.4186050.2408600.5970700.8304420.4849770.3168840.3000000.5714420.2596980.8073950.5123490.4484650.3678600.6398140.6838140.9744190.9679300.4082790.4689070.6723720.1890000.4267910.5081160.4905810.6342090.4615120.2877440.4435810.3207440.2475580.5706280.5163490.5070700.4990930.4955580.4567670.6211400.5020470.5940470.2620230.4836980.3843260.5259300.8248600.1259530.4115580.5770700.5056280.3078140.3033950.2665810.3433020.1474420.1310930.5074880.2563950.3542090.9041400.5795120.4685580.6771160.6597670.4368600.4467210.4436510.5508140.7058140.6441160.5466050.4996050.4501400.4181860.3844420.3721160.2850930.3268840.6234420.5645350.4846280.6445810.5907910.3145120.3957440.5385350.3836740.5195810.5148370.6229300.3390230.6335350.6642090.6347210.5312790.0844420.4348600.4348370.2475810.5034880.4531160.3537210.3296980.4252330.2746510.4522330.6119300.5588140.4397910.5520700.5020470.4413260.3750930.3559770.2106980.5069770.5580000.6029300.4880930.2978370.4908600.1271630.3461400.4727440.4225350.4830230.4356050.4186050.6442330.8086280.5713260.4443950.5631160.3045580.2481860.8604190.6364650.6060230.4896740.5266280.4611630.5360470.5389070.5965350.5753490.5846740.4173490.5316740.5240700.4142560.4087440.4023260.2283020.4776740.3395350.2867670.2886740.3357670.3425120.2789770.3705810.6309770.5861860.4211400.5646280.4870930.3617440.4055580.4981400.3808840.3451160.4019530.6150470.8072090.5371160.2496280.4450000.4450700.2174880.2564420.2273490.2265120.3388840.3633950.3012790.3490930.3523490.2511860.4845350.4929770.3575350.2738370.2786510.2223020.3368600.3936280.3274420.4303490.2920000.2611860.4048370.4459770.3116740.4413260.3750930.3276980.3027210.5128840.314140
P149250.3664880.4207910.3923720.4243260.6411160.5527440.4329300.5449070.4924420.5640000.6161630.4983490.5940230.4721630.6097440.9097670.4731860.6557910.5202790.5150470.6694880.3784650.3480930.3242090.5064880.5813950.3372090.1628600.3674420.0465120.2093020.4623260.4682790.2360000.5825810.5517910.3591160.4877210.5812330.3802790.2080230.5635350.5005120.4309530.5272560.4488840.3335810.3879070.2608600.2328370.2901860.2298370.3139070.6020000.4841630.4764880.4797910.5089770.6224880.4471630.5853490.4117910.6245810.6706740.4687670.5354650.6150930.7383020.6371160.1642790.6287910.3955580.5984880.7864420.5093720.6759300.5308840.5980700.7198840.4146050.4563020.6618840.4765350.6989300.1931400.1395350.1802330.1162790.0465120.7550700.6122560.1708370.0710000.3581400.5999300.1051160.4260230.5037210.4475350.3730930.5477440.7162790.6013950.2847440.4754420.3342560.2850700.4973020.4847210.1312790.3134650.4747210.4484650.2462560.4585810.3785810.4708840.4070230.5483020.5694650.3845810.1923950.2863950.4986980.3136980.1726980.2830700.5934880.2825810.3659070.6892090.4201630.8468600.6495120.6118840.6734420.6684190.5027670.5352330.5362790.5529300.4388140.5408840.4560930.2806740.5348840.6301160.4629300.3402560.4829770.6209530.4460930.4447670.4928600.8961160.2677210.4771160.5526980.2459300.5073260.5370930.3074650.4888840.5352090.3133260.3308600.5476280.4507670.5243490.5403720.4766050.6322090.1666280.1379530.2242330.3843720.3628370.6667440.4459770.4010230.3645580.4780470.3953490.5959530.5295120.4237670.6481160.4076510.6503490.6638600.4304880.4910230.4026980.4620000.5149070.4623720.5874190.4565580.4843260.3829300.3318140.6802790.5137440.7047440.5528600.4300470.6902330.6321860.5064880.4887440.5695580.2885120.3233490.3527670.4667910.6665810.5784190.7385120.7079770.4367910.4985350.5193720.4634880.4916050.5688370.5375350.2972560.3323950.4889530.4573950.4346280.4424190.4387670.5171160.2916980.5101860.4102560.3530470.4482560.5396280.5093720.4964880.5308140.4813260.6335580.4211400.4905350.5405580.5004420.4347440.7102560.2222330.5073260.5370930.3175350.7270700.4676510.4751160.5438370.4374650.5997440.5580230.6232330.6615580.7066510.6996980.6780470.6364420.6254650.4958140.4460930.5542330.4900230.5723260.6157210.5922330.5622790.5974190.6610000.5057670.4382790.4778600.4591860.5812090.5259300.5093720.4220230.2765810.3089300.3498140.2463490.2650930.3511160.3205120.3159070.5476510.4932790.4138370.2468840.3811630.4722090.4760000.2698600.3928600.2632560.3345350.6503260.1201860.3212560.5721860.4743950.2856050.1956740.7709070.5606280.6093490.7965810.7660230.5697670.7585810.6027210.3894650.3894650.1879300.2831160.2253720.1427210.4096510.4704880.5131860.3546980.4042090.5243490.3794420.2517670.2168140.4547440.3675810.5333020.2230470.7678140.7371400.5319070.6028140.3158600.3628600.3126050.3744420.4115350.3686980.3836050.4077910.4229530.6160230.2470470.3021630.3615810.5266510.6155810.6666280.3142560.3491400.5922090.2403950.4970700.4697670.4634420.6359070.2063720.3416050.4664190.1391160.3157440.2626980.4619300.5677210.5603260.2805580.2844880.4883720.2498370.6109770.8044650.5127210.2889070.2979070.5597670.2229770.7978370.4470930.4776280.3651160.6277440.6784650.9270700.9210470.4142790.5071860.7280000.1668370.4367670.5653260.4730470.6251630.4189530.3104190.4531860.3389770.2372560.5957910.4972560.5294420.5067210.4988840.4756740.6083490.5185580.5740000.1918140.4381160.4080230.5353950.8066740.1486050.3995350.5485350.5151160.3291400.3204420.2724420.3522090.1746280.1595810.5296510.2343720.3077210.8716280.5836280.4636740.6602560.6521160.4366980.4493720.4929530.5464190.7075120.6642790.5664650.5193260.4656050.4373020.3932790.3399530.2372790.3175580.6690000.6307670.5548370.6942560.6720470.3205350.3874880.5182090.3941630.5598840.5481160.6390230.4093490.6674650.6842560.6336980.5929530.0809530.4676740.4673490.2843720.5046280.5044880.4308600.3062790.4494420.2691860.5209300.6380470.5955810.4859530.5739530.4684190.4342090.3600000.4300470.3014650.5423490.6180470.6642330.5426980.3637670.5433020.1707440.3935810.5186280.4690000.4772560.4572330.4414650.6669070.8036280.5596050.4100700.5380700.3017440.2599770.8473260.6966280.6424880.4790230.5284420.4923260.5727440.5768140.6060000.5733490.6047210.3994650.4847210.4780230.3883720.3818840.3768370.2221400.4614650.3627910.3138840.3061160.3623490.3689300.3073720.3921860.6657440.6262560.4025810.6195350.5316280.3920700.4215350.5115810.3874880.3576980.4196280.6431630.8495810.5747670.3280700.4708600.4909530.2021400.2518600.2377440.2054190.3280230.3527440.2725350.3402330.3581860.2306980.4656740.4697440.3231860.2714420.2905350.2049300.3255810.3897670.2998370.3807670.2741860.2627440.3790470.4484650.3107910.4342090.3600000.3203950.2867670.4842560.312163
P701800.4020930.3689300.3430930.3807440.6049530.4819300.4790470.5783260.4589530.5147910.5693950.4499300.5429530.5532560.5389070.9302560.4627440.6879300.4843020.4683260.5995120.3651400.3812790.3744420.4227210.4651160.3255810.2326740.4000000.0697670.3023260.4404190.4585810.2686980.5333020.5422090.4128370.4817670.5058840.4453490.2222090.5648840.5157210.4838370.4408140.4074420.3843720.4053950.2677670.2255120.3736740.2948840.3558840.5484190.4301400.4224650.4211160.4445810.5154650.4391630.5031630.4636980.5847440.6764420.4466280.5193950.5828370.6969770.5815580.1871630.5308370.3923490.5935810.8110000.4833260.6503490.4672560.5022330.6475120.4007670.4337440.5670700.4679770.6068600.2018370.1627910.2209300.1395350.0697670.7580000.6089300.1663720.0508140.3744190.6406740.0843020.4367440.4683720.4601160.3940470.4857910.6641860.5332090.3396510.5075810.3763020.3440930.4274880.4524420.1636980.3668600.4470470.4933720.2724190.5014420.3490700.4536510.3898370.5661400.4735810.4485120.2010700.3467670.4474190.3820000.2252330.3110230.5525580.2991160.3338140.6556050.3686280.8099300.6286980.5578600.6630700.6736980.5191860.4488140.5263950.4690000.4794190.5466980.4508140.3014190.5348840.6592560.4904650.3584420.4516980.5491630.3981400.4909070.4924420.8303720.3120470.4716280.5054650.2315580.5151160.4686740.3513720.4977910.4593720.3690470.3394650.4697670.3676740.4644420.4773020.4898600.5630930.1593260.2131860.2886980.3533020.3644650.6138140.3921160.3670000.3319530.5513260.4502330.5684190.4748600.4336740.5733260.4492790.6273260.6925120.3762790.4437440.3464420.4143490.4667440.4347440.5653490.4470930.4241400.3193490.3718140.6816510.5461860.6489770.5069300.3564190.6885120.6219770.4313260.4547210.5059770.2399530.3624880.3577910.5104420.6877210.5984650.6913020.7253260.4124880.5534650.5437210.4686980.4867440.5001400.4648840.3708370.3922090.4546050.4540000.4364190.3874650.4046050.4425810.3741400.5338840.4475350.4393490.5144190.4547210.4446740.4439770.4803260.5377210.5833260.3782330.4022330.4842330.5077910.4788600.7159770.2680700.5151160.4686740.3609070.7362560.3825810.4869770.5194880.4570230.5617910.5415810.5969300.6537440.7137910.7019300.6913950.6356740.6008140.4822090.4471860.5726280.5163950.5803720.5811160.5390000.5210000.5516280.6346980.4758840.4590470.5306510.4684880.5678840.5340700.4803020.4648600.2951630.3619070.3921860.2710470.2882790.3571400.2985810.3040700.5496510.5505580.4725350.2841160.4292790.4732330.5006050.2788840.3332090.3160930.3810930.6558600.1918600.3350230.5115810.5072790.3675120.2132330.7278840.5022330.6218370.7451860.7310230.5680930.7156980.5308600.4417670.4417670.2009530.2749770.2627910.1668140.3601400.4746280.4945350.3926280.3864880.4946740.4088600.2661400.2878600.4650470.3158600.5234650.2366980.7609070.7511160.4477670.5267670.3300930.4344190.3153950.4520700.4725580.3682560.4508140.3755350.3907210.5766280.2914650.3802560.3794190.4610930.5310470.6376280.3431400.3800000.5805350.2083020.4567440.4703260.4143260.5487210.1990930.3971630.4935580.2295120.2502790.3281860.5119770.4867910.5267440.2849070.2986980.3720930.2938600.5868140.8063260.4646280.3088370.3377910.5787440.2735120.7690000.5337440.4792790.3824420.5698370.6140470.9043490.8950230.4020930.4667440.6229300.2113260.4391630.4760230.5224880.6680700.4609530.3095810.4253020.3528140.2709770.5856050.5015120.5676740.5221160.4986050.4780470.5999530.5590470.6371860.2775350.4709530.4073720.5220470.8275810.1260930.4407670.5989070.5468370.3341630.3023720.2676050.4009770.1925120.1670930.5145120.3028370.3703020.8812790.5904650.4826050.6633720.6443260.4581400.4504880.4258600.5287210.6520470.6186740.5210000.4735120.4160230.3921630.3656280.3882090.2886050.3504880.6542560.6014880.5106050.6775350.6731860.3672560.4360930.5527210.4120700.4879530.4907210.6039530.3415350.6543260.6737910.6308600.5535580.1083950.4393260.4401400.2986050.4546280.4685350.4018840.2801400.3950470.3253020.4570230.5648140.5258600.4239300.4877670.5144420.4583020.4216050.4116740.2874880.5498140.5790700.6306050.5239300.3712090.5547670.1449300.3540930.4550930.4126280.4725350.4454190.4330700.6647670.7711860.5107910.4413490.5906280.3346980.2986280.8177670.6423260.5891400.4618140.4925580.4528840.5330700.5336740.5636510.5395120.5655120.4382090.5495120.5426050.4417440.4284190.4115580.2680700.5094420.3581400.3100470.2983950.3555810.3643020.3151860.4003950.6072090.5663020.4688840.5695580.4505120.3900930.4390230.5299530.4150000.3564880.4013260.5860470.8691400.5394650.2437210.4684650.4369300.2518140.2887440.2407670.2586980.3678370.3912560.3196280.3630000.3443020.2793950.4952090.5145580.3717210.2996980.2796740.2576980.3519530.4003490.3304880.4352790.3131860.3040000.4508370.4933720.3443950.4583020.4216050.3389300.3381400.5024420.323163
Q031570.3466980.3327910.3922330.4181630.5978600.4186510.5426050.6347210.4065580.4922090.5580700.4683260.5594190.5547440.5364190.9109070.4232330.6373950.4403260.4712090.5797210.3075580.3300470.4418840.4354880.4302330.3372090.1240930.3116280.0232560.1627910.3798600.3875580.2503950.5321160.5602330.4890000.4224190.4796740.5019770.1952330.5257210.5861400.5211630.4176510.3660470.4333950.4973020.3068370.2576280.3985810.3352790.4053490.5052560.3993950.4020470.3921630.4097910.5480000.4000700.4912560.5075810.5282090.7510470.4560930.5123720.5960230.7147910.5885120.1513950.5435120.3260930.6123260.7956510.5198600.7030000.4693260.4635120.6057670.3410470.3935350.5303720.4108140.5664650.1829300.1395350.1802330.1162790.0232560.7270230.5534880.1789070.0725810.3976740.6406740.0649770.3984190.4241860.4597670.3502330.4749530.6600000.5286280.3884650.5567910.3962560.3865810.4058140.3993260.1694880.3576980.3895580.5153720.2302330.4923020.3211400.4046740.3543490.5038370.4471860.4954650.2329300.3858370.4748370.3520470.2763020.2863260.5689530.2826510.3296740.6720230.3325350.8714650.7132330.5687210.7416510.7489070.4664190.4428370.4924190.4659070.5512790.6122330.4650000.3002330.5465120.6913950.5340000.3689530.3985350.5654190.4274420.4803020.4217440.7785120.3660700.4041860.4590230.1802560.4715350.4298140.4093260.4572330.4340700.4232790.4249300.4360930.3511860.4275580.4547210.4287440.5607910.1421860.2513020.3278600.3948840.2935120.6399070.3961860.3405350.3040700.6003950.4651160.5716510.4491860.3817910.5712090.5092090.7069770.7512090.4696280.4957440.4419770.4685350.5533260.4600230.6363260.4395120.4899300.4038140.4003020.7737670.6039770.7458370.6236050.4302090.7636280.7136280.4809770.4362330.4740930.2084880.3313490.2899070.5333950.7372790.6500470.6731160.7250470.4123260.5364650.5790230.4248840.4318370.4866740.4310000.4146280.4598840.4268600.4207670.4111400.3331860.3535350.4185120.3802560.5803720.5551160.4608370.5215120.4367670.4210470.4240230.4646280.5365350.6029770.3500470.3760230.4844190.5637670.5307440.7442090.2290930.4715350.4298140.4193490.6997910.3238140.4664880.4696510.4487440.5314420.5091160.5282560.6090930.6830700.6799530.6704650.6484880.6130230.5223490.5043260.6007440.5583720.5594880.5977210.5053720.4791160.5236980.6303020.5079770.4702090.5582790.4937670.5352790.5564420.4505580.5093260.3159770.4231860.4470470.3108840.3055120.3502790.2893260.2659770.4964420.6068370.4946740.2866740.4472560.4598370.4580930.2650930.2819070.3548370.3463490.6028840.2160230.4084650.4522560.4999530.3708370.2331630.7559770.5050700.6720470.7795810.7788140.4996740.7339070.5159530.4766050.4766050.2577210.2487210.2071860.1066740.3601400.4635580.4417910.3512330.3303490.4619530.3917440.2593020.3384880.5089070.3046980.4591400.1942090.7328370.7015580.4139070.5099770.2617670.4658140.3272790.4783260.4816740.4761160.4940230.3464420.3363950.5569770.2677210.3561160.3258140.4370930.5546510.7035350.2987440.3874880.5227670.2107910.4301860.4153720.4261160.5504650.2391160.3989300.4924650.2458840.2432330.3765350.5571400.4520930.6219770.1905810.2453020.3488370.2684650.6057440.8443260.4292790.3086980.3069070.5814880.2494190.8117670.5374420.4196280.3821860.5879300.6646510.9306280.9226280.3886740.4361160.5882790.1446280.4476050.4872090.4874420.6708840.4946050.3650700.4625350.3197210.2188370.5467670.4464650.5188600.4567440.4628140.4546510.5513720.5408840.6265350.2973950.4773020.4143950.5148370.8096740.1460230.4757440.6508140.6010700.3434880.3454420.3013490.4415580.2334650.2075580.5230930.3626510.3649300.8573260.6319300.4968370.7006050.7063950.4486980.4628600.3877440.5016740.6585350.6167670.5022790.4479070.3820930.3464190.3018840.3935810.3156280.4292090.7494650.6866980.5937910.7504420.7538140.3600230.4419530.6286050.4317910.5408600.5562330.6748370.4103720.6863260.7287670.7103720.6207910.0746740.3849070.3848140.2451630.4263020.4549070.3731630.2837670.3810700.2950930.4430930.5820230.4911160.3753950.4708370.4939070.4651630.4112560.4049070.2836280.5271860.6038140.6457210.5156510.3634650.5287910.1531630.3069770.4235580.3645350.4340700.3848370.3692790.7224650.8163490.5122790.4287910.6045810.3167910.2847440.8486510.6429770.6001860.4332330.4775580.4253720.5217440.5230000.5337210.4980700.5437910.4643720.5612560.5546280.4597210.4565580.4266510.2289770.5216980.2953490.2518600.2480000.2925580.3063950.2660230.3256740.5697210.5036740.5216280.5135350.5139300.3364880.3701860.4564880.3540230.2936050.3817670.5325810.8741630.4860930.2726050.3984190.3940700.2175810.2594880.2387440.2150700.3724650.4114190.3066980.3365120.3327440.2487210.5141160.5419530.3783260.2500230.2633950.2004420.3343720.4102560.2766280.4173490.2944190.2863260.4345810.5153720.3279770.4651630.4112560.3223260.2994650.4910470.298140
Q064810.3779770.3788370.3993950.4348140.6678370.5694880.3875580.5531630.4787670.5602560.6173260.4781400.5881160.4953950.5818840.9531400.4859770.7022560.5315120.5133020.7014420.3671400.3674880.3005580.4881160.5813950.3604650.1551160.3767440.0697670.2093020.4540000.4631400.2307210.5802090.5644880.3377670.5156510.5823260.3559770.1846510.5943260.4926510.4162330.5203950.4511400.3309070.3551630.2707440.2037210.2950470.2109070.2836980.5808370.4704880.4904650.4722330.4997670.5976980.4775350.5865350.3709070.6063020.6649300.5328600.5641400.6322330.7280700.6143260.1680700.5724650.3931400.6089530.8353260.4807670.6721160.5151860.5855810.7516740.4056050.4511630.6699070.4676280.6770000.2353490.1627910.2325580.1162790.0465120.7870700.6368140.1797910.0255810.3837210.6086050.0800000.4541860.5027910.5005120.4027910.5416510.7220930.5978140.2683950.4725580.3140230.2632790.4499070.4700000.1493720.3249300.4680700.4579770.2324650.4574650.3600000.4720230.4091860.5849530.5631160.3572790.1563260.2801860.4964190.3398840.1553260.2746980.5967670.2713020.3633490.7003950.3782330.8383020.6513260.6773260.6801400.6644880.5410000.5327670.5599770.5477210.4616740.4996050.4114880.2953950.5232560.6043490.4346280.3046740.4739770.6216980.4041160.4538370.4960000.9304420.2548840.4731630.5404190.2091630.5457910.5461630.2777210.5221160.5477910.2794190.3279770.5657440.4537910.5487440.5397440.5052330.6112560.1830230.1223020.2066740.3810700.3528840.6530000.4176050.3691400.3311160.4754880.3879070.6073720.5307210.4286050.6434880.4060470.6583720.6633490.4420000.4992330.4120470.4648600.5328140.4852090.5937440.4416280.4893020.3966050.3136740.7020230.5211160.6880700.5349770.4386740.6911400.6173720.5183490.5012090.5758840.2754880.3188600.3453720.4680000.6715580.5837210.7292330.7138600.4463020.5287210.4797910.4850470.5223020.5804190.5337670.2725580.3129530.4718140.4953260.4633950.4234190.4550000.5124190.2727440.4819770.3844420.3593950.4618600.5110230.5168370.5039530.5369530.4743260.6106050.4256510.4857440.5405350.4664420.4526050.7323950.2287670.5457910.5461630.2892090.7705580.4676740.4532330.5623020.4619770.6277670.5890230.6651630.7001400.7316740.7257210.7112090.6763020.6487440.5035580.4432790.5543950.5032090.5476050.6257910.6193260.5965350.6314190.6922790.5090700.4289070.4789070.4810700.5967440.4982330.4729530.4156280.2549770.2712560.3169530.2129070.2393020.3327670.2746050.2840470.5252090.4825350.4037440.2302560.3990000.4850700.4773950.2663720.4126050.2355580.3422790.7009770.0774650.2784650.5628140.4991160.2701860.1485580.7483720.5544650.5992330.7711860.7411630.5857910.7408600.5977210.4170470.4170470.1988840.2548140.2314190.1363020.4051860.4827910.5457670.3951400.4009770.5211860.4431160.3024190.2132560.4624650.3167210.5610930.1973720.8086980.7739300.5445810.6181400.3233490.3396280.3126510.3316050.4169300.3377210.3636510.4059530.4212790.6261160.2810930.3359300.3705350.4854880.6692090.6305120.3078370.3786050.6351860.2536980.4910700.4944190.4483720.6330230.1834420.3369300.4722560.1343490.3194420.2536510.4347440.5548140.5316980.2893490.3055350.4651160.2626980.6294420.8165350.5334420.3093720.2779770.5579770.2264650.7810930.4740000.4776510.3650930.6241400.6767440.9068840.9013260.4030230.4852090.6962790.1694420.4311400.5484420.4569770.6091630.4299070.3159530.4399070.3346740.2601630.6288370.5315120.5876740.5631860.5455810.5069770.6461860.5769300.6344650.1796510.4387210.3841630.5002790.8561860.1030000.3792090.5458370.5200230.3027670.2751400.2161860.3415350.1363720.1180700.5233720.2115350.2844880.9259530.5548600.4523950.6527910.6415580.4742090.4791630.4567440.5662090.6864420.6736280.5679070.5174420.4439530.4170930.3524650.3220930.2081160.3704420.6695810.6307670.5639770.6905120.6849770.2918370.3766050.5051630.3725120.5632790.5683720.6643950.4208600.6463260.6922330.6418370.5862560.0673020.4579300.4579530.3054190.5290230.4900700.4250000.3208600.4441400.3060000.5063260.6369530.5958140.4870930.5685120.4775120.4250230.3606050.4124650.2749070.5317210.6121630.6787910.5287210.3359530.5885580.1229070.3822330.5121860.4625580.4954190.4562560.4433720.6789530.7823720.5568140.4295350.5153490.2896050.2668140.8343260.6716740.6114420.4962790.5446980.4863950.5967210.5887670.6430930.6155580.6351400.3725580.4846740.4776050.3700700.3651630.3698140.2287210.4609300.3581400.3022330.2964190.3523490.3512090.3021860.3904650.6579300.6000700.4342330.5863260.4837440.3951160.4320930.5213490.4085350.3557670.4362790.6319530.8412090.5580470.2877440.4709770.4477440.2429530.2364880.1746980.2268840.3058370.3204190.2735350.3402330.3068370.2641860.4690700.4713950.3433950.2640470.2342790.2320470.3180700.3764190.3066050.3861860.2621630.2728370.3783020.4579770.2996050.4250230.3606050.2980000.2836740.4914880.325605
P356130.3722330.4706980.3694420.4111160.6754420.5873260.3736510.5333720.5524650.5807210.6227440.5074190.6182330.4468370.6542790.9074420.4900470.6855120.5802090.4995580.7235120.4327910.3779300.2700230.4762330.5930230.4069770.2249070.4418600.0930230.2558140.5272560.5387440.2568840.5707440.5221630.2863260.5446050.5906510.3145120.2429070.5828370.4252090.4238370.5332790.4657440.2919300.3194420.2184650.2043720.2492090.1774190.2593490.6399770.5145350.5178600.5081400.5519770.6379770.4910000.5866280.3474420.6860470.6260230.4595350.5100000.5804880.7150700.6227910.2094420.6022090.4555810.6185120.8019530.5128600.6301160.5315810.6453020.7659530.4732330.5077670.6931630.5350700.7173490.1757210.1744190.2267440.1627910.0930230.7746980.6896280.1520470.0719300.3395350.5868600.1130930.4863490.5260470.4776740.4296510.5315120.7074420.5905120.2464190.4460700.3219530.2485350.5441860.5447210.1071400.3237910.5343260.4587670.2782330.4745810.3889770.5347670.4643950.6053490.5681630.3478840.1746050.2371160.5227440.3748600.1180230.3162090.5689070.3095810.3579530.6693490.4700230.8009300.6196510.5982090.6259070.6146510.5628140.5249530.5820470.5515580.3784190.4989070.4297910.2975810.5232560.6155120.4498140.3356510.5373720.6002560.4400700.4571400.5629530.9418140.2180000.5454420.6142330.2776280.5553020.5502330.2631160.5483720.5346740.2639530.2575120.5736740.4627910.5535120.5663020.5400700.6102330.1753260.0958600.1829300.3779530.4157440.6556980.4568140.4312330.3914650.4401630.3860470.5986510.5503020.4684880.6313720.3680000.6293260.6607670.4051860.4701160.3761160.4378600.4936280.4605120.5620000.4407210.4603260.3680470.3068600.6580930.4985120.6503950.4999300.4246510.6688840.5867670.4953490.5123490.6039300.3137910.3543490.4156280.4484650.6196280.5268840.7393490.7062090.4585350.5260470.4665350.5187210.5467910.5658840.5445350.2370000.2521630.4917670.4969070.4754420.4326050.4733490.5209300.2257210.4852560.3343720.3182090.4208140.5715350.5293260.5052090.5253260.4762560.6227210.4253720.5183490.5530000.4401400.4015120.7118370.2789530.5553020.5502330.2743950.7645350.4909770.4860700.5830000.4593950.6447910.5996740.6844420.7116740.7158840.7160700.7071860.6571160.6392090.4904650.3670700.5240230.4438600.5445810.5880230.6124190.5926980.6209300.6650230.4543490.3703260.4122790.4332560.6311860.5122330.5369070.3843260.2543020.2587670.3022090.2215350.2478600.3472330.3303490.3476980.5819070.4371630.3946740.2379530.3856280.5174650.5076280.2774190.4255350.2130930.3556280.7013720.0760470.2772790.6084420.4589530.2630230.1768840.7397910.5605120.5621160.7596980.7148600.6217210.7338140.6170230.3618840.3618840.1243020.3417670.2496740.1812090.4314420.4568840.5535120.3960000.4194650.5592090.4026740.2551860.1804420.4780230.3580930.5910000.2659070.7902330.7571860.5512330.6072330.3560930.3101860.3231400.3180700.3680000.3024650.3304650.4551630.4761630.6285120.2734420.3289770.4313260.5885810.6159530.6135350.3507210.2848840.6631400.2829300.5080930.5430230.5092560.6353260.1829770.3040230.4502560.1128600.3233260.2036510.3978140.6330930.4938600.3417440.2547210.5348840.2908840.6040700.7733490.5425810.2831400.2740230.5039070.2465580.7498140.4340470.5392560.3529770.6280470.6469770.8857910.8785350.4186740.5680930.7753950.2560700.4460230.5781160.5385120.6205120.4231400.2867670.4084190.3925120.2958370.6530930.5469530.6032330.5967670.5576980.5112090.6825120.5887910.6035810.1716980.4880930.4330000.5664420.8184650.1430230.3689070.4945580.5117670.3093260.2774880.2349300.3415810.1640470.1513720.5134190.1894650.3578140.8862090.5354190.4586980.6589530.6191160.4735810.4744190.5356050.5824880.6714880.6528840.5610230.5178370.4578370.4368840.3907670.3649770.1673720.2950700.6158600.5999070.5265120.6700700.6462090.3400230.3944190.4340700.3824420.5638140.5443260.6106510.3997910.6865810.6861400.5745580.5771160.1154420.5286740.5294650.2546510.5390700.5222330.4724190.3136050.4591400.3129770.5467670.6150230.6341860.5334880.5966510.4738840.4378140.3651630.4635810.3350470.5852330.6351630.6601160.5794650.3811630.6154650.1631860.4325580.5682090.5021160.5039300.5224880.5078600.6277440.7554190.5445120.4226510.5068840.3211630.2864190.7980230.6972090.6252330.4989300.5393950.5039300.5995810.6021860.6518370.6224190.6399770.3640470.4614650.4547440.3703720.3570000.3617210.2789770.4475120.4232560.3661630.3564650.4353720.4264420.3668140.4619530.7112330.6932330.3221630.6682790.4515810.4558140.4809070.5850470.4426740.4099070.4104650.6836740.8413950.6109770.3047670.5411630.5178600.2522560.2854420.2392560.2583490.3290230.3396280.2889070.3665580.3582090.2682090.4448600.4427670.3110470.3185120.2932790.2708600.3387440.3792790.3433260.4017440.3046280.2858370.3997440.4587670.3306510.4378140.3651630.3478140.3330000.5073260.331837
P350700.3854190.4526280.3919530.4130230.5925350.6046510.4460700.5318600.5420000.6286510.6505350.4496980.5669300.4850930.6257440.9304420.5012330.7050700.4828600.5768600.7041400.4358600.4166980.3147210.5032790.5930230.3837210.2171630.4511630.0465120.4186050.5184880.5231860.2601630.5849530.5718370.3366740.4611630.6316050.3388600.1404650.5982330.3857440.4725580.5566740.4921860.3300000.2943260.2870470.1927440.3107910.2470230.2770470.6669530.5418140.5276980.5383020.5747910.5820930.4265580.6065350.4004650.6660930.5673720.3909300.5680470.6325810.6917210.5942090.2337910.6317440.4527210.5586510.8208600.4407440.5718140.5426280.6209770.7500470.4675350.5144190.6608600.5427670.6927210.2221630.1976740.1860470.2093020.0232560.7600470.6540000.1153720.0453020.3627910.6479070.0873260.4176740.5246510.4335120.3807440.5843950.7544190.6319070.2537210.4495120.3021400.2431630.5243020.5336740.1854190.2892560.5268370.4348140.2150000.4680230.4010000.5800000.4914190.5662090.6152560.3389070.1397440.2665580.4700930.3622090.1559300.3007210.6111400.2842560.4295120.6900000.4517440.7195580.5505580.5545350.5576740.5690700.5075580.5625810.5557210.5894880.3553720.4452560.4243490.3177440.5813950.5668840.4092560.2982560.5311630.6150470.4302560.4611160.5546050.8993020.2241160.5477910.6040000.2665350.5276050.5376740.2561400.4937670.5587910.2583490.2704650.5903020.4690000.5733020.6057440.4935580.6561160.1550000.1604420.1959530.3363720.4625120.6487210.4336980.4288600.3749770.4185810.3613950.6483490.5794650.4007910.6712790.4183490.5606740.6308840.3561400.4553720.3248600.4198840.4514190.4634650.4988370.4228370.4233950.3255350.2876510.5656980.4145810.5725350.4335120.3973720.5952560.5440470.4606980.5778370.6575810.2775350.3219770.4145810.4095580.6336050.5558370.7244650.7155810.4455120.5323260.4323020.4526280.4767440.6131400.5720470.2446740.3316740.4835120.4554190.4504420.4741630.4988370.5299530.2369530.4885580.3245350.3044650.4266280.5536740.6003720.5750000.5898600.5247910.6443490.4896980.4976980.6174420.4600930.3409070.6016740.2792790.5276050.5376740.2656740.7624650.4994650.4523260.4921400.3951160.5938370.5250000.6557210.6955350.7208140.7216280.7143020.6708600.6216510.4770700.3449070.4724650.4331160.5654880.6606980.6310470.6155120.6625810.7020230.4860230.3823950.4051860.4054190.6622330.6164650.6238600.4335810.2755810.2674880.3015580.2085120.2408140.3188840.3191630.3658370.6036510.4207440.3793020.2184420.3810230.4406050.4690000.3521860.4212790.2433950.4277440.6528370.1109770.2959300.6339770.5155580.3301400.2156280.7275120.5324190.5620700.7444880.7138600.6294190.7147210.6590700.3429770.3429770.1283950.2416510.2193260.1106280.4374650.4993020.5318600.3632790.4122560.5074420.4087910.2819070.2276280.4973950.3141400.5278600.1740700.7713020.7832090.6182790.6739070.3695120.4088370.3213950.4097210.4638140.2868600.4245120.5075120.4880470.6756510.2834880.3426280.3597670.5419070.6194190.6212330.3512560.3212330.6471160.2844880.5248370.4619770.4538600.6750700.1533020.3607910.4852790.2160930.3238140.2252560.4270000.6608370.4790470.3281630.3189070.4883720.3210700.6186980.7923720.5924880.2806510.2453950.5715120.2106980.7425350.4629530.5217210.3758840.6074650.6370470.8427670.8351160.4549770.5632330.7378370.2372790.4863950.5202330.4859770.5825350.3646050.2596510.3568840.3013020.2122560.5976050.5330470.5531630.5205120.5012790.4812790.6471160.5211160.5850470.2069530.4575120.3818840.5530700.8252330.1292330.3112790.4416740.4548370.2732330.2982560.2638840.3096980.1427210.1360700.5411400.2048370.3721160.8949530.5114420.3896050.5913020.5488140.3950700.3940930.4802790.5863720.6913020.6771860.5962560.5568370.5038370.4774420.4197440.3792790.2354880.2701400.5567910.5287210.4676280.5893490.5842330.2848600.3301860.3712560.3301630.5076280.4883950.5552090.3611160.6004880.5976280.5105350.5097440.1000700.5159530.5164650.3187670.5845810.5052090.4376280.3513950.4956740.2849070.5204880.6245350.6543720.5704880.6231400.5468600.4568840.3606280.4110470.3096510.5166980.5572790.6833490.5136980.3765120.5495810.1471160.4412330.5434880.5314420.5621860.5198600.4990700.6240700.7459770.5506980.4157670.4615580.2993260.3076980.7829070.6830470.6254420.5580930.6134190.5206980.6617440.6527910.6754880.6531860.6840700.3203950.4411630.4332790.3182330.3043020.3053020.2792790.3916510.4046510.3448600.3313020.4088140.4092790.3410230.4519770.6684190.6643950.3335580.6303950.4254880.4416980.5051400.5985580.4746050.4022560.4360000.6827910.8624190.6149770.3091860.5525120.5297210.2520470.2583020.2020470.2476050.2825120.2950930.2543020.3279070.3063260.2533490.3722090.3754880.2630470.2928140.2505120.2580470.2821860.3183950.3091160.3876980.2863490.3092330.3849530.4348140.3100000.4568840.3606280.3307210.3336510.4852330.367907
P098030.2680930.4579070.5050000.5411630.7254650.5943720.3566740.5330470.5045810.6394190.6740930.6058600.6751630.4001630.7029070.9099530.4133950.6715810.5649300.5227210.7060000.3722330.3563260.2759770.4247440.5000000.4767440.1085810.3441860.0465120.1395350.4687670.4580470.1767910.6444880.6489530.2877670.5319770.6020000.2907440.1856980.5526740.4391160.4545350.5532090.4507440.2843020.3127440.1982330.1825120.2489070.2106280.2437210.6482090.5272090.5452090.5365810.5748600.7038140.4878370.6265580.3398140.6112090.7290000.4008370.5716740.6652090.7850470.6647210.1550700.7066510.3730000.6909770.8056280.5492090.7383490.5903490.5800930.7251860.4053260.4339770.6143490.4646980.6117440.0783490.1046510.1104650.0930230.0232560.7710000.6872790.1199070.0713950.3069770.6086510.0979770.4893950.4813950.4793020.4164880.5272790.7360470.6080000.2502330.4930230.3051630.2388600.5716280.4970000.0784650.2453950.4852330.4220930.1815120.4160230.3557440.4723260.4137910.6011160.5071630.3547670.1633490.2638370.5111860.3573260.1833950.2344880.6599770.2273950.4215350.7408600.4572330.8679530.7392560.5299770.7267670.7158600.5609300.5383490.6111630.5902790.3961160.4918370.4324650.2923260.5348840.6146280.4411160.2996050.4915580.6981860.4836050.4040230.4731860.8507440.2861400.4584650.5972560.2336740.5633490.5121400.2748140.5606050.5108140.2725810.2710470.5615580.4749070.5301160.6293260.5399300.5898840.1111400.1697910.2560470.3496280.3548140.6983260.4981630.4671630.4330470.4229070.3376740.6802790.6037670.4668600.6748140.3418140.7426980.7642560.5431860.5584420.5168600.5250930.6231630.5185120.7064880.5074420.6214420.5120930.4026510.7536510.5861400.7277670.6212090.5808370.7543490.7120700.6317910.5682090.6596740.3205810.2600930.3081630.4295580.6695120.5866050.7445350.7169530.5032560.4940230.4704650.5269300.5401160.5516050.5509770.2494650.2416980.4706510.4968840.4906740.3917670.4526050.4864880.2423260.5074880.3852790.3096740.3576740.6305580.5788600.5459070.5603020.6077210.6852790.4498840.5490700.6256280.4618600.4565350.7093950.1934880.5633490.5121400.2870230.7867910.4567210.5128840.5214190.5179070.6686740.6198370.6541860.7344190.7310700.7384650.7500930.7268140.6739070.5223950.3404190.4750000.3889770.4964880.6306050.6057210.5771400.6162330.6976280.4363490.3132790.3952330.3600700.6122090.6124190.5031860.3864880.2014190.2825120.3165810.2208840.2177210.2916280.2984880.3088140.6339070.4130700.3476050.1980470.3528600.5169530.3869300.2550930.3331400.2668370.3147210.6883720.1425580.3456510.5372090.4739300.2646280.1921400.8272790.5953490.6422330.8432560.8159770.5558600.7920000.6721400.3749300.3749300.1174420.2821400.1809530.1138600.4884880.4650000.5519300.3907910.4034420.5655580.3366510.2176280.2674650.5115350.2900470.5657670.2146980.8035580.7265350.5496980.6284420.2549070.2845350.2716980.2887210.3838140.3425120.3110230.4872560.4440700.6773950.1830000.2556980.3616050.5930930.6828370.7177210.3256510.2347210.6730470.2913490.5449300.5296050.4893720.6180930.1810930.3063720.4125810.1823490.2538370.2710000.3848370.6115350.5535120.2464880.1532560.5813950.2147910.6847910.7877910.5670930.2755350.2915350.5818370.1736280.8622090.3727210.4466510.3487910.6751860.7198370.9168840.9110700.4141160.5917210.7485350.1192330.4454650.6407670.5253260.6059530.4422090.3106050.3807210.3416280.2543490.6765580.5498600.6174190.5760930.5521400.5466050.6954420.6202790.6322560.2288840.5256280.4274190.5460700.8322560.1332560.3361860.4870230.5159530.2314190.2854190.2423490.3619770.2009770.1870930.5487670.2679300.2969530.8890230.5137670.4522330.7458840.7229770.5211630.5565810.5194880.5719070.7397910.7161160.6071160.5551630.4800470.4292560.3311860.2826280.2040000.3205350.7488140.7142090.6610000.7762330.7130230.3266280.3904190.4420930.3630470.6914650.6911860.7565810.5422560.7672090.7970930.6630700.6730230.0454650.4752790.4742090.1532090.5848600.5837210.5233260.2833260.4345120.2176280.6074190.7013720.6894880.5717210.6527910.5102790.3707440.2739070.4607210.3571160.5436050.6463720.7135120.5690470.3728370.6413020.1414880.4342560.5556740.5292330.5273260.4686280.4454420.6571400.8665120.6023490.3469530.4777440.2464190.2286280.8685120.7750930.7111160.5302090.5931160.5396050.6771860.6774650.7057670.6697440.7074190.2997670.3814190.3754880.3065580.3009770.2868140.1933490.3801860.3441860.2924420.2846980.3523950.3518600.2943950.3722790.6259530.6072330.3588370.5744420.4816280.3951400.3874190.4981630.3350700.3248600.3700700.5973720.8774420.5236280.2663020.4651400.5234880.1646980.1911630.1772560.1581400.2488370.2758600.1958600.2710230.3015120.1671630.3726740.3891400.2241400.2167670.2283020.1706050.2444190.2895810.2479300.3368840.2135580.2160470.3018140.4220930.2591400.3707440.2739070.2538140.2141400.4613490.293837
P190220.3286050.4509530.4073720.4572330.6992090.6079300.3767440.5349770.5265120.6020700.6399530.5011860.6136740.4732790.6436980.9518600.4465350.6654650.5712330.5022330.7091860.4074880.3809070.2561630.4452790.5581400.4186050.2093950.4232560.0697670.3023260.4963950.5006280.2354420.6078140.5982790.2875580.5559770.5996050.2998370.1837210.6010700.4059770.4337440.5727440.4462330.2940230.3071630.2064420.1729530.2681630.2300230.2396050.6183950.5242090.5364420.5318370.5654880.6363720.4931630.6286510.3447910.6345580.6320700.4528840.5586280.6348140.7287440.6223720.2106740.6446510.4202790.6149070.8634650.4909070.6956510.5386510.5929300.7581860.4409300.4998840.6474190.4845350.6332090.1422560.1627910.1627910.1627910.0465120.8026980.6849070.1243260.0250700.3441860.6537210.1048370.5111630.5283720.5208370.4553720.5242790.7237210.5960700.2317440.4390230.3073720.2194650.5270000.5192790.1126980.3013720.5169530.4486740.2393260.4669070.3974650.5266740.4521400.6325810.5203490.3303260.1386740.2540930.4633020.3686510.1769530.2885810.6163490.2747210.4062790.6943020.4503020.8296280.6172090.5881400.6346980.6323490.5896980.5327910.6215350.5535810.3979770.4554650.4134650.2911160.5581400.6005810.4204190.3082330.5190230.6351860.4144880.4632790.5200000.8873950.2608140.5135580.5883020.2521630.5814650.5293950.2454420.5632560.5329300.2502560.2907440.5781160.4839300.5475810.6030700.5546510.5849770.1556050.1647440.2417670.3131630.4026740.6724650.4567910.4240700.3811400.4315350.3697670.6348600.5790000.4643720.6726280.3458840.6272560.6741400.4134420.4980000.3817210.4627440.5100930.4888140.5735120.4597210.4862790.3839070.3750470.6351400.4931860.5959530.4751400.4455350.6611160.5857440.5123260.5464190.6292090.3000930.3159300.3770700.4359300.6536740.5740930.7414190.7010700.5054650.4761630.4659770.5195580.5575580.5740470.5514880.2433950.2587670.4945580.4656280.5153260.4287910.5025810.4952090.2606280.4664650.3448840.3080000.4124420.5641400.5628370.5334650.5486050.5670230.6171400.4449070.5304190.5787670.4870000.3951400.6606740.2550000.5814650.5293950.2559070.7989530.4799300.5206740.5471860.4700470.6381160.5952330.6871400.7378140.7429300.7498140.7525810.7172790.6554420.5223020.3286510.4540230.4251160.5740000.6422790.6262560.6050000.6382790.6832090.4394420.3412790.3853490.3545580.6160000.5696740.5540470.3689300.2127440.2559070.2890470.2039530.2201400.3079530.2836510.3318140.5919300.4163490.3750230.2386050.3355810.5138600.5005120.2653020.3972790.2592090.3539530.7233020.1127210.3054190.5717440.4863720.2970230.1655580.7663260.5695580.5890000.7873720.7521400.6175580.7349300.6294650.3546280.3546280.1311400.2436740.2597910.1411400.4464420.5320930.5922560.4261630.4403260.5422790.4026980.2538600.2520230.4974190.3115580.5905580.1885810.8284650.7846050.5546280.6404880.2640930.3332790.2611630.3342790.4489300.2902330.3500000.4824190.4601400.6517440.2526050.3234420.3329770.5472560.6513490.6420470.3341160.2601160.6887670.3149300.5095350.5329300.4564190.6018600.1516510.3268140.4390700.1982090.3281630.2694190.3795350.6290700.4712090.3020470.2552790.4883720.2665580.6367670.7899300.5576280.2925810.2621860.5721630.2255810.7926980.4375810.4879770.3390700.6431860.6573260.8886050.8814880.4341160.5330470.7227910.2102560.4659070.5534190.5144420.6098600.4310000.2708600.3826280.3419070.2601160.6808840.5884650.6300000.5830230.5783020.5490700.7199070.6167210.6250470.2225120.5148370.4096740.5456050.8636050.0966510.3565350.5005120.4904880.2930230.2550230.2101860.3383020.1497670.1345350.5339770.2330700.3416980.9267910.5294190.4455120.6771400.6396050.4871160.4880700.4903720.5724880.7180470.6740230.5807210.5371160.4862330.4489770.3919530.3363260.2198600.2871630.6262330.5871630.5260700.6637440.6315580.3236510.3856280.4397670.3662790.5652090.5624420.6299300.3983950.6740700.6939770.5886280.5644650.1016050.4999300.4998840.2552330.5744420.5168140.4426280.2998140.4850930.2733950.5478600.6426510.6324190.5382090.5998370.5355810.4237910.3331400.3938600.2728140.5137670.5736980.6672090.5192330.3087670.5940930.1013490.4210470.5403260.4983720.5280930.4913020.4700700.6492330.7939070.5816280.4133260.4900930.2953490.2703020.8152560.7058140.6411160.5341860.5811400.5048840.6245580.6184420.6559770.6314650.6574880.3482790.4459070.4388140.3467210.3353720.3333020.2550000.4181860.3790700.3215580.3118840.3756280.3834420.3254650.4203950.6381860.6134650.3586980.5609300.4083720.4315580.4622790.5581630.4266280.3721400.4084880.6332560.8595350.5631860.2357440.5188370.5194190.2267210.2489300.1999770.2343490.2882090.3036980.2597670.3385580.3359070.2456050.4153260.4236980.2938600.2823020.2564420.2448600.2928600.3305580.3214420.3882790.2642330.2721400.3648140.4486740.3056980.4237910.3331400.3081160.2956510.4846280.315023
P160700.3977910.4260700.3933260.4197210.6222560.4705350.4441630.5691400.5017210.5387210.5808370.4804190.5931860.5311160.6184650.8864650.4976280.6445810.5469070.4833020.6891630.3905580.3563020.3386740.4243020.4883720.3953490.1783720.3860470.0930230.3023260.4741400.4857440.2899070.5290000.5348600.3746050.5040000.5356050.3754420.2295350.5631860.4313260.4670930.5043020.3830000.3732090.3583260.2646050.2429530.2726050.2470000.3130700.5672090.4738370.4774190.4686980.4966510.5983490.4701400.5405350.4192090.6395120.6486280.4573490.4946280.5721630.6866280.5880000.2018600.5701630.4079770.5449070.7976980.4965120.6339070.5050700.5621860.7087670.4241860.4956980.6350470.4903020.6587210.1669770.1918600.1976740.1627910.0232560.7360230.6636980.1377440.0906740.4116280.6043020.0903720.4710470.5106980.5142330.4385810.4845810.6639530.5406280.3103020.4647210.3780000.2986510.5168140.4946280.1644650.3393020.4762560.5110470.2298840.4901160.3674190.5138140.4516280.5870470.5127910.3857670.2143020.2404190.5554190.3958140.1463720.3266050.5584420.3230700.3592560.6555580.4255810.8003260.6284420.5803260.6393490.6409770.5453020.4595120.5581860.4882090.4593490.5291860.4432090.2923260.5697670.6305350.4870230.3693720.4895350.5705350.4191860.4730230.5158140.9109300.2482560.4987440.5663720.2293490.5603950.4293020.3187670.5386050.4585580.3160930.3065120.4989530.3828140.4961400.5121400.5226050.5607440.1476280.1367670.2068370.4283260.3942560.6515350.4255810.3890700.3426050.5185580.4311630.5667440.4936510.4398140.6051630.4197670.6384650.7245120.4136510.4697210.3872790.4426510.4939300.4447440.5549530.4009770.4354420.3680930.2975120.6893720.5407910.6344190.5169070.4100000.6967440.5834880.4620000.4866510.5441400.2358370.3647670.3692330.5030000.6760700.5828840.7138140.7055810.4566280.5123490.4741630.4980930.5107910.5114420.4699070.2919530.3435580.5061400.4778140.5101860.3414190.4062330.4291160.2406740.5291860.4248370.3413020.4661630.5013490.4697910.4636280.4908140.4881160.5687670.3791630.4243950.5229300.5216050.4122090.6762090.2790930.5603950.4293020.3293720.7493950.3875580.4760230.5545580.4598140.6389070.5735810.6409300.6937910.6930470.6990470.7119530.6679530.6264880.4947910.3773720.5313950.4601860.4854650.5465120.5462560.5317210.5726740.5996740.4103950.3006050.4119770.4118370.6116280.5214880.5632330.4518370.3041630.3299530.3623260.2715350.2907440.3419770.3341860.3368840.5842330.5252560.4504880.2910000.3682090.5710470.4320000.3058140.3254650.2249300.3345350.6907670.0872090.3354650.5264190.4801160.2955120.1958840.7315350.5155810.6013720.7445120.7239770.5657210.7105350.5682330.3560930.3560930.1592090.3144420.2375350.1202790.4134190.5348370.5442090.3753490.3536740.5010930.4455580.2798600.2263950.5386980.3400230.5535350.2572790.7629770.7403950.4980230.5652790.3365810.3918600.3397670.4022560.4226980.3642790.4192090.4131400.4161630.5843720.2838370.3529770.3848370.5216280.6376510.6491400.3199300.3140930.6454420.2907210.4444650.5068140.5165580.6065350.2283260.3081160.4663720.1831160.2726510.2388840.4566980.5917910.5709770.2758840.2586740.3953490.3030930.6081630.8089530.4877670.3179070.2540700.5211400.2411630.7555350.4873020.5264650.3784880.6020230.6477910.8869070.8793020.4266980.5117210.7076980.1937440.4738140.5206980.4808840.6021160.4163950.3004650.3953020.3679070.2672090.6208370.5241860.5979770.5527910.5413720.5053260.6566050.6109770.6226050.1855580.4736740.4433260.5450000.8193950.1496050.4134190.5458600.5633950.3418600.3028140.2477670.4193720.2110700.1944190.5176510.2542090.4043260.8688370.5942090.4587440.6276980.6066740.4681400.4756740.4608600.5346050.6551630.6204650.5213020.4743950.4157910.3879530.3457910.4114880.2020700.3577670.6463260.6089770.5230470.6747210.6929530.3198140.3943260.4938840.3971400.5174650.5223020.5847210.3818140.6364650.6690000.5897910.5737440.1057910.4728140.4731160.2585350.4928840.4835350.4287670.3193950.4631630.3129770.4929530.5806050.5713720.4731400.5383260.4733260.4792560.3768840.4423020.3553020.5280700.6155810.6454650.5460230.4124420.5890000.1572790.3798370.5027440.4502560.4808600.4665120.4474420.6183720.7621860.5018140.4323260.5417440.3351630.3209530.8008600.6631160.6070470.4809770.5170700.4399530.5458140.5538370.5762790.5460930.5733950.4295810.5188600.5120000.4172560.4060930.4012090.2790930.4756050.3697670.3176980.3099770.3656740.3803490.3383490.4053950.6714650.6167210.3879300.5936510.4696980.4234420.4500700.5666980.4135810.3622330.4375810.6356980.8766980.5792790.2995350.5013260.4713260.2559530.2995810.2547440.2687440.3590230.3694420.3086980.3759070.3578600.2862090.4816740.4801400.3484420.3134880.2861860.2719300.3519530.3941630.3323950.3983020.3187210.3143950.4294650.5110470.3444420.4792560.3768840.3755580.3485580.5014190.357140
\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "df_scale_composition = sf.scale_composition(df_seq=df_seq, df_scales=df_scales, return_df=True)\n", + "aa.display_df(df_scale_composition, n_rows=10, show_shape=True)" + ] + }, + { + "cell_type": "markdown", + "id": "befac034", + "metadata": {}, + "source": [ + "Use ``list_parts`` to average only over selected sequence parts (concatenated per sequence). For example, restrict the baseline to the TMD:" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "ff9e0690", + "metadata": { + "execution": { + "iopub.execute_input": "2026-07-03T19:32:59.069547Z", + "iopub.status.busy": "2026-07-03T19:32:59.069490Z", + "iopub.status.idle": "2026-07-03T19:32:59.086766Z", + "shell.execute_reply": "2026-07-03T19:32:59.086591Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Shape of X (TMD only): (126, 586)\n" + ] + } + ], + "source": [ + "X_tmd = sf.scale_composition(df_seq=df_seq, df_scales=df_scales, list_parts=\"tmd\")\n", + "print(f\"Shape of X (TMD only): {X_tmd.shape}\")" + ] + }, + { + "cell_type": "markdown", + "id": "a573e32c", + "metadata": {}, + "source": [ + "**Further parameters.** ``df_scales`` defaults to the bundled scales (or ``options['df_scales']``) when omitted, so ``sf.scale_composition(df_seq=df_seq)`` returns the scale-average matrix over the default scale set." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "3c84c7e2", + "metadata": { + "execution": { + "iopub.execute_input": "2026-07-03T19:32:59.087779Z", + "iopub.status.busy": "2026-07-03T19:32:59.087725Z", + "iopub.status.idle": "2026-07-03T19:32:59.105005Z", + "shell.execute_reply": "2026-07-03T19:32:59.104814Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Shape of X (default scales): (126, 586)\n" + ] + } + ], + "source": [ + "X_default = sf.scale_composition(df_seq=df_seq)\n", + "print(f\"Shape of X (default scales): {X_default.shape}\")" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.13.11" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/tests/unit/sequence_feature_tests/test_sf_scale_composition.py b/tests/unit/sequence_feature_tests/test_sf_scale_composition.py new file mode 100644 index 00000000..5fab2a5f --- /dev/null +++ b/tests/unit/sequence_feature_tests/test_sf_scale_composition.py @@ -0,0 +1,268 @@ +"""This is a script to test the SequenceFeature().scale_composition() method.""" +from hypothesis import given, settings +import hypothesis.strategies as st +import warnings +import pytest +import numpy as np +import pandas as pd +import aaanalysis as aa + +# Set default deadline from 200 to 400 +settings.register_profile("ci", deadline=None) +settings.load_profile("ci") + +aa.options["verbose"] = False + +LIST_PARTS = ['tmd', 'tmd_e', 'tmd_n', 'tmd_c', 'jmd_n', 'jmd_c', 'ext_c', 'ext_n', + 'tmd_jmd', 'jmd_n_tmd_n', 'tmd_c_jmd_c', 'ext_n_tmd_n', 'tmd_c_ext_c'] + + +def _get_input(n_samples=10): + """Load a small DOM_GSEC fixture and the default scales.""" + aa.options["verbose"] = False + df_seq = aa.load_dataset(name="DOM_GSEC", n=n_samples) + df_scales = aa.load_scales() + return df_seq, df_scales + + +def _manual_scale_X(df_parts, df_scales): + """Cell-27 comprehension over the concatenated jmd_n + tmd + jmd_c span.""" + seqs = (df_parts["jmd_n"] + df_parts["tmd"] + df_parts["jmd_c"]).to_list() + return np.array([df_scales.loc[[a for a in s if a in df_scales.index]].mean(axis=0).values + for s in seqs]) + + +class TestScaleMean: + """Test class for the 'scale_composition' method of the SequenceFeature class.""" + + # Positive tests + def test_valid_df_seq(self): + """Positive test for valid 'df_seq' input (several sizes).""" + for n in [3, 5, 10]: + df_seq, df_scales = _get_input(n_samples=n) + sf = aa.SequenceFeature() + X = sf.scale_composition(df_seq=df_seq, df_scales=df_scales) + assert isinstance(X, np.ndarray) + assert X.shape == (len(df_seq), df_scales.shape[1]) + + def test_valid_df_scales(self): + """Positive test for valid 'df_scales' input, incl. a column subset and the default.""" + df_seq, df_scales = _get_input() + sf = aa.SequenceFeature() + # Full scales + X = sf.scale_composition(df_seq=df_seq, df_scales=df_scales) + assert X.shape[1] == df_scales.shape[1] + # Subset of scales + sub = df_scales.iloc[:, :5] + X_sub = sf.scale_composition(df_seq=df_seq, df_scales=sub) + assert X_sub.shape == (len(df_seq), 5) + # Default (df_scales=None) loads the bundled scales + X_def = sf.scale_composition(df_seq=df_seq) + assert isinstance(X_def, np.ndarray) + assert X_def.shape[0] == len(df_seq) + + @settings(max_examples=6, deadline=None) + @given(list_parts=st.lists(st.sampled_from(LIST_PARTS), min_size=1, max_size=3, unique=True)) + def test_valid_list_parts(self, list_parts): + """Positive test for valid 'list_parts' inputs (single, str, multiple).""" + df_seq, df_scales = _get_input(n_samples=8) + sf = aa.SequenceFeature() + X = sf.scale_composition(df_seq=df_seq, df_scales=df_scales, list_parts=list_parts) + assert isinstance(X, np.ndarray) + assert X.shape == (len(df_seq), df_scales.shape[1]) + # A single part may also be passed as a bare string + X_str = sf.scale_composition(df_seq=df_seq, df_scales=df_scales, list_parts=list_parts[0]) + assert X_str.shape == (len(df_seq), df_scales.shape[1]) + + def test_valid_list_parts_none_is_whole_span(self): + """list_parts=None equals the explicit jmd_n + tmd + jmd_c part list.""" + df_seq, df_scales = _get_input() + sf = aa.SequenceFeature() + X_none = sf.scale_composition(df_seq=df_seq, df_scales=df_scales, list_parts=None) + X_explicit = sf.scale_composition(df_seq=df_seq, df_scales=df_scales, + list_parts=["jmd_n", "tmd", "jmd_c"]) + assert np.allclose(X_none, X_explicit, equal_nan=True) + + def test_valid_return_df(self): + """Positive test for valid 'return_df' input.""" + df_seq, df_scales = _get_input() + sf = aa.SequenceFeature() + X = sf.scale_composition(df_seq=df_seq, df_scales=df_scales, return_df=False) + assert isinstance(X, np.ndarray) + df = sf.scale_composition(df_seq=df_seq, df_scales=df_scales, return_df=True) + assert isinstance(df, pd.DataFrame) + assert list(df.columns) == list(df_scales.columns) + assert df.shape == (len(df_seq), df_scales.shape[1]) + # Values agree between the array and DataFrame forms + assert np.allclose(np.asarray(df.values, dtype=float), X, equal_nan=True) + + # Negative tests + def test_invalid_df_seq(self): + """Negative test for invalid 'df_seq' input.""" + df_seq, df_scales = _get_input() + sf = aa.SequenceFeature() + with pytest.raises(ValueError): + sf.scale_composition(df_seq=None, df_scales=df_scales) + with pytest.raises(ValueError): + sf.scale_composition(df_seq="invalid_input", df_scales=df_scales) + with pytest.raises(ValueError): + sf.scale_composition(df_seq=pd.DataFrame({"wrong": ["A"]}), df_scales=df_scales) + + def test_invalid_df_scales(self): + """Negative test for invalid 'df_scales' input.""" + df_seq, _ = _get_input() + sf = aa.SequenceFeature() + with pytest.raises(ValueError): + sf.scale_composition(df_seq=df_seq, df_scales="invalid_input") + + def test_invalid_list_parts(self): + """Negative test for invalid 'list_parts' input.""" + df_seq, df_scales = _get_input() + sf = aa.SequenceFeature() + with pytest.raises(ValueError): + sf.scale_composition(df_seq=df_seq, df_scales=df_scales, list_parts=["not_a_part"]) + with pytest.raises(ValueError): + sf.scale_composition(df_seq=df_seq, df_scales=df_scales, list_parts=[]) + + def test_invalid_return_df(self): + """Negative test for invalid 'return_df' input.""" + df_seq, df_scales = _get_input() + sf = aa.SequenceFeature() + with pytest.raises(ValueError): + sf.scale_composition(df_seq=df_seq, df_scales=df_scales, return_df="not_a_boolean") + + +class TestScaleMeanComplex: + """Complex positive / negative tests for the 'scale_composition' method.""" + + def test_valid_combinations(self): + """Test with valid combinations of parameters.""" + df_seq, df_scales = _get_input(n_samples=8) + sf = aa.SequenceFeature() + for list_parts in [None, "tmd", ["jmd_n", "jmd_c"], ["tmd_jmd"]]: + for return_df in [True, False]: + out = sf.scale_composition(df_seq=df_seq, df_scales=df_scales, + list_parts=list_parts, return_df=return_df) + if return_df: + assert isinstance(out, pd.DataFrame) + else: + assert isinstance(out, np.ndarray) + assert np.asarray(out).shape == (len(df_seq), df_scales.shape[1]) + + def test_invalid_combinations(self): + """Test with invalid combinations of parameters.""" + df_seq, df_scales = _get_input() + sf = aa.SequenceFeature() + with pytest.raises(ValueError): + sf.scale_composition(df_seq=None, df_scales="invalid") + with pytest.raises(ValueError): + sf.scale_composition(df_seq=df_seq, df_scales=df_scales, list_parts="bad_part", return_df="bad") + + +class TestScaleMeanGoldenValues: + """Hand-computed values, the notebook-comprehension match, and edge cases.""" + + def test_golden_matches_notebook_comprehension(self): + """Output equals the gamma-secretase notebook (cell 27) comprehension on DOM_GSEC.""" + aa.options["verbose"] = False + df_seq = aa.load_dataset(name="DOM_GSEC") + df_scales = aa.load_scales() + sf = aa.SequenceFeature() + df_parts = sf.get_df_parts(df_seq=df_seq, list_parts=["jmd_n", "tmd", "jmd_c"]) + X_manual = _manual_scale_X(df_parts=df_parts, df_scales=df_scales) + X = sf.scale_composition(df_seq=df_seq, df_scales=df_scales) + assert X.shape == X_manual.shape + assert np.allclose(X, X_manual, equal_nan=True) + + def test_golden_hand_computed_mean(self): + """'AC' (jmd empty) over a single scale -> mean(S1[A]=1, S1[C]=2) == 1.5 exactly.""" + order = "ACDEFGHIKLMNPQRSTVWY" + df_scales = pd.DataFrame({"S1": {a: float(i + 1) for i, a in enumerate(order)}}) + # Part-based df_seq with jmd_n/jmd_c so the span is exactly the TMD 'AC' + df_seq = pd.DataFrame({"entry": ["E1"], "jmd_n": [""], "tmd": ["AC"], "jmd_c": [""]}) + sf = aa.SequenceFeature() + X = sf.scale_composition(df_seq=df_seq, df_scales=df_scales) + assert X.shape == (1, 1) + assert float(X[0, 0]) == 1.5 + + def test_golden_frequency_weighted(self): + """Residues count by frequency: 'AAC' -> mean(1, 1, 2) == 4/3.""" + order = "ACDEFGHIKLMNPQRSTVWY" + df_scales = pd.DataFrame({"S1": {a: float(i + 1) for i, a in enumerate(order)}}) + df_seq = pd.DataFrame({"entry": ["E1"], "jmd_n": [""], "tmd": ["AAC"], "jmd_c": [""]}) + sf = aa.SequenceFeature() + X = sf.scale_composition(df_seq=df_seq, df_scales=df_scales) + assert np.isclose(float(X[0, 0]), 4.0 / 3.0) + + def test_non_canonical_residues_dropped(self): + """Non-canonical residues ('X') and gaps are ignored before averaging.""" + order = "ACDEFGHIKLMNPQRSTVWY" + df_scales = pd.DataFrame({"S1": {a: float(i + 1) for i, a in enumerate(order)}}) + # 'AXC' should equal 'AC' because 'X' is not in the scale index + df_seq = pd.DataFrame({"entry": ["E1", "E2"], "jmd_n": ["", ""], + "tmd": ["AXC", "AC"], "jmd_c": ["", ""]}) + sf = aa.SequenceFeature() + X = sf.scale_composition(df_seq=df_seq, df_scales=df_scales) + assert float(X[0, 0]) == float(X[1, 0]) == 1.5 + + def test_multi_char_scale_label_never_matches_residue(self): + """A multi-character index label in df_scales must not be matched by a residue. + + The byte lookup registers single-character labels only, mirroring the notebook's + per-character ``a in df_scales.index`` test, so a spurious ``'AC'`` scale row cannot + pull the span 'AC' toward its value. + """ + order = "ACDEFGHIKLMNPQRSTVWY" + df_scales = pd.DataFrame({"S1": {a: float(i + 1) for i, a in enumerate(order)}}) + df_scales.loc["AC"] = 99.0 # multi-character label that must be ignored + df_seq = pd.DataFrame({"entry": ["E1"], "jmd_n": [""], "tmd": ["AC"], "jmd_c": [""]}) + sf = aa.SequenceFeature() + X = sf.scale_composition(df_seq=df_seq, df_scales=df_scales) + assert float(X[0, 0]) == 1.5 # mean(S1[A]=1, S1[C]=2), 'AC' label ignored + + def test_non_latin1_residues_dropped(self): + """Codepoints above 255 (e.g. 'Ā') are treated as non-canonical and dropped, not crash.""" + order = "ACDEFGHIKLMNPQRSTVWY" + df_scales = pd.DataFrame({"S1": {a: float(i + 1) for i, a in enumerate(order)}}) + # 'AĀC' and lowercase 'AcC' both reduce to the canonical 'AC' + df_seq = pd.DataFrame({"entry": ["E1", "E2"], "jmd_n": ["", ""], + "tmd": ["AĀC", "AcC"], "jmd_c": ["", ""]}) + sf = aa.SequenceFeature() + X = sf.scale_composition(df_seq=df_seq, df_scales=df_scales) + assert float(X[0, 0]) == float(X[1, 0]) == 1.5 + + def test_edge_all_non_canonical_is_nan(self): + """An all-non-canonical / empty span yields an all-NaN row and warns when verbose.""" + order = "ACDEFGHIKLMNPQRSTVWY" + df_scales = pd.DataFrame({"S1": {a: float(i + 1) for i, a in enumerate(order)}, + "S2": {a: float(i) for i, a in enumerate(order)}}) + df_seq = pd.DataFrame({"entry": ["E1", "E2"], "jmd_n": ["", ""], + "tmd": ["XXXX", "AC"], "jmd_c": ["", ""]}) + sf = aa.SequenceFeature(verbose=True) + with warnings.catch_warnings(record=True) as records: + warnings.simplefilter("always") + X = sf.scale_composition(df_seq=df_seq, df_scales=df_scales) + assert np.all(np.isnan(X[0])) # all-non-canonical -> NaN row + assert np.all(np.isfinite(X[1])) # canonical row stays finite + assert any("no scored residue" in str(r.message) for r in records) + + def test_edge_all_non_canonical_silent_when_not_verbose(self): + """No warning is emitted for the NaN row when verbose=False.""" + order = "ACDEFGHIKLMNPQRSTVWY" + df_scales = pd.DataFrame({"S1": {a: float(i + 1) for i, a in enumerate(order)}}) + df_seq = pd.DataFrame({"entry": ["E1"], "jmd_n": [""], "tmd": ["XXXX"], "jmd_c": [""]}) + sf = aa.SequenceFeature(verbose=False) + with warnings.catch_warnings(record=True) as records: + warnings.simplefilter("always") + X = sf.scale_composition(df_seq=df_seq, df_scales=df_scales) + assert np.all(np.isnan(X[0])) + assert not any("no scored residue" in str(r.message) for r in records) + + def test_property_shape_invariant(self): + """Invariant: result is (n_samples, n_scales) for every input size.""" + df_scales = aa.load_scales() + for n in [3, 7, 12]: + df_seq = aa.load_dataset(name="DOM_GSEC", n=n) + sf = aa.SequenceFeature() + X = np.asarray(sf.scale_composition(df_seq=df_seq, df_scales=df_scales)) + assert X.shape == (len(df_seq), df_scales.shape[1])