From 44859c2222f007f9171777669ed8d1d84ce71693 Mon Sep 17 00:00:00 2001 From: ModelHub XC Date: Tue, 30 Jun 2026 11:04:16 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=9D=E5=A7=8B=E5=8C=96=E9=A1=B9=E7=9B=AE?= =?UTF-8?q?=EF=BC=8C=E7=94=B1ModelHub=20XC=E7=A4=BE=E5=8C=BA=E6=8F=90?= =?UTF-8?q?=E4=BE=9B=E6=A8=A1=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Model: occ-ai/OCC-RAG-1.7B Source: Original Platform --- .gitattributes | 36 +++++++++ README.md | 166 ++++++++++++++++++++++++++++++++++++++++ chat_template.jinja | 20 +++++ config.json | 63 +++++++++++++++ figures/github-mark.png | Bin 0 -> 453 bytes figures/occ.png | Bin 0 -> 24023 bytes generation_config.json | 12 +++ model.safetensors | 3 + tokenizer.json | 3 + tokenizer_config.json | 44 +++++++++++ 10 files changed, 347 insertions(+) create mode 100644 .gitattributes create mode 100644 README.md create mode 100644 chat_template.jinja create mode 100644 config.json create mode 100644 figures/github-mark.png create mode 100644 figures/occ.png create mode 100644 generation_config.json create mode 100644 model.safetensors create mode 100644 tokenizer.json create mode 100644 tokenizer_config.json diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..52373fe --- /dev/null +++ b/.gitattributes @@ -0,0 +1,36 @@ +*.7z filter=lfs diff=lfs merge=lfs -text +*.arrow filter=lfs diff=lfs merge=lfs -text +*.bin filter=lfs diff=lfs merge=lfs -text +*.bz2 filter=lfs diff=lfs merge=lfs -text +*.ckpt filter=lfs diff=lfs merge=lfs -text +*.ftz filter=lfs diff=lfs merge=lfs -text +*.gz filter=lfs diff=lfs merge=lfs -text +*.h5 filter=lfs diff=lfs merge=lfs -text +*.joblib filter=lfs diff=lfs merge=lfs -text +*.lfs.* filter=lfs diff=lfs merge=lfs -text +*.mlmodel filter=lfs diff=lfs merge=lfs -text +*.model filter=lfs diff=lfs merge=lfs -text +*.msgpack filter=lfs diff=lfs merge=lfs -text +*.npy filter=lfs diff=lfs merge=lfs -text +*.npz filter=lfs diff=lfs merge=lfs -text +*.onnx filter=lfs diff=lfs merge=lfs -text +*.ot filter=lfs diff=lfs merge=lfs -text +*.parquet filter=lfs diff=lfs merge=lfs -text +*.pb filter=lfs diff=lfs merge=lfs -text +*.pickle filter=lfs diff=lfs merge=lfs -text +*.pkl filter=lfs diff=lfs merge=lfs -text +*.pt filter=lfs diff=lfs merge=lfs -text +*.pth filter=lfs diff=lfs merge=lfs -text +*.rar filter=lfs diff=lfs merge=lfs -text +*.safetensors filter=lfs diff=lfs merge=lfs -text +saved_model/**/* filter=lfs diff=lfs merge=lfs -text +*.tar.* filter=lfs diff=lfs merge=lfs -text +*.tar filter=lfs diff=lfs merge=lfs -text +*.tflite filter=lfs diff=lfs merge=lfs -text +*.tgz filter=lfs diff=lfs merge=lfs -text +*.wasm filter=lfs diff=lfs merge=lfs -text +*.xz filter=lfs diff=lfs merge=lfs -text +*.zip filter=lfs diff=lfs merge=lfs -text +*.zst filter=lfs diff=lfs merge=lfs -text +*tfevents* filter=lfs diff=lfs merge=lfs -text +tokenizer.json filter=lfs diff=lfs merge=lfs -text diff --git a/README.md b/README.md new file mode 100644 index 0000000..fca8265 --- /dev/null +++ b/README.md @@ -0,0 +1,166 @@ +--- +license: mit +language: +- en +- ru +library_name: transformers +pipeline_tag: text-generation +base_model: Qwen/Qwen3-1.7B-Base +tags: +- rag +- faithful-qa +- occ +--- + +# OCC-RAG-1.7B + +

+ OCC-RAG +

+ +

+ GitHub  |  + Technical Report  |  + Cloud +

+ +**OCC-RAG-1.7B** is a 1.7B-parameter small language model specialized for **faithful, context-grounded question answering**. Along with OCC-RAG-0.6B, it belongs to the first generation of **Optimal Cognitive Core (OCC)** specialized reasoning models. Given a question and a set of sources, it produces a structured reasoning trace with explicit source citations, decides whether the context actually supports an answer, and either answers from the context or abstains. + +Despite its size, OCC-RAG-1.7B matches or exceeds general-purpose models **2–6× larger** on multi-hop reasoning, faithfulness, and refusal benchmarks, and attains the best faithfulness across all evaluated scales (up to 32B). It is mid-trained from `Qwen/Qwen3-1.7B-Base` on a large synthetic corpus of multi-context, multi-hop QA with citation-anchored reasoning traces. + +## Highlights + +- **Faithful by design** — answers only from the supplied context; achieves the best faithfulness (lowest memorization ratio) across all evaluated scales, including 32B models. +- **Calibrated abstention** — outputs `Not enough information` when the context does not support an answer. +- **Structured, citable reasoning** — every answer comes with a transparent trace (query analysis → source analysis → reasoning → status → answer) that cites sources by id. +- **Compact** — a small model that delivers chain-of-thought-level transparency at a fraction of full thinking-mode inference cost. + +## Model overview + +OCC-RAG-1.7B is mid-trained from `Qwen/Qwen3-1.7B-Base` via supervised fine-tuning on a synthetic corpus of **~3.25M QA pairs** (~2.78M single-hop, ~262k multi-hop single-context, ~165k multi-hop multi-context, and ~43k abstain examples), distilled from a larger teacher with citation-anchored reasoning traces. Multi-hop and multi-context subsets are oversampled to emphasize compositional reasoning. The prompt/response format is identical at training and inference time, so no train–test mismatch is introduced. + +## Evaluation + +Evaluated across multi-hop reasoning (HotpotQA, MuSiQue, TAT-QA), faithfulness (ConFiQA), and refusal (MuSiQue-Un). In-Acc = the gold answer appears as a substring of the prediction; F1 = token-level overlap between prediction and gold answer; M_R = memorization ratio (lower = more faithful); R-Acc = refusal accuracy. + +| Model | HotpotQA
In-Acc | MuSiQue
In-Acc | TAT-QA
F1 | ConFiQA
In-Acc | ConFiQA
M_R ↓ | MuSiQue-Un
R-Acc | +|---|---|---|---|---|---|---| +| gemma-3-4b-it | 55.8 | 30.1 | 65.3 | 69.8 | 8.9 | 55.8 | +| Qwen3-1.7B (think) | 60.9 | 30.7 | 74.8 | 70.4 | 8.3 | 82.8 | +| Qwen3-4B (think) | 67.1 | 41.5 | 79.1 | 74.1 | 7.5 | 84.0 | +| Pleias-RAG-1.2B | 48.5 | 15.0 | 8.4 | 37.3 | 25.3 | 21.9 | +| OCC-RAG-0.6B | 57.6 | 36.6 | 75.0 | 79.9 | 5.2 | 86.9 | +| **OCC-RAG-1.7B** | **60.9** | **38.2** | **81.0** | **81.4** | **5.0** | **87.2** | + +OCC-RAG-1.7B closes the gap with Qwen3-4B (thinking) on multi-hop reasoning while attaining the **best faithfulness** (highest ConFiQA In-Acc, lowest M_R) across all evaluated scales, and refusal accuracy on par with 8B+ models. Mid-training reduces the memorization ratio from 12.7 (8.3 in thinking mode) for Qwen3-1.7B down to 5.0. + +## Input / output format + +OCC-RAG uses a **structured prompt format with special tokens**. The question is wrapped in `<|query_start|> … <|query_end|>` and each source in `<|source_start|><|source_id|>N … <|source_end|>`. + +The response is split into five sections, each delimited by special tokens: + +| Section | Tokens | Content | +|---|---|---| +| Query analysis | `<\|query_analysis_start\|> … <\|query_analysis_end\|>` | Decomposes the question into what must be found. | +| Source analysis | `<\|source_analysis_start\|> … <\|source_analysis_end\|>` | Assesses each source's relevance, citing by `<\|source_id\|>N`. | +| Reasoning | `<\|reasoning_start\|> … <\|reasoning_end\|>` | Composes evidence across sources into a multi-hop chain. | +| Status | `<\|status_start\|> … <\|status_end\|>` | `ANSWERABLE` / `UNANSWERABLE` verdict. | +| Answer | `<\|answer_start\|> … <\|answer_end\|>` | The final answer span, or the refusal phrase. | + +## Quickstart (Transformers) + +The chat template accepts a `documents=` kwarg and emits the structural tokens for the query and sources automatically — pass the user message as plain text and the sources as a list of dicts. + +```python +import re +from transformers import AutoModelForCausalLM, AutoTokenizer + +MODEL = "occ-ai/OCC-RAG-1.7B" + +tokenizer = AutoTokenizer.from_pretrained(MODEL) +model = AutoModelForCausalLM.from_pretrained(MODEL, torch_dtype="auto", device_map="auto") + +question = "Which country is the inventor of the telephone, Alexander Graham Bell, buried in?" +documents = [ + {"text": "Alexander Graham Bell was a Scottish-born inventor best known for patenting the first practical telephone."}, + {"text": "Bell died on August 2, 1922, at his estate Beinn Bhreagh, near Baddeck, Nova Scotia, and was buried there."}, + {"text": "Nova Scotia is a province on the east coast of Canada."}, +] + +text = tokenizer.apply_chat_template( + [{"role": "user", "content": question}], + documents=documents, + tokenize=False, + add_generation_prompt=True, + enable_thinking=False, +) + +# Alternative: assemble the structural tokens yourself. +# +# query_start, query_end = "<|query_start|>", "<|query_end|>" +# source_start, source_end, source_id = "<|source_start|>", "<|source_end|>", "<|source_id|>" +# +# def build_user_content(question, sources): +# content = f"{query_start}{question}{query_end}\n" +# for i, s in enumerate(sources, start=1): +# content += f"{source_start}{source_id}{i} {s}{source_end}\n" +# return content +# +# messages = [{"role": "user", "content": build_user_content(question, [d["text"] for d in documents])}] +# text = tokenizer.apply_chat_template( +# messages, tokenize=False, add_generation_prompt=True, enable_thinking=False +# ) + +inputs = tokenizer([text], return_tensors="pt").to(model.device) +outputs = model.generate(**inputs, max_new_tokens=2048) +response = tokenizer.decode(outputs[0][inputs.input_ids.shape[1]:], skip_special_tokens=False) +print(response) + +m = re.search(r"<\|answer_start\|>(.*)", response, re.DOTALL) +print("Answer:", m.group(1).strip() if m else "") # -> Canada +``` + +> [!NOTE] +> We recommend greedy decoding (`do_sample=False`), which is the training/evaluation default and is baked into `generation_config.json`. Qwen3's default sampling parameters ([best practices](https://huggingface.co/Qwen/Qwen3-1.7B#best-practices)) also work fine. + +## Deployment + +OCC-RAG-1.7B is a standard Qwen3 causal LM and is compatible with vLLM, SGLang, and other Transformers-based serving stacks. With only 1.7B parameters, it can be readily deployed in constrained infrastructure, including desktop systems running on CPU RAM. When serving, keep `skip_special_tokens=False` if you need to parse the structural tokens out of the raw output. + +Compatible runtimes: + +- `transformers>=5.5.1` +- `vllm>=0.19.1` +- `sglang>=0.5.11` + +When using an OpenAI-compatible server, the `documents=` kwarg is reachable from the client via `chat_template_kwargs`: + +```python +client.chat.completions.create( + model="occ-ai/OCC-RAG-1.7B", + messages=[{"role": "user", "content": question}], + extra_body={"chat_template_kwargs": {"documents": documents}}, +) +``` + +## Limitations + +- **Context-grounded only.** The model is trained to answer from the supplied sources and to ignore parametric knowledge. It is not a general-purpose chat or knowledge model. +- **Reasoning depth.** Training and evaluation are capped at three-hop reasoning; longer chains are out of distribution. + +## Citation + +If you find our work helpful, feel free to give us a cite. + +```bibtex +@misc{savkin2026occragoptimalcognitivecore, + title = {OCC-RAG: Optimal Cognitive Core for Faithful Question Answering}, + author = {Maksim Savkin and Mikhail Goncharov and Alexander Gambashidze and Alla Chepurova and Dmitrii Tarasov and Nikita Andriianov and Daria Pugacheva and Vasily Konovalov and Andrey Galichin and Ivan Oseledets}, + year = {2026}, + eprint = {2606.00683}, + archivePrefix = {arXiv}, + primaryClass = {cs.CL}, + url = {https://arxiv.org/abs/2606.00683} +} +``` diff --git a/chat_template.jinja b/chat_template.jinja new file mode 100644 index 0000000..333ed29 --- /dev/null +++ b/chat_template.jinja @@ -0,0 +1,20 @@ +{%- for message in messages -%} + {%- if message['role'] == 'system' -%} + {{ '<|im_start|>system\n' + message['content'] + '<|im_end|>\n' }} + {%- elif message['role'] == 'user' -%} + {%- if documents and loop.last -%} + {{ '<|im_start|>user\n<|query_start|>' + message['content'] + '<|query_end|>\n' }} + {%- for doc in documents -%} + {{ '<|source_start|><|source_id|>' + (loop.index | string) + ' ' + doc['text'] + '<|source_end|>\n' }} + {%- endfor -%} + {{ '<|im_end|>\n' }} + {%- else -%} + {{ '<|im_start|>user\n' + message['content'] + '<|im_end|>\n' }} + {%- endif -%} + {%- elif message['role'] == 'assistant' -%} + {{ '<|im_start|>assistant\n\n\n\n\n' + message['content'] + '<|im_end|>\n' }} + {%- endif -%} +{%- endfor -%} +{%- if add_generation_prompt -%} + {{ '<|im_start|>assistant\n\n\n\n\n<|query_analysis_start|>\n' }} +{%- endif -%} diff --git a/config.json b/config.json new file mode 100644 index 0000000..418a354 --- /dev/null +++ b/config.json @@ -0,0 +1,63 @@ +{ + "architectures": [ + "Qwen3ForCausalLM" + ], + "attention_bias": false, + "attention_dropout": 0.0, + "bos_token_id": null, + "dtype": "bfloat16", + "eos_token_id": 151643, + "head_dim": 128, + "hidden_act": "silu", + "hidden_size": 2048, + "initializer_range": 0.02, + "intermediate_size": 6144, + "layer_types": [ + "full_attention", + "full_attention", + "full_attention", + "full_attention", + "full_attention", + "full_attention", + "full_attention", + "full_attention", + "full_attention", + "full_attention", + "full_attention", + "full_attention", + "full_attention", + "full_attention", + "full_attention", + "full_attention", + "full_attention", + "full_attention", + "full_attention", + "full_attention", + "full_attention", + "full_attention", + "full_attention", + "full_attention", + "full_attention", + "full_attention", + "full_attention", + "full_attention" + ], + "max_position_embeddings": 32768, + "max_window_layers": 28, + "model_type": "qwen3", + "num_attention_heads": 16, + "num_hidden_layers": 28, + "num_key_value_heads": 8, + "pad_token_id": 151643, + "rms_norm_eps": 1e-06, + "rope_parameters": { + "rope_theta": 1000000, + "rope_type": "default" + }, + "sliding_window": null, + "tie_word_embeddings": true, + "transformers_version": "5.5.4", + "use_cache": true, + "use_sliding_window": false, + "vocab_size": 151936 +} diff --git a/figures/github-mark.png b/figures/github-mark.png new file mode 100644 index 0000000000000000000000000000000000000000..e815117ca89e4c493236fa882f6a2f9dc57cb4a4 GIT binary patch literal 453 zcmV;$0XqJPP)nwiu17eQjMQvzgPpZy@2sm^N= zaXuoB74CgRJk89vee6OdwXfnfepr;BxPybOPrscG`|;A>!49R2Vori_tX$zfk8cBHmyHLkwySu@Vul3nwBj&M&R0 z=uu_)jwAhH_AcXVVV}*~YYDfjp~SEfw0s(rZg;KLC)(CNN5nKDRwLq8W==A5JSSY{ zI5Q^^aU&uQRBK=6ajNgYMwR;*--<8mb;TV{V6!m4YQJ2*D=mixc!wug!zbKqW;1F? z2_LYh{Ih+af#U@lVQ-Hf>)0y$7EZVJ{%a4Ms%&FiYV2n!$VZ&pM#d#yM-+#y;%H+# vj4Rmp$4Zt3`(I2h`;&@8ljd7l(6#a#B8?3LvgFJ000000NkvXXu0mjfnfu6+ literal 0 HcmV?d00001 diff --git a/figures/occ.png b/figures/occ.png new file mode 100644 index 0000000000000000000000000000000000000000..6834a22d23a6610297b99ed9a5183bb654e7d1af GIT binary patch literal 24023 zcmdRW^;=X?+wQ0c(jwgg(v7r)(jg$-jdV&kBAwDmN_TfFHAr`dFm#7>oi*?KedmYs zADrRh0ycZrUh7%w$@_jL^pm_KItmdA1Oh>qmJ(BfK%PP&kSB645W$swu1<9DM$O@TmkJf+1x zsJP7^EO|RA&!n^7RZwf!Z{QQ!cMgc5NMoP+_x$}>U{NXc!7OcSFo7Af_b$q43leLe5zcbL(uf0)d_r;2<38d(aBz{rSv zF41N#HbdANYk|L-THEZ1YUfrnT$RE4z}w{AgJtH*!$HI+I-I9i@YnCxo=?T#FOT2$ zAK^baLspYRz{~t)7d!lhvDZPyl;D;90SyZOzt}f|s8IL~i0mZT@Eg#Lcxm7_5Ox3m zKR`Ua=hJv0E&sM{G{n(Y|8m|E{K_+61%E$##5>M;i}T)$&Hez!ivFO@Ie|Vm^B^>2 z{uHuqM!-Il9C?REb^10US?KCgn`5YNgstBP8AwTLi$f&qlhnl3j>eAP+ytIBagthdk=i`LCG1q!QAqMxc7)mMN~z ztv(n?#s&?Fqbgg8FX_23L4y`eE!-6{Uiy^xqxg*453reZb!;RPT&o_dIS($po(s^$ zmq~~Dgdgd+aE%l%aLO6LKIgp%f^p(wbO(EAJJdD^9;gRH8Nn#mb8&1dDhRC(4h4GS-edNrnrA&7K`?sK8T6EA?$L9HKvni zoPc~qVPc_2%?;=?M6Pg&O66= zhglFzQ-Q%Pf>$+yhc8@Vfh;_-bml5x7I(hl4UV|rA#`8CI|8V2ILR0X-&S@Ch+c4l zM<_k*s*;DVF8ZC2sO%`KCqsMy*pEVnM&!JGORyqN3N&b}bI?<_DOW7d7S@3blsrGl zF9k;8hiL1>5!D4EVq)>}1X0xd3oDW29wYX3$*;od`hfDnp!Q6EmNN$2vL>iJiQ+po z!hz6mgoBKKyCoyNL_zra{^i$0p@63!5N>a@WRNHZ#r(%Gm=+Uv*Z0LGSIO-KP4drRuAr)`J5Qrg|>@NT!LJpEzwBkmR@6z3fll z;Pjw2+z!ODrVgQ`o+A#jwjjB9A~Pj+21J$7>CuI89F8<-Fd_e#7`4K)D7`Kj8ZfPq z-%c^QzZ1jaiw8)^T$q-zQ6;Ieox52+X-~?1)PJ ztU+o^!gb1M4vCt;A9E~1ztTF0~ui~p(x?D4YY?m`q+w> zrz1}6m@+rdN5U0VdD?^CmQSxkmIqM0GW9;pn5mC?iet5h%13vW^rxF?k2>c+ z_qNfMZpkKLxs=}EcOx3!uml?7&0cmfU#d1+I-P9WHe+282qV5!;I+2OvW3bo4a?Ce z8diCSKY z-g2Ni#&FRqT-2`NJ?L#nv`ub);mR>Oi7liUQ{=|POcaI$!^mc3WrFTgv)xuLZF|d? zJpWn?A#FZ##FC}%tw(;-D)diJ z(I7?1ue4LgBsq3Va!++dycXfUus@UDlOgv>!@@Ukc4W8+77nNj=WdutK97mU0ws`~ zYqcU*u4%(#J(wjt@haamE%h;F-qpXo4%o7;(UMG`kiy+SRjhGF-E}?saDFi#@?EFn z7F|H&0m9Hf#e)@8!Op^AYbU5E8X^!;0%HQouPOsX_TZ$!7 z_04-TI=>@^f>;IuB!16P?^OnV1%0t2+`!+wPy8Pqtj_-k;+NB?{^`leP!pJXpy2=Z zM-xSCOqEG5n@DN8R10}4W~G-DkGotS3H(-654GfV)7Unxh+#-#7VmoS#wuBXX!w?j z3{xnv38H8Vfl|6ADDy6?FncnvBRgH_lu#d9?HSQc zhjf(fX-Q!?(MbO22Qfm1wZem3?!UZUo4VrPjh0>fDt1d8hg)@XrS@dk>6S0b=JXiL z%t3IZhx2SLvs0r0`u0`s*)uov;p+T`hI0I`r_=6P@ z9Aq?&6ArW669Fgx@9jSsC8wqrz6x(&(+W2%451@@&0l4tWBG zB4hEpPI#$hLk#GqgCEMtoHA^r!@h)@TrcO3sg~4Q)y$P5Bln7CD%j+t)>KK~FqF*) z3C%gi%9Y{JjO8H$1*R;Wx2|#)BE+oonO?29|F(fj)oa7sSB}fc9Rzcb3OWWZYYc3o zXw@(pbHk{klzh;U15x@sV%``(cSKT-b;d4A`u?;gcPbYpTJusyZF?D6+2rdO>X(*C z4k~5(1zP@bFD!#2c>52Zu-UsBuhV=KY;~ZzH|C9sTNV{s*-* z9Ij#BZY%A}kWuk?)GOGYbM>Ly80l4G zidN3}0xyXgwp>|MYqr;FC6BnJ>&qzqp1S0m^=^9-q_*I|_hy*Q!}XQ7VzDot`){{p zAMtQ_JZ8{3qvtGIPWunx&3P~{^2^fHXg1 zYoI3|Pl%hI$Sbzmx3EgNle!c+v5yuTi*P6{CG&jcNRA;s$v!8PkB?c>nA}|sF7~p% z(s`vSBT^K)>V{Ks!(s#i+PR5F8k`r|TSmlQTf$qG4n&RhVO~XY>iS2bf@L7OQ@r4$ zL#bn9u&h&2ApX1SB1WcPx{=>)0;5aCS3G4~#-KvNAX7Vt%1$s}(vZlxs52We4hvf4 z4Qmrja>j-DKlnJM+kAbr4BjvLZtyUT0sb0O{Smml%sZZhV`t*|UN$S)-nvG@h5A$L znw_q?U5P65&PzqT*pCc&=oLMrN0!C*L^!XdZrMtRebpGzZsEg1&{7_{?-@c@6WvSWGYcp&2$`J5+`3qV%>;|9^d@JHKJ%;XeObuD8C-Mo380B;3jTL73ZpWUU~ufnvoV{(k&ZSfQ_X^zO-w<)SU-V#e6f zzp2Mv+;Sqx6N8>-SiwfEwJ0&$%YDneejdahxK>$6MY}o%oL>$1(oh^= z(7UsdV4jF1N#g(J-98FtMaTF@*Ei_T2U-93Z#6EQnGK2KElow_-2FuhzD*D4T(tlX70;Q!Xv0=p%(wv)bb>*fLUL z0uxc0`wkB!FY!^DD?A+9bw7B{Tv@5Hy0b*y9O++|>}(JH=~jQR6q4xKx;_-l1JKQ|YqGi$zT`kR%wEa!}W`+&9(nfN1H{DqiER zd}_$s`>V`Q(E8V&)!xTYQ9%@rn(q@6NE?fvoqV(Y#uhyHwZPV=z5U~h92+Pl z-2c}227ThYa2vsWqRzTpX6&RPA26yj1?u15w!P4dJIx#30CCRX5W_E!x6iT4YAK_B z+rq9yAx3SWt&U6^%D)dg{}fg2UO0dJtQ?{D12fxnn}7$e+CoUddA?+wQtFv4=I-8Q z_qhOf2|CNh0Pgm&!}wiBR%IbZa)z5-Oddb`e7KDboB=;|3L!OCCbZow>sM}pbb~{0}8zk29 z6i_oz(eLp_&{BNILgcrLICxUHe1Xl`+GGFmSu88^n`E-x2v1f<;JQZG_)^~6k<0kg z@IJzL`L)Zl-Jepws;+gt9(@Qsn%_MwO|@=38BWc@*`U$=gh7rMD>y}Ig8|fQFPd6e zyUB{z?Zq$0l&C!?2^Zc^j3*)DJ=sXTt$7NebzXDhA(8H5Phs!vqmBZaLzUjK@W<#3 z4Y5yYDtk!nso4g5XgL%XsP2-)G85pNnEpO)^7r3FZ9GnOJ-#V#uwTU<39t-4Ux$q> zUg>sWwKnX%ypvSOK8Qei`z5yEBM8nZ+ol$lZM`Rt3QCTn?y@>d{Irx%S*u*IUSESW zjh#F;%Y{;J%Hv>pkSE5n4@9dcQ6U{mZ!cd3)*m`{e%U z*EKm*ndYVB8Q7}T2N<%~zuu!&_br6#mN?_MT(YO9AiW(w>dSpw7xx!~)7(>~TuYEn zAy<|~m6+1=LkVeY*0j9bK*jmjZ^40SCeZ(Rm^0K&$=97$maV&%S`&-;EkE=|Hov8Y)h}iUyhy zWcoz3EH5dsAUB44(z0GMQ41cm)@^9nbt~_MDL&4RWa+f=W(iYOOwG+AG~9}mPGsXG zCa$^xThL@|ydREYZ;4Pk8Xn=8Du|-_3!PucA4#% zdCX$!ClC2~iIHUJC;fMc5~gOvipMHHr_GOqgbbDB`dZ*dVV>8n6?W+M&wlU~_OfkC zXP?9|F{OYy;vP+r_mZ!;M{i)moc8Zc;pfTl?%1EDMf+;FfpV70?0M1#?&)OPm5!Kh zUbY)Z%KrpB`*L2dHT74iX_p+(> zOf~Ps;Q^MJx|8dvZvJ>AqunFzvUdye*X4CVYI%iaJN~GZ$J5832N8GJ_`xX8{g2b_ z#HGfo)B&vmou&*aRFE1Tq+Y4<5OIGfK zcJpPK+j5oGK2_0G9Xt`Y)5}}`&b_Lkc3=#$%cB~`7cwZ+mcT^+z5T0v=YG@ygN^*d zT~qqn(S>wLuCQG`Nx6MQ{-W>IaxT0UR;O*d*X>m2G1Xs)WH|})^R|DsQ?}SteCcw9 z%W9}l|63KiciK#Wg^yE=`=4Sc)u5kPvd)Pq>Ms1O)V$wi8H+8ndc23V_vhOEaYmTs ztwXpU$G8RY{x$=F8N<@mRl0HG7foMkvZBq|+o9wgi?4>ma(%59Df>GBVi5HCr)McT zjIJCI-3A;ONj_z~>7RFN{JJ(II)ZB2^e!#%x{nq_zh1va(+&cm(>r>Po?nA(tMKpG z8f03Ak3zEt)YYsBuS|e$7J9myP2#GQX`dI7avC*^Oq&dbogz^#A5R@EW4l5Vnv-0M zr~gJvo<}zvza$MErzG)hxQ~x_07m#&KVgQ$w$Oi&2^gZkgPydS>P(|eBidhA8rCX0 zw4R=&rT(4x-A3fAjn7fdkw^0O9(6@LUduM_{#91mKZ z({JE>9VT0}EF^R&H0fMO2`e)m~p|wKvCgxzr z8g}DsPwLBKSYl_TRu*v9cSI1OtWpapJ(m!uOLXvaDL5`lP=o9iJX7+Jy0&LB#?~8M zi9UQBmmH{<*1f;F8gjM&GePOeU@@|?+Ld|v@XkYFFK1YL8nF$(Szs}ZHfG2)aPO+6 z(DUTlA=pH6PJpwu4s%Mop}VeH;t#dfyI*1?zt~gE+al|jV4q4ptChIt|NB1v8Mm5y z^<3vl1mC&0t$^ik_sN6~^K^_$Cgy>p!r$`uh=Y!{B9a}gEEFIr1?um2y}1_{wE!tC}mtI?FK5Oh0x|6TUxiSTcf_E!}lXxbGm6>0QEh0@Sz(1Bn>g*Q9%% zQvWUka;){blOfrOYG{L!Ek4VR`>vKAZJf<;v?o>&nHkh#u554VS64MKB}IXQ%-Z{= z;Ly4gFzG(JZMtOA72k1dwd35!H$nSbg~=sO$0rEOlV<2c`)|6-HR-9*Ay;n37KN9J z9@2C6I!o^IZZ^h1`oj}n7F2&cgFKuPMzyUlIg{ZKD}N=_r|&?@f7*l;yuRcm7~#$* z0@X3h_&o)Xr1A9lQoh8oX6D5a4H`$t)%ss{MA)0PqvO?nyT^civZl|xK!h)sAKgHD zG);z$6?2$t!kbuytl%PS>>G^fyL{<+!74AJzJTL3J{lmcd)n>`GLF@a_p9@8ph{4> z2^@?m-r0ks`H@+03}}&}cXm0s!$zjKpVMAEVsUr0s@Z{5X!T&J(F0V!J>tHsYV;OY zjWFBQCI04huD$i*Z9ZDbLo^xNz||21*jAf#5xP5wP!fGkzK*hgb}5jmGZ3h0Bycp- zQZ(T)yqlmG{~iY4YK7 zGuimT@8D3Nh|H0m{7fy+8B zUW-rfrUyynmdI7V5%^7()fql2XoT>QT=|eIc#6?)(gx!b^`p*3VjD&EfI9oNR$@sZ z{=j=*4|4F6`8F?PE?yc>$M;b^uhxBFZ~)7L_l0_NXowW65)BFYu7$Ys7M~&Pyv{l6 zwo{dUh98zQz&m-B5nlykzm#Ca^F3z~aHya%WbDFrK0H$+x!%U{xsG~E?_XW?E26`F zy+fLhPR!{DcC@Z}B6X;8f-eKW4YB?J5 zN?Z-WyazId3x~az!aEdo?2|=}9eNt>nl^iy zdf$xxhi4=`(7$4t#!F{RQucB33$aX1H`!-7FjW!&kw6|=k1m^cKgL*QxxEn#TBocb^gZia$>EaSk1pMwwnd^%`eICmg(V&L zFW4`{dIj&_Wln{zmupy*uy<*RLF?bB1$(bOJb~M?U}X-1XTPv7`HzF;h$~&jysHbo z$hC|F=X6}VA|R~P9qS*w^k92|`J951@<*)ChQ_*t0AWe5NAX*h{J`UwZeK5jrh7ozL#7`jd^gY=&zu!9RkPwj;Cq#Xp6s4}moaqI zzJyTID1!vht1IoE=hIznHyU}gl-d8{YF8WI;`~zdO|3i;OH%%q(d-v3eD;FWG55y| zF6=70!Qi0tHg8x|0dLXa-9x3tv(07mIR0qA4$KVUjFXo@&YNdV#KnXJGk0WaxYx}Xxu z{!0Z|Y<6WXI&`?*#n3oZkBjBzs(Nxr|Ix|rhiyO7zx}31J^D6`xwB#9tR=>q`R=JD zay$)gae&Yz#>1EJ(q&unXN}}`vBP#p`P%G>sUa-#Ut8eiD!zj6yMw)OE36Sl#_o`K2JW%WSi-F70qHO&T+~f9e zB4YugEvZ92f|e)W!#Ukg*~)?g!tF(S^RIj1mwT&E8># zpMVD@a=0+Kt?32V`Yj%w{k~d#4(x&JIm$w^Yj!5{5&%+5bJ3vL9zPMAJpy$nB1qnX zAd?0_vs?NJJ_{z zF9>EsXvYWl!sdR6{Cw`Z$kO`IIOnW2TjZWC!#F!084@BUU2M-}y`k|5wV|`#Hmjr; zShqXF2}DEKnBUNfhlZPbV4?Ea4FYMbJv9=s>QEp2int|=Ga(K6TUeV&wzEk{t97WL?x)?7hCZ;7D zX3u2#HX|efwtpyONR6w*HC<7M+T&b)oY9ecP0+a;)kGg162h4XXeU)Ks|ZfD;K5U&0lWx%BBBcU|`1+A#ko3Z1Ze^(m z@&5~clkIb-;&ShyC+oXl?q9spU)-2TD^Gl#J^3gQP1jTzCmazpv3YgX+C<8HJV z!tmwIu!lVb?74hjh%5f2TQ;oNNQ<4TTrlf0mE9lN7_C_NWo10JznAwP1bx3sqrz-m z0D7ZSS0zTcm$K$QG*zxWP%&l>lW1YVs&LNkII8=Ov)V|N>)qy1sc_2XWvp6p1*2Cpk8k9?j1kiP2X$5Ban3U%zn9D?W0 zQlUoco5PuL0N8Vll)}^FeIhJQ?7Y*Hf;EqOsdt!a0xwTA?)U7>`8UgFs5&Z)+@HlA zI)S)kNdo=CykkK~`2@Ks5(9#XilWEq1Hwmm7=}t%vKM<{*DrR5_JpY{`9;IRGmvV- zFw({{tgc}SMzH)Le}?<1pR*{H8NUQvw2U#)oR6~nhh(-M^3F_gufhmDa=>I_XmK1v~`vCyDr+qW2 zYF8rOvqsJS{PLIt3h)Dv(MIgrgrbH3ZNd#t>c;uYoYX=ADjx`w>lP?4VDu{Jn6t)&v(nN@a z(HjYqRL3sK0=H^=AUgXeKjLdmYZ$q zeYf%$S{jb@^VY-oHDPC!Ujpo>pO!R)?r^{_4JrkN9$fr9C7;@pKe%``Y3=PYNhB7Y_YxG(;fg&p&0M(B zhBUQcMdhCk1X7Zz8GbY4Lv~5xda#VmMW7zfDhBS!u`LG`sLHw0LcqHzKHvM))~3ew z2F};$Q3?U5Q`GHw=^eBn+liFGZFx$ef`n@w&?^jB>3{F4GUl`=hOLPMf&3LXZ3(bp zaB2~RJ>2x+J&;8}70pcez7AO?=-CmsCuT8ThpqL1x-2%)`>$W`pHT7jABNt#|2u9D z&A+v0%8g9*lgEAHOD=THdT=|$(g@>DRC)6QM6QT)%2LU@!;ZX@IX2{Wwte9WwW`Bl zTG<{}cP;CTNz8#c`(!FY4=UXUk6`cNOd^Ls1yDgNmJ<$hTQs5<8;X9!O^EKnCjgda zSI>(KGm*8sS1y&Ryv=gLbg*iKY=-p~&Kmek4_Hs2gd?-~q5jL9l1e;l_paHr1OlP> ziP8Dnm1xf%Crl7=}2R@bXf>4q#YFoAZLBtRRni!I8@;7%=As(y2r3UY>_^cn(P*tL0d-#npWzjZzH>j!@eXr7i#5tG>z<}m%j2t*Yx3o|raGr}hx~=LTtVFoc z(Mu_X3qYhz%s<61G;6Ik`M8@9Fc~&&eXl;{Cm1tKx%x~g2&FE=ylw~_Y9+u$~={#`(JKg?k`SYYVKr`|CAsOdx+C4T=3M^SCeyH50s zeRH`_i!zo`SagsZ@q(W$Rm)eo?wCsvxK8L)3zt@E5x{e$u1ID|wThbkJve(WOs5n@ zys~-d19^m^IAcaRk5h^}_&}vz0BBxHf?8o)45;^E%_XI&fG53sz9fWxVIdr)c`NUb z>`A2_DP3-XX!B0>lQnS0*jQfK&nv_}?JeDW-CN&w^wK@RzfzLpMgx1GasRJ@imYPc zq$XKNzwDoA_)AO(06H>Vv$HJD0Un|6DSncD>Oh7_F|k`f#ZxZtB))QRA=b){PF^Hm zHR0TV!cL9*REg1#F{y6pH)iE>@;?B^PTrX{Q2&K;iq`MTPBD+AI!s3Ov^hk4FR8B< zj6ruZ)@?WwL$V?yQ4Z)+BQyV&L^ zFT^w7#roch<=n&@&S=WwI1g+gm-L+bMlOUcWsFHAp|XICgT zN1rCDekTJY&y;A2;&leXCLLN;b^i19Z<~Fw;XsFb0VzSzlXMazoS;9CW9Eb;_a_oO zX40Z|gBy2b{i6KYLhqI6b3ww$g@e%TE}MoCQ#+W$s57rTZdiqOAFsgOw|_rhi{9FQ z9813xv#lQ2PIfGsq#CKR@@(aU463`60=SzeFH&GztV~dgqe!cR#puDdLDG4G!ou#l zT9S$^yl!DYinVBRw8EYL#Fb+FYk5~y2@gu)Hr$HEzzpma@jj+0i3mn9jRq3;L^Om zMRyn530O^*S`y=KwWzDI1p3Eoe|%u*NK998B?Op)w0B%G>Z?L4qN28d9rG!k*?76^ zldw%JR9r!9J{X2(9JEjW63aqHasJ8TYfqw_L4_YzaozlhJQwI@R6Ivd{1zN3Hb)fj z0Q(RL#DkRbm|hl8c{z+X6wV2N3_J8a(c`}k6xwRcb}BX~MvkuwKn9BQfj=s--S*b& z4ETzaRYNH{R6J=6K)Ag3p_nYhePu@-oPt_2xtOT(kq zg||^=<6ok9Ady|b1lIQg}Mv*73k zm)5)+lM!w;h@Ih~Lax@itlDY@lqx!o>>v`>SAqY%kp*`rVpYSBK90$J%q_w()0gFz zBUB1$GhU4BYSr@L(?xAiRmtGVw@pkgOz_6(NbaO8CcJ@4`+XPB-nRZSm#d(ZXGoZ+ zn9yfuo@5|sM%SLg%*;@)aSlJe&dq^4Y|9DP10T`4)*fIc17P+C9CB#dO~|8TD+SjC z2mVooG(@syh58pb<00ily)8 zCyWgOf(q>$fKO&oQQ-5sPcb3$hnOp;w0biJbOLRjT-2&>ynVB=&wAPm4XfZ7t0((y zp|_`)OLquM40Nnl2F`^N?0SfBX$;arFA0GNXTY4N)DmHWZA^NWdBoXKkZ2c=ePq)|TNoo-)9q+1T#h=SEyb_sNJa}X^Y#XVb0;9*Wm$Yu(H6&d=g^3i{x7SG2XymMSMfz0kXiz6xZS zlp=?HJRf(darbS~=->j2q#1(tu~|O8BB-h1B!32xPjgkclMbON#Gaoa!6#_^B9LPK zRX#jH7(DRTEUi<~lp1gVm9iUZCt_TjBx-HXNv*u|=b=+=t;%)WZrOSsd>l>#ya!Ak z?mb#^<*7l$?rF6(RTi@{4od^V#1}`Qhc;=4z(=1wzk7=FDoRe1Eu|K-Z>#CcNB&K}@+|~fJFAh0*J#|-W>tk_bUqQYT4Fg7{fej^rzbq}v6^q~1RznpttA~_0N)}S zJ(DsCkbr1qLXv7IHENt?#k}3Fnl*h(%a9l;k4j0LF-q}TfOLl$(RxGkj_jGXr;8|L zZyi29pSSCO_uKXC&5y!o@5NdjH zfK#oo$U8Q73QQFE^0xU&6yBQat33(P6dX>^_Kp!4V34X$d|&b1LCmRI`Z=&i1w=xO zc&tC{-5hy3fDF&<&VsENH!7a#AfB?Q{bo2&JB6HF^nPZQ;AM@7N#9ia z`foY|*h=V`ZM_p!5x)pi(P*6c@7{xph&e?{A`pnfFnLPgxcHiOOc|Yiq1M8#rL6?W zNnynwT=-M}YS@$Ss&cOa!lxmOw<}{l72V+V>u8?AcjUGZ(gooUS;9V9BCwjh2F?{fIpps2|1fvH|lgFLn1`>L*d z-n6FIOGdYLq{8=LtI&fy%LS{sk!bg5r{S}%f zLd|tatDWByR;#cL%RKBlDbs8+-re$QUp^qF(*U(*`Ru}a^Sfaqywkc)!Ji7!Q{0~$Ig zXc+&z*ZN~UYdvk{=I8gfti4eLMyse3crPsbZsnG;?yP;z>^{(>Mt# zb4w1vIEs#P@#a90T_!!qp1l{prUcQPW;1I^BbV&p*g!7{HYiJSl8R2|xAHuCk*sJt zb$qWfHxg@$!8&O(!>P1HJ9cUnD+2u&K%SkTDdQQsUDuo&lO=QMkY!*OJEo(|VZ@GK zwAc$fsRhv1lNKolLMh*sS)2mL&zb-z~|k^Wnq2_2o9v6m{>>c9YnPjDC8;vs7B z`GnT6^E#qXnclar90^+vKI`l=)3eKcr68b5S9>LhWLGplWn3`Fc#%m=^=6xQ^H}zsdx&h z#L;rn4f_7kkvjWHvp(PO2%Av~1u^sQ^&<^K2DUChQ|%DFP5GNicEim5*wvL1Eedm8 z?@|^4?L_MetnfG@^#n9dqV+!AW`BwKxeA9yuJ2=h)2lHEIDgNKWEdm-xi>Uz(-=(B zwlE*%`*=BhvYS=b6*4K;UlM`$+77KRy#!ddno@u6AeXbD2iQL`8C0>U%y`g zWSH87DQu-_TJ3Hvo!8SeGOlpQjqMan^I^pDD11NCAWB2u|ndKU69Hl@K_P zWq>#cziVIvy|gjCv6Ljw{CA@q#imFVu+_8xU&5OYa0#|n9?B|DXqFf@Ba_)#CC}Ia zZXBS43Ysz-;DCn@JHV7hENR6P)!;+NF?aZ2ALtrIU2@|l2iDpT;Jl1@V%rPwS@u{O zlJJ|JWKFtF{QJokQ)EIU0u8~39SVn%gj{)(U=&C)llc^H&8NW(za||%zHR1s*ZQ%UkS5;2?JR9l=0tZx9g(H;+g zSs=!Jmvax&!A8?G!oX++eg>@knRj%@0R(hvFqYrki zvv~m4RFYE)G*(1{m}nxLt8#xvo@3*h3maT?NB6Og;Ad8tI1j1j!fjemYlx z0tUKYMS213Edziu%Z=IOB&ysz;@2+5WNe@GD4H+0(rvEKeO61(v)c>MG=GR_H9mP? zRP?Ej7hv_$xKRa!A4P6RpS@R$Nye?Z+ffdvAR`ClhJ_YndvLfr2k1XOH~olLi>06< z-Q)BPc>--Q0w6+0Z&Y~^{jTT0ld)8_o`mQNBKn#6p3&?@b2*jQ;W9qVFm^(5owt!* zm**O>s7C^x#m`(+XtpJ0q&r_{vs#~qAR^*!^hjM8UoUSuV5(fTJXXogVvQM6sz-_^ zs_<5a1w@Gc7t3ttnqY#j$o4bZ_Zkl`=5F@av~Y>|9~+rMW82=gM?*IIxE zhgbKMRhlZ`HW1SJ-r#)9pw2gS%EjJV()p0#chpg@?PeCn7E{*?`ObVCg`(XEI&00P z38T*5M$iqtIz!c3?-hU~pPbLJrBnw*^58r>y(*nOLCFxl)3$((+}(EIawm>1_i8@3 zUX>6N>!kk7i`WflV}3=v`m-7m%89k7D1KahC+3&epKiK_#%1Us2B%DnUkXCBb#dKk zKO0`)7#ahdKakpnS1(?dsnSZk9lpB1&9SL@*2AdpF5MYrO1NP|!fmWJ7#^-*Hw_rrj4g{Ad6a@mKbqi$&7q-I<^oBrOU>IeRa=P%jX@@G9Gnv&Y_L676jHlf zz#&`lI((jyTd)R(iykMpO&l+`DJ*gwdNtjQ4&h*K>Rf&^%!6A6A0-!zf(B7YHhV!l zprZ5I>73U!Ox)b6+&trcC{=*TBm{_#7(QIB>z{*tcK1ZpZ5jbcAKn$BL)I_32C&JZ z)XuytLkus~v?z?v-F9_raud}9+OD@QPh203i2*aGbzW-@WGOlSf>ZNsTT!uf<)1+E zrQJK{8{~MB-HwsqoRi5_0tnfk9}Lz^VVl~mUY;A}++IvkWg8Qo%O=vT)k3&EYedu^p~3idyu zj;q;cBkurngf9h-z|Yw+_W}gvyCAL{>Gd&=+FgZu?hGC#*Lk^S=YY+}xYO^B-x`Mj zQ*Fes4M6LF69eYgUXa!c8g?j*1D}3y0zfVR(*F^$K0u`bhFvtu4vj6Qxb6!ssNCSW z%_Dgxn6gNZH+ZuNSSXw(pDB+3eJ?>J9(0fw;9b{U09HXeU=0EC@~_MIiO$}*Di1UW z`Qwpr_HD8HRim+{J@jDquB=DHe(RvRfP+F(NFY$3%y|v}h_gRK2I0SKI7u(Q9+mLX z*s$We9~$vg9m5&GPO8fU7(?hD*LeBAJ^AlcLBnfhh5k0z%{wnRGw$l$x{FK*ji!3+ zd9#whWU1Y9_#*w92m@QCWtwkGV-(v2I!!CPd(^1a8}I=P^q)IV0HGY-HZ<$zZIcdf zmO0+rZ!i8E7i9e6>NX&nv;;^Lvy|qs%V>~kdW*pTP=WN@Vcn^|{N;O}&>(Ny_5Al_ zY+ni49-_y^a7i!jeAnRuen3#_hdm(Y7+5SI0nWq|cqj2c*Yg)0YHc>7#BhEO6#Fu9 zmDqKeMUW1#(%jC3SD>uX+`B?Aga6F>A%*C3Ap*z%wCz)T?qq-MbIv5cIhxkYEe3D<~MjsRj+Do+5PKu{Qu0&klDK@L8@DQF%BR3N8*f})N4XoqWW z2VyL2o5M)%K_(UeM%i`gFCccFF8-)@5S#%FSqDIV+tSu{_%Bh76F3@3)gV1{nP& z(fW26T*IEjDU`j|dp$-tj!iR{UU47dz{!F=H5h7{|l6OeQ>85&ecNeRAeE9_?a( zXg2y8I>lzlo}CUbLJ~FJQ2o%Q?=*>5uAJ6j`ELUcoDmB^p219Yke3XQYlnq}1*VLQ z{oiDh7Kgfi;sf9$!_oY@2PA;+A^(5^JS!WN`2KG*J;~=wgX`)%?37dhZp%HZ28Di5 z$}E^W!`{*D4}!CG6zVf^<}V4pFSJp9&Foewa6+M}*gCVx3-7a(lai7b<0bn8db2@t!&BY_J_W^salpv|^ zX2r)2HUFoZGmnPy{rfoCB1?qEPEyv4CCk{#k}V?HCCeDm$dWBf_K`hOreuqdeMy!` z_B}<`C^CHQWJ?myXX<%==lq`MJpVj@K6BxA)`ID3%)Tyr8mIGs#W1+1Gl1jnbYP1{@@6O(?LZrkGj3BNnu; zjRoN>>y9TX)kggHczBou$-jx_>UU&hnymd~!4=S*PQw`YpyJPboE9ArW;l;$yF}*U zT2Ie*saCugES9CoU&AJZiZ}*S*GDiLMXeJXT&1*Oq<3X+hzCq8P@dqHhzXi`x@uK| zkz<{pN-4bCn^0w5TxMP@F_bpEGD_VcyLzQl2LlBJ#Qckq8$-XlCGbBV?ddR~6Y_&GP-T7W<%lb+i^H;wO(-;1SB5f$ z)Zu~a3$Gl6u;Zn~5BJ(_VNG)zGDE`gKYdt$(2c5xC%DC(0Yb%=13kzoo|gr#K=ntr z^)lz9-sferA?r$1tleD+1z${Jp00c(D}qZ64iB2hne_VxkU*VsR*r(?sis)aQ57Fh zCaLf0-FkgHWRm-{HEGJyY2};B)Q&R}LnEd4esGk5zrE6{r{*6csDvvUyRFq(kG_~on6|N0h7mGbovaS%^XlsL!IyX!|?B2ufpBTYgwW+ZmC z&gil%e!ZO_Um>ni{5NOyoV^?DH=t#+##f9gC;}28Y;mQkpr3e~gZQMlDi4L~RJYR2 z3-?_AR=Ml;R@H+40A%iL9AUB8vJ5lST{D+wa%Te0xW>BL%(~Gm!>D*})N8*XJi`9D zX9^h9Z8?q+$djHeJbdsZh5y$EDak`uuKBD~mFrlBn>3|UUkg)hu)Px6)a~!y6-Y#} zK=Q%7is?OnW1Pa2F*wt4zki)F!INfAPfgb>`Gc*dK<2mLH+M*kcpdI2LMi@TtJL8? za&zp#UE@@lj-fREkIkhS;}ZqdztzX<@6YQxF~;jw(h%Vt4$Bi9F}9rpn%mLDJMh{> z7~72ux@_$Om*1WSRvuCqr2uh{yiV$Dezpop+qZ`AIdU}Q+nO2XwS9&@e=-#;lqpi% zCcixm#pcrWFSsAfOfFZu56<0BfV>Q(V0eUiEK#fSCduNl?5YkUyO0EtUQSr1oW^29 zKL^4Lc3)7hS%L&u9A^UVa3jku_6KZk56I5bd0p@7!*BQb*G3m*g~*=TTsOUuQ5>^p zH`PPuE4dhZOfpt+T@48}N#ozMpxz#9rSiSb@=tC^1K00%NHAN5D+Th5rlK`uEWjSo zy2Y8zW~OmZf4eGivZ)zL-#yIHyDDz$4?f*xG-Qu}80drvq5J177TIN49CM~V8vDE5 z>UDrFue~>G?iVi(;z(@dT}f0*vqe+blb9v-47)rxE-acF#}0>+&y?Lv?X+`g$$d>) z>M@pGkmX(vli#&cdB&CHGtRZ$UMP+P?X(k&FAU`p6(Ymx?xo zqkVeotn(^`o)cQ&gq(jfFe!I{J)xk)jpvb>KkbDo(KcfB_OttfeK5+356_lXV~2AB z&{u{uR~8I%k4Rwx0%cZxw;HwA8d787?3zr4=cYwiHa%-;GL(jn3^L2R(vVK&X;j0H z9C%NZW58Qz$tbm!it|#MQW>hf^mGiolxsyUL)6c-^ut4rwzYW zDe>2O`~y6J%giU{hc8P3uV)GhFok9!-;i%vo1hz+86oyETT6?1`J&S8=WfUDH~aG6 zSr7Gyqu@8~ayZWB45X(7tG zFw3PbZ8aWYZ!>lBH53s`{r2!XSd`}_qwTWS#u?CdGPH~4Jo}A_D2cIIB~>> zgsigY2Pwq=fZ`^3^CObT<4I>v;w65Xh}4w|-&Fd^h7!N7SDT6LeIME;L-!D4?$xNO zn8Y3WJz((kV?s)DVaD;FcPD}hql@D3-jLZ7hjW4f}{>~>w6vFp*!v>cGD;wWUN{kxrBZfdm$ zb3RrH?5<)NUM-}7L2CA2l|+eGb*GQxH{YjPD`F42gdN*Yzg!t_E}*$>Cm(^1mfdLN zd#sukF~b;g4J`zwATCxN2hV7t4X=Re1vqWkf22ZQdxS}<8VpEPeC||j#|5%Mc_J}* zYRp^JU}?6q&5Edqov-~A5248~2euT5KnVKfQ*~oxkw$g( z0!KCs+Lw!(m?*a;DIpUHj;SLDAxqr5{^*-Bv#C^vvOZHmUcQoPk0A%s`R1n|8c#Sp zTKOJ7kl6DG9~S_w9I!xH`>gETA9%9=wFs4zVcU8o=61)!m9rn&XtmN}nv$dHE%UPe zxyrFOUWaa!ZqBjnB}f`7V^n zZH6-9wj%B4Evw(zJ=w)s`FEvN++aPmfQZ+`V~|5r6HAO+poU`s=r+nY0y zuNjq>66XW!F-8)x6g$qxbi1EobY;9+C&n?JU$!j@)jqc3&5#ijewFe~1NnK&483`0 zcgQ)9V)p{c)RQkG;*EP{Sr+WVtcmvsdd?yH^QK1kBXa{RaRjRLagYJrxmIFsn;!Br zSGywbB7c5F!zN1M`6%WM=}pc9pd$?{zKc}bEvt>)RIh`HMxyu=sEVg7U$d}Q#D;2h zAmX#lpfzx<{-VQ3-r-ZoHv2}hf4~^kPgdlq9dVeO<^6%{s>>Ir_do3@EIYOE=~+@I znTk~(Pj~t-()*G8y$}0YbJL@+@pU>^ZdSSYS%Sg}=1O613nrp!7e)F+E01teY;n|Q zqeyVb@Rl&_25V)lfkWZJ;KwT=NlQt9Rj5*5=1WAMtll?DMJ^*t`P*{7TA+#>DwOw+ z`Ci_1XW$G_$gMq{1RNLVqa{#r-dCD(zddr=mlkHrrs5}icQKqe(4)oDtL=P%wIM%Mj8PXgqc;BAO_Z==CRS7F+4acKd-RuIKCQoaMsj_Il4|4 zNw29mciheD&JeEipbf|j@Ze}}mPZK!GRhuEdv>>`#qcGSdYY6*XEt0jnv4m|$x1_^ za91rn5BhEZA^85Qd2gTq0uHV{lXaI~x?U;XF}e@Tfwtle{-YUS#xqp0z7*_(;=dK- zB2)N)?(RpE1W*%onpv<)G8IiO=+q=IFZL0vJ|;bjwebxoZ_cq|LXeEDA%bHAD7u773!k6e1( z{Z{~(;a8#}tP6WUK+l%+@WY33yM|&`GTQbo!SQY^z?9sT?LEQ0bDlGyY79%X?^skj z89RUY;D*>1?tc^Tq{eL-Hsm^wzAsvT>4E~jG+Vj&uyis>q}$djsB`?ouDT|831U&g zS7kMysy18bTi4}9#qEyw;VI|xDOPnJO(_89>Hg3a%@Q|Lmpw!EpDpSTU2+^cR4#IA z{E!2=ndFnmLifG5C9^!*q*VXQq|@uB;lF}#IH(;ZL2=-zrxC?;&UtzT!@v#SofId+vZYBM}|VU`6Uo}IGC@D=rX_nd|57*Xc5*+Hl8sv zMT3(O3abNJXMj+3O;NgB9!&Fvhj)veyEGxdxT@by_UY?!l6PRm?D&pV&!GT9kq$1H zmNwaiNXeb+7&`h0%<Sdd^@JD) z7+~&0yddC`OF`qY5p9+ zqQP09Kqf!32~L;j2?z5}Y^~0cx4!{gc<{PqtvYP8kNpvDiKDi3&7TMEn4-HFF?e`G zakv(H<%B_bH}>nV9=WIXMZ;hW61?IyUk%xF)2ik$uw@wtp7v+zDgiFbkMS$hSBZE+ ziDRDInLjE{{vo&}B}s02JW#4a3LSArgt6F7B@50)RC7`diEpg4OEW>VH z%FnmtSM@(TIp>s~FfPfqzTQf9k zaA7$NEhix!qUJiZYV>C?QK^*q_T4Of#M;jX-H*9t*Q0KA_KV*9CZoU!+zh!B^UB|4d21-4 z*lzTr@b>Qt&(H;zJ(yApQuog^|7Y;Oin14LmN+gz7%w7LEwA?LO3yB8=w)PR^_!U_ z@&f0v{;KC$R)>>4={i<8?`oT_wp}#Ltd4$+Fpq>lw3c)ZQZ?r=Nc|HWBc)+bnN0mT zmMF|ZWTvZyqCgMvx->qp$1!f-eom}jR@2kDD*vJF$^1L}LN6*O^x@QgiKm(=L$kXcA| z@cJA%%Aaw0DMg9vWl}9xwGXEHKhPGZ2WWUiIB)uL5UV%N%NF7!|5fJ9Hb}}7HHXE5 z{m8Xt7WEPZ38doyJ^|aiZ`nR6II)>f9Yo(VxJS!6{?u#?&95)141}>T<5+{;TJwZxV0yRa2Hj*p z%6y!4R3=ofSW}SL2)#PWu%w5ORJW1rhNSrY*|)ko5bLHtc4MeVyImuqmRo zr;M#VW7FA@%fY=2NKs}UoIN!W@wfN}Kj6T6nx{t)NTlC@!TAxY`S+WBB#KQFg}&2B z#*UgHPi*QvL|=&je(3^|Q+F89au9)WE;_+xNQV?Y^UVjP;3GMbbBWwE(dkr;1>{SU z5wsnsW@9uvLkTNTQ3dE*%IN_XYS;8|6%NFdFm2Xhy?wnE64HaZuzNiLaZf3#MnH@1mZw?##Bje3(-F-gJr4`+6OhDeFk(ifY+f>L+-WQ%*W zjh6mxXfE2777fj5+n`$}3C=t`u({+W{8>7FpgcQPBZ7Eb|b2#K}e5{b$b0K30u+Dj{1)vZ<$0BQV%|fp{!CM7+=$$dnU* zv+oV6_dCA^a>@BQal|Z+Y+ zsr;=BK$RNic@6mIF%XuIkWoDhKm2jE%*U!!i;udd+(5R_tZ^I z4#ep-V3G@XYM6PVZ9N@O_8t!KheQ%7DIf#;J=RG>Ez;Y$J5ru?Z3B?LLsI99wbOFFaz4q6WbWMVmy6pJse0b YIXSx6rk6jqhfhefHT2a>RBb~40}1$rF#rGn literal 0 HcmV?d00001 diff --git a/generation_config.json b/generation_config.json new file mode 100644 index 0000000..c878f5d --- /dev/null +++ b/generation_config.json @@ -0,0 +1,12 @@ +{ + "do_sample": false, + "temperature": 0.0, + "eos_token_id": [ + 151643, + 151645, + 151683 + ], + "max_new_tokens": 2048, + "pad_token_id": 151643, + "transformers_version": "5.5.4" +} diff --git a/model.safetensors b/model.safetensors new file mode 100644 index 0000000..08f1374 --- /dev/null +++ b/model.safetensors @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:913448d005d2af695a738da177120c9e741dc8a5b2328f717d7ed108c1fd2e4f +size 3441185608 diff --git a/tokenizer.json b/tokenizer.json new file mode 100644 index 0000000..fb77ddc --- /dev/null +++ b/tokenizer.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:672e331460a05e2ea9888810a7a37f0c775429fe05fddc6330ee0dc9147a1370 +size 11425566 diff --git a/tokenizer_config.json b/tokenizer_config.json new file mode 100644 index 0000000..0b78837 --- /dev/null +++ b/tokenizer_config.json @@ -0,0 +1,44 @@ +{ + "add_prefix_space": false, + "backend": "tokenizers", + "bos_token": null, + "clean_up_tokenization_spaces": false, + "eos_token": "<|endoftext|>", + "errors": "replace", + "is_local": false, + "model_max_length": 131072, + "pad_token": "<|endoftext|>", + "split_special_tokens": false, + "tokenizer_class": "Qwen2Tokenizer", + "unk_token": null, + "additional_special_tokens": [ + "<|im_start|>", + "<|im_end|>", + "<|object_ref_start|>", + "<|object_ref_end|>", + "<|box_start|>", + "<|box_end|>", + "<|quad_start|>", + "<|quad_end|>", + "<|vision_start|>", + "<|vision_end|>", + "<|vision_pad|>", + "<|image_pad|>", + "<|video_pad|>", + "<|query_start|>", + "<|query_end|>", + "<|source_start|>", + "<|source_end|>", + "<|source_id|>", + "<|query_analysis_start|>", + "<|query_analysis_end|>", + "<|source_analysis_start|>", + "<|source_analysis_end|>", + "<|reasoning_start|>", + "<|reasoning_end|>", + "<|status_start|>", + "<|status_end|>", + "<|answer_start|>", + "<|answer_end|>" + ] +}