{"data":{"id":"10.5061/dryad.dr7sqvbdq","type":"dois","attributes":{"doi":"10.5061/dryad.dr7sqvbdq","prefix":"10.5061","suffix":"dryad.dr7sqvbdq","identifiers":[],"alternateIdentifiers":[],"creators":[{"name":"Ju, Y. Sungtaek","nameType":"Personal","affiliation":["University of California, Los Angeles"],"nameIdentifiers":[{"schemeUri":"https://orcid.org","nameIdentifier":"https://orcid.org/0000-0003-1238-8674","nameIdentifierScheme":"ORCID"}]}],"titles":[{"title":"Code from: Full-scattering-matrix phonon BTE solver"}],"publisher":"Dryad","container":{},"publicationYear":2026,"subjects":[{"subject":"FOS: Physical sciences","schemeUri":"https://web-archive.oecd.org/2012-06-15/138575-38235147.pdf","subjectScheme":"fos"},{"subject":"FOS: Engineering and technology","schemeUri":"https://web-archive.oecd.org/2012-06-15/138575-38235147.pdf","subjectScheme":"fos"},{"subject":"FOS: Nano-technology","schemeUri":"https://web-archive.oecd.org/2012-06-15/138575-38235147.pdf","subjectScheme":"fos"},{"subject":"Phonons","schemeUri":"https://github.com/PLOS/plos-thesaurus","subjectScheme":"PLOS Subject Area Thesaurus"},{"subject":"Thermal conductivity","schemeUri":"https://github.com/PLOS/plos-thesaurus","subjectScheme":"PLOS Subject Area Thesaurus"},{"subject":"Nanoelectronics","schemeUri":"https://github.com/PLOS/plos-thesaurus","subjectScheme":"PLOS Subject Area Thesaurus"}],"contributors":[],"dates":[{"date":"2026-06-23T21:49:08Z","dateType":"Created"},{"date":"2026-07-16T14:25:39Z","dateType":"Submitted"},{"date":"2026-07-22T00:00:00Z","dateType":"Issued"},{"date":"2026-07-22T00:00:00Z","dateType":"Available"}],"language":"en","types":{"ris":"DATA","bibtex":"misc","citeproc":"dataset","schemaOrg":"Dataset","resourceType":"dataset","resourceTypeGeneral":"Dataset"},"relatedIdentifiers":[{"relationType":"IsCitedBy","relatedIdentifier":"10.1038/s41598-026-62876-7","relatedIdentifierType":"DOI"}],"relatedItems":[],"sizes":["178402 bytes"],"formats":[],"version":"5","rightsList":[{"rights":"Creative Commons Zero v1.0 Universal","rightsUri":"https://creativecommons.org/publicdomain/zero/1.0/legalcode","schemeUri":"https://spdx.org/licenses/","rightsIdentifier":"cc0-1.0","rightsIdentifierScheme":"SPDX"}],"descriptions":[{"description":"A deterministic solver for the phonon Boltzmann transport equation (BTE)\n that retains the full phonon–phonon scattering\n matrix W — rather than the diagonal relaxation-time\n approximation (RTA) — for thermal transport in geometries ranging from\n one-dimensional slabs to a three-dimensional device.","descriptionType":"Abstract"},{"description":"# TT-BTE: Deterministic full-scattering-matrix phonon Boltzmann transport\n solver A deterministic solver for the phonon Boltzmann transport equation\n (BTE) that retains the **full phonon–phonon scattering matrix** *W* —\n rather than the diagonal relaxation-time approximation (RTA) — for thermal\n transport in geometries ranging from one-dimensional slabs to a\n three-dimensional FinFET-like device. This repository contains the solver\n code accompanying the manuscript *\"Deterministic full-matrix phonon\n BTE solver for 3D device geometries\"* (Y. S. Ju). It reproduces the\n full-scattering-matrix construction, the hybrid mode-space solver, and the\n device geometries reported there. The interatomic model used throughout is\n the Stillinger–Weber (SW) potential for silicon. Material-specific\n transport magnitudes (e.g., the bulk conductivity and the device\n temperature-rise correction) are properties of this SW model and should\n not be read as quantitative predictions for crystalline silicon; the\n structural results of the paper are independent of this choice. --- ##\n What the solver does The phonon BTE under study is ``` v_λ · ∇ f_λ(r) =\n Σ_μ W_λμ f_μ(r) + Q_λ(r), ``` where `f_λ` is the deviational phonon\n distribution for mode `λ`, `v_λ` the group velocity, `W` the full\n scattering operator, and `Q` a heat source. The defining feature of this\n solver is that it keeps the complete off-diagonal `W`while remaining\n tractable in 3D, by a **hybrid mode-space** decomposition: * **Streaming**\n (`v · ∇`) is handled by dense, upwind spatial sweeps, which are trivially\n mode-local and need no compression. * **Scattering** (`W`) is applied as a\n compressed operator — either a truncated SVD of the in-scattering block\n (with the out-scattering diagonal carried exactly) or a tensor-train (TT)\n representation — with grid-independent rank. The scattering matrix is\n constructed to satisfy three physical constraints that are load-bearing\n for a stable device solve: 1. **Energy conservation**, `W c = 0`, where\n `c` are the modal heat capacities. 2. **Detailed balance**, `c_i W_ij =\n c_j W_ji`. 3. **Negative semi-definiteness** on the non-equilibrium\n subspace. Conservation is not optional: a non-conserving operator makes\n the device solver diverge. The construction enforces all three\n analytically and then projects out the residual, reaching machine\n precision on each (see \"Verifying the install \" below). --- ##\n Repository layout ``` __init__.py Sets the version and its description\n core/ Tensor-train algebra (physics-agnostic) tensor_train.py TensorTrain\n class, index bookkeeping tt_operators.py TTOperator (MPO),\n add/scale/compress tt_solvers.py AMEn linear solver physics/ Phonon model\n and scattering operator sw_potential.py Stillinger–Weber energy and forces\n si_physical_analysis_v2.py Force constants, phonons, and the full-W\n scattering-matrix construction (the core physical contribution)\n sw_phonon_bridge.py SWPhononComputation: end-to-end SW → (v, τ, C, W)\n phonon_data.py PhononBandData container and reference models mode_space.py\n ModeSpaceData: the mode-resolved model consumed by every solver; factory\n mode_space_from_sw() svd_scattering.py SVDScatteringOperator: low-rank W\n with exact γ tt_scattering.py TTScatteringOperator: tensor-train W\n solvers/ BTE solvers (hybrid mode-space) bte_slab_1d_hybrid.py 1D slab\n (validation against analytic reference) bte_slab_2d_hybrid.py 2D slab\n bte_monolithic_2d.py 2D monolithic domain dense_sweep_3d_hybrid.py 3D box\n dense-sweep reference bte_3d_finfet.py 3D FinFET-like device (fin + base,\n Schwarz coupling) — the headline device geometry dsa_operator.py\n Diffusion-synthetic acceleration (base) dsa_operator_1d.py DSA, 1D\n dsa_operator_2d.py DSA, 2D dsa_operator_3d.py DSA, 3D (Fourier-cosine) ```\n Diffusion-synthetic acceleration (DSA) is\n an **optional **convergence accelerator and is **off by\n default**; it is not part of the production methodology and is provided\n only for cross-checking. All the code files are\n in Dryad_tt_bte_solver.zip. --- ## Requirements * Python ≥ 3.10 * NumPy *\n SciPy That is the complete runtime requirement. The solver runs entirely\n on CPU/NumPy. JAX is an *optional* dependency, used only by a single\n GPU-resident DSA correction method (`DSAOperator3D.apply_correction_jax`).\n It is not needed to run any solver or to reproduce any result in the\n paper; the relevant import is lazy, so the package loads and runs without\n JAX installed. Install the requirements with: ``` pip install numpy scipy\n ``` --- ## Installing and importing This is a flat package: put the\n directory that *contains* `core/`,  `physics/`, and `solvers/` on your\n Python path and import the subpackages directly. The simplest approach is\n to run Python from inside this directory, or to add it to `PYTHONPATH`:\n ``` export PYTHONPATH=/path/to/this/directory:$PYTHONPATH ``` Then, in\n Python: ```python from physics import SWPhononComputation,\n SVDScatteringOperator, ModeSpaceData from physics.mode_space import\n mode_space_from_sw from solvers import BTESlab1D, DenseSweep3DHybrid from\n solvers.bte_3d_finfet import DenseSweep3DFinFET ``` --- ## Verifying the\n install The following builds the SW phonon model on a small grid,\n constructs the full scattering matrix, and confirms the conservation,\n detailed-balance, and semi-definiteness gates. It takes a couple of\n minutes (most of the time is the force-constant computation) and requires\n only NumPy and SciPy. ```python from physics import SWPhononComputation\n comp = SWPhononComputation(q_grid_size=3) # small 3x3x3 q-grid\n comp.compute(build_W=True, verbose=True) # builds v, tau, C, and W # After\n construction the solver prints the matrix gates, e.g.: # Energy\n conservation ||W c|| / ||c|| ~ 1e-16 (Wc = 0) # Detailed balance max|c_i\n W_ij - ...| ~ 1e-16 # Eigenvalues all \u0026lt;= 0 (semi-definite)\n print(\"modes:\", comp.W.shape[0]) ``` A clean run prints\n corrected conservation and detailed-balance residuals at the level of\n machine precision (`~1e-15` or smaller) and no positive eigenvalues. ---\n ## Typical workflow ### 1. Build the phonon model ```python from physics\n import SWPhononComputation from physics.mode_space import\n mode_space_from_sw comp = SWPhononComputation(q_grid_size=7) # production\n grids use larger N comp.compute(build_W=True) mode_data =\n mode_space_from_sw(comp) # ModeSpaceData for the solvers\n print(mode_data.summary()) ``` `ModeSpaceData` exposes the mode-resolved\n velocities, heat capacities, the full `W`, the RTA operator `W_rta`, the\n thermally active mask, and helpers such as `bulk_thermal_conductivity()`\n and `project_to_1d()`. ### 2. Compress the scattering operator (optional\n but recommended) ```python from physics import SVDScatteringOperator\n svd_op = SVDScatteringOperator.from_mode_data(mode_data, rank=50)\n svd_op.print_rank_summary() ``` The out-scattering diagonal `γ` is\n retained exactly; only the in-scattering block is approximated, so the\n transport-critical relaxation rates are preserved. ### 3. Solve a geometry\n 1D slab (used for validation against the analytic Fuchs–Sondheimer\n reference): ```python from solvers import BTESlab1D slab =\n BTESlab1D(N_x=100, L=200e-9, mode_data=mode_data.project_to_1d()) result =\n slab.solve(tol=1e-8, verbose=True) ``` 3D FinFET-like device (the headline\n geometry): ```python from solvers.bte_3d_finfet import DenseSweep3DFinFET\n # Construct with the fin/base spatial resolution and geometry, supply the\n # mode_data and (optionally) the SVD-compressed operator, then solve. #\n See the DenseSweep3DFinFET docstring for the full constructor signature #\n and boundary-condition options (isothermal sink, diffuse side walls, #\n y-uniform line heat source). ``` Each solver returns a result object\n carrying the converged temperature field,  the heat flux, and solver\n diagnostics. --- ## Reproducing the paper's headline quantities The\n device result is the full-`W` correction to the peak temperature rise,\n defined as a same-grid difference between the full-`W` and RTA solutions\n on the FinFET-like geometry with a y-uniform line heat source on the top\n of the fin. For Brillouin-zone grids,s `N ≥ 11` the correction is ```\n δT_fW / (T_RTA − T_0) = 11.7 ± 0.3 %, ``` a bounded, grid-robust\n correction. The RTA baseline used for this comparison carries the same\n isotope channel as the full operator, so the two solutions differ only in\n the off-diagonal scattering. To reproduce a single point: build the model\n at the desired grid. `N` (`q_grid_size=N`), construct both the full and\n RTA operators from the same `ModeSpaceData` solve the FinFET geometry with\n each, and take the difference of the peak temperatures. The bulk\n conductivity of the SW model on this grid is `k_bulk = 148.0 W m⁻¹ K⁻¹`\n (isotropic to better than 0.003%), which is a useful cross-check that the\n phonon model is built correctly. --- ## Numerical notes and known\n properties * **Γ-centred Monkhorst–Pack sampling.** On Γ-centred grids,\n the absolute device temperatures converge non-monotonically at small odd\n `N` (the grid does not close under `q → −q`); monotone behaviour sets in\n by `N ≈ 11–15`. The same-grid *correction* is far less sensitive and is\n reported as a bounded band. * **SW group-velocity anisotropy.** On a\n Γ-centred gri,d the SW group velocities carry a fixed `[111]` ellipticity,\n giving a non-negligible off-diagonal Cartesian conductivity (`κ_xy/κ_xx ≈\n 0.56`). The scalar bulk conductivity is unaffected (the tensor is\n traceless-clean). The y-uniform line source usedfor thee device results\n makes`∂T/∂y ≈ 0`, so this term is geometrically inactive. *\n **Scattering-matrix scaling.** The number of three-phonon channels, and\n hence the nonzeros of`W`, scales as the square of the active mode count,\n so the operator is genuinely dense. Compression of the *solution* (not the\n operator) is what makes the solver efficient. If you use this solver, we\n encourage you to cite the accompanying paper \"*Deterministic\n full-matrix phonon BTE solver for 3D device geometries*,\" by Y. S. Ju\n in *Scientific Reports* (2026).","descriptionType":"TechnicalInfo"}],"geoLocations":[],"fundingReferences":[],"xml":"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHJlc291cmNlIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zPSJodHRwOi8vZGF0YWNpdGUub3JnL3NjaGVtYS9rZXJuZWwtNCIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vZGF0YWNpdGUub3JnL3NjaGVtYS9rZXJuZWwtNCBodHRwOi8vc2NoZW1hLmRhdGFjaXRlLm9yZy9tZXRhL2tlcm5lbC00L21ldGFkYXRhLnhzZCI+CiAgPGlkZW50aWZpZXIgaWRlbnRpZmllclR5cGU9IkRPSSI+MTAuNTA2MS9EUllBRC5EUjdTUVZCRFE8L2lkZW50aWZpZXI+CiAgPGNyZWF0b3JzPgogICAgPGNyZWF0b3I+CiAgICAgIDxjcmVhdG9yTmFtZSBuYW1lVHlwZT0iUGVyc29uYWwiPkp1LCBZLiBTdW5ndGFlazwvY3JlYXRvck5hbWU+CiAgICAgIDxuYW1lSWRlbnRpZmllciBuYW1lSWRlbnRpZmllclNjaGVtZT0iT1JDSUQiIHNjaGVtZVVSST0iaHR0cDovL29yY2lkLm9yZy8iPjAwMDAtMDAwMy0xMjM4LTg2NzQ8L25hbWVJZGVudGlmaWVyPgogICAgICA8YWZmaWxpYXRpb24gYWZmaWxpYXRpb25JZGVudGlmaWVyPSJodHRwczovL3Jvci5vcmcvMDQ2cm03ajYwIiBhZmZpbGlhdGlvbklkZW50aWZpZXJTY2hlbWU9IlJPUiIgc2NoZW1lVVJJPSJodHRwczovL3Jvci5vcmciPlVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwgTG9zIEFuZ2VsZXM8L2FmZmlsaWF0aW9uPgogICAgPC9jcmVhdG9yPgogIDwvY3JlYXRvcnM+CiAgPHRpdGxlcz4KICAgIDx0aXRsZT5Db2RlIGZyb206IEZ1bGwtc2NhdHRlcmluZy1tYXRyaXggcGhvbm9uIEJURSBzb2x2ZXI8L3RpdGxlPgogIDwvdGl0bGVzPgogIDxwdWJsaXNoZXIgcHVibGlzaGVySWRlbnRpZmllcj0iaHR0cHM6Ly9yb3Iub3JnLzAweDZoNW45NSIgcHVibGlzaGVySWRlbnRpZmllclNjaGVtZT0iUk9SIiBzY2hlbWVVUkk9Imh0dHBzOi8vcm9yLm9yZy8iPkRyeWFkPC9wdWJsaXNoZXI+CiAgPHJlc291cmNlVHlwZSByZXNvdXJjZVR5cGVHZW5lcmFsPSJEYXRhc2V0Ij5kYXRhc2V0PC9yZXNvdXJjZVR5cGU+CiAgPHB1YmxpY2F0aW9uWWVhcj4yMDI2PC9wdWJsaWNhdGlvblllYXI+CiAgPHN1YmplY3RzPgogICAgPHN1YmplY3Qgc3ViamVjdFNjaGVtZT0iZm9zIiBzY2hlbWVVUkk9Imh0dHBzOi8vd2ViLWFyY2hpdmUub2VjZC5vcmcvMjAxMi0wNi0xNS8xMzg1NzUtMzgyMzUxNDcucGRmIj5GT1M6IFBoeXNpY2FsIHNjaWVuY2VzPC9zdWJqZWN0PgogICAgPHN1YmplY3Qgc3ViamVjdFNjaGVtZT0iZm9zIiBzY2hlbWVVUkk9Imh0dHBzOi8vd2ViLWFyY2hpdmUub2VjZC5vcmcvMjAxMi0wNi0xNS8xMzg1NzUtMzgyMzUxNDcucGRmIj5GT1M6IEVuZ2luZWVyaW5nIGFuZCB0ZWNobm9sb2d5PC9zdWJqZWN0PgogICAgPHN1YmplY3Qgc3ViamVjdFNjaGVtZT0iZm9zIiBzY2hlbWVVUkk9Imh0dHBzOi8vd2ViLWFyY2hpdmUub2VjZC5vcmcvMjAxMi0wNi0xNS8xMzg1NzUtMzgyMzUxNDcucGRmIj5GT1M6IE5hbm8tdGVjaG5vbG9neTwvc3ViamVjdD4KICAgIDxzdWJqZWN0IHN1YmplY3RTY2hlbWU9IlBMT1MgU3ViamVjdCBBcmVhIFRoZXNhdXJ1cyIgc2NoZW1lVVJJPSJodHRwczovL2dpdGh1Yi5jb20vUExPUy9wbG9zLXRoZXNhdXJ1cyI+UGhvbm9uczwvc3ViamVjdD4KICAgIDxzdWJqZWN0IHN1YmplY3RTY2hlbWU9IlBMT1MgU3ViamVjdCBBcmVhIFRoZXNhdXJ1cyIgc2NoZW1lVVJJPSJodHRwczovL2dpdGh1Yi5jb20vUExPUy9wbG9zLXRoZXNhdXJ1cyI+VGhlcm1hbCBjb25kdWN0aXZpdHk8L3N1YmplY3Q+CiAgICA8c3ViamVjdCBzdWJqZWN0U2NoZW1lPSJQTE9TIFN1YmplY3QgQXJlYSBUaGVzYXVydXMiIHNjaGVtZVVSST0iaHR0cHM6Ly9naXRodWIuY29tL1BMT1MvcGxvcy10aGVzYXVydXMiPk5hbm9lbGVjdHJvbmljczwvc3ViamVjdD4KICA8L3N1YmplY3RzPgogIDxkYXRlcz4KICAgIDxkYXRlIGRhdGVUeXBlPSJDcmVhdGVkIj4yMDI2LTA2LTIzVDIxOjQ5OjA4WjwvZGF0ZT4KICAgIDxkYXRlIGRhdGVUeXBlPSJTdWJtaXR0ZWQiPjIwMjYtMDctMTZUMTQ6MjU6MzlaPC9kYXRlPgogICAgPGRhdGUgZGF0ZVR5cGU9Iklzc3VlZCI+MjAyNi0wNy0yMlQwMDowMDowMFo8L2RhdGU+CiAgICA8ZGF0ZSBkYXRlVHlwZT0iQXZhaWxhYmxlIj4yMDI2LTA3LTIyVDAwOjAwOjAwWjwvZGF0ZT4KICA8L2RhdGVzPgogIDxsYW5ndWFnZT5lbjwvbGFuZ3VhZ2U+CiAgPHJlbGF0ZWRJZGVudGlmaWVycz4KICAgIDxyZWxhdGVkSWRlbnRpZmllciByZWxhdGlvblR5cGU9IklzQ2l0ZWRCeSIgcmVsYXRlZElkZW50aWZpZXJUeXBlPSJET0kiPmh0dHBzOi8vZG9pLm9yZy8xMC4xMDM4L3M0MTU5OC0wMjYtNjI4NzYtNzwvcmVsYXRlZElkZW50aWZpZXI+CiAgPC9yZWxhdGVkSWRlbnRpZmllcnM+CiAgPHNpemVzPgogICAgPHNpemU+MTc4NDAyIGJ5dGVzPC9zaXplPgogIDwvc2l6ZXM+CiAgPHZlcnNpb24+NTwvdmVyc2lvbj4KICA8cmlnaHRzTGlzdD4KICAgIDxyaWdodHMgcmlnaHRzVVJJPSJodHRwczovL3NwZHgub3JnL2xpY2Vuc2VzL0NDMC0xLjAuaHRtbCI+Q3JlYXRpdmUgQ29tbW9ucyBaZXJvIHYxLjAgVW5pdmVyc2FsPC9yaWdodHM+CiAgPC9yaWdodHNMaXN0PgogIDxkZXNjcmlwdGlvbnM+CiAgICA8ZGVzY3JpcHRpb24gZGVzY3JpcHRpb25UeXBlPSJBYnN0cmFjdCI+CiAgICAgIEEgZGV0ZXJtaW5pc3RpYyBzb2x2ZXIgZm9yIHRoZSBwaG9ub24gQm9sdHptYW5uIHRyYW5zcG9ydCBlcXVhdGlvbiAoQlRFKQogICAgICB0aGF0IHJldGFpbnMgdGhlIGZ1bGwgcGhvbm9u4oCTcGhvbm9uIHNjYXR0ZXJpbmcKICAgICAgbWF0cml4JmFtcDtuYnNwO1cmYW1wO25ic3A74oCUIHJhdGhlciB0aGFuIHRoZSBkaWFnb25hbCByZWxheGF0aW9uLXRpbWUKICAgICAgYXBwcm94aW1hdGlvbiAoUlRBKSDigJQgZm9yIHRoZXJtYWwgdHJhbnNwb3J0IGluIGdlb21ldHJpZXMgcmFuZ2luZyBmcm9tCiAgICAgIG9uZS1kaW1lbnNpb25hbCBzbGFicyB0byBhIHRocmVlLWRpbWVuc2lvbmFsIGRldmljZS4KICAgIDwvZGVzY3JpcHRpb24+CiAgICA8ZGVzY3JpcHRpb24gZGVzY3JpcHRpb25UeXBlPSJUZWNobmljYWxJbmZvIj4KICAgICAgIyBUVC1CVEU6IERldGVybWluaXN0aWMgZnVsbC1zY2F0dGVyaW5nLW1hdHJpeCBwaG9ub24gQm9sdHptYW5uIHRyYW5zcG9ydAogICAgICBzb2x2ZXIgQSBkZXRlcm1pbmlzdGljIHNvbHZlciBmb3IgdGhlIHBob25vbiBCb2x0em1hbm4gdHJhbnNwb3J0IGVxdWF0aW9uCiAgICAgIChCVEUpIHRoYXQgcmV0YWlucyB0aGUgKipmdWxsIHBob25vbuKAk3Bob25vbiBzY2F0dGVyaW5nIG1hdHJpeCoqICpXKiDigJQKICAgICAgcmF0aGVyIHRoYW4gdGhlIGRpYWdvbmFsIHJlbGF4YXRpb24tdGltZSBhcHByb3hpbWF0aW9uIChSVEEpIOKAlCBmb3IgdGhlcm1hbAogICAgICB0cmFuc3BvcnQgaW4gZ2VvbWV0cmllcyByYW5naW5nIGZyb20gb25lLWRpbWVuc2lvbmFsIHNsYWJzIHRvIGEKICAgICAgdGhyZWUtZGltZW5zaW9uYWwgRmluRkVULWxpa2UgZGV2aWNlLiBUaGlzIHJlcG9zaXRvcnkgY29udGFpbnMgdGhlIHNvbHZlcgogICAgICBjb2RlIGFjY29tcGFueWluZyB0aGUgbWFudXNjcmlwdCAqIkRldGVybWluaXN0aWMgZnVsbC1tYXRyaXggcGhvbm9uCiAgICAgIEJURSBzb2x2ZXIgZm9yIDNEIGRldmljZSBnZW9tZXRyaWVzIiogKFkuIFMuIEp1KS4gSXQgcmVwcm9kdWNlcyB0aGUKICAgICAgZnVsbC1zY2F0dGVyaW5nLW1hdHJpeCBjb25zdHJ1Y3Rpb24sIHRoZSBoeWJyaWQgbW9kZS1zcGFjZSBzb2x2ZXIsIGFuZCB0aGUKICAgICAgZGV2aWNlIGdlb21ldHJpZXMgcmVwb3J0ZWQgdGhlcmUuIFRoZSBpbnRlcmF0b21pYyBtb2RlbCB1c2VkIHRocm91Z2hvdXQgaXMKICAgICAgdGhlIFN0aWxsaW5nZXLigJNXZWJlciAoU1cpIHBvdGVudGlhbCBmb3Igc2lsaWNvbi4gTWF0ZXJpYWwtc3BlY2lmaWMKICAgICAgdHJhbnNwb3J0IG1hZ25pdHVkZXMgKGUuZy4sIHRoZSBidWxrIGNvbmR1Y3Rpdml0eSBhbmQgdGhlIGRldmljZQogICAgICB0ZW1wZXJhdHVyZS1yaXNlIGNvcnJlY3Rpb24pIGFyZSBwcm9wZXJ0aWVzIG9mIHRoaXMgU1cgbW9kZWwgYW5kIHNob3VsZAogICAgICBub3QgYmUgcmVhZCBhcyBxdWFudGl0YXRpdmUgcHJlZGljdGlvbnMgZm9yIGNyeXN0YWxsaW5lIHNpbGljb247IHRoZQogICAgICBzdHJ1Y3R1cmFsIHJlc3VsdHMgb2YgdGhlIHBhcGVyIGFyZSBpbmRlcGVuZGVudCBvZiB0aGlzIGNob2ljZS4gLS0tICMjCiAgICAgIFdoYXQgdGhlIHNvbHZlciBkb2VzIFRoZSBwaG9ub24gQlRFIHVuZGVyIHN0dWR5IGlzIGBgYCB2X867IMK3IOKIhyBmX867KHIpID0KICAgICAgzqNfzrwgV1/Ou868IGZfzrwocikgKyBRX867KHIpLCBgYGAgd2hlcmUgYGZfzrtgIGlzIHRoZSBkZXZpYXRpb25hbCBwaG9ub24KICAgICAgZGlzdHJpYnV0aW9uIGZvciBtb2RlIGDOu2AsIGB2X867YMKgdGhlIGdyb3VwIHZlbG9jaXR5LCBgV2AgdGhlIGZ1bGwKICAgICAgc2NhdHRlcmluZyBvcGVyYXRvciwgYW5kIGBRYCBhIGhlYXQgc291cmNlLiBUaGUgZGVmaW5pbmcgZmVhdHVyZSBvZiB0aGlzCiAgICAgIHNvbHZlciBpcyB0aGF0IGl0IGtlZXBzIHRoZSBjb21wbGV0ZSBvZmYtZGlhZ29uYWwgYFdgd2hpbGUgcmVtYWluaW5nCiAgICAgIHRyYWN0YWJsZSBpbiAzRCwgYnkgYSAqKmh5YnJpZCBtb2RlLXNwYWNlKiogZGVjb21wb3NpdGlvbjogKiAqKlN0cmVhbWluZyoqCiAgICAgIChgdiDCtyDiiIdgKSBpcyBoYW5kbGVkIGJ5IGRlbnNlLCB1cHdpbmQgc3BhdGlhbCBzd2VlcHMsIHdoaWNoIGFyZSB0cml2aWFsbHkKICAgICAgbW9kZS1sb2NhbCBhbmQgbmVlZCBubyBjb21wcmVzc2lvbi4gKiAqKlNjYXR0ZXJpbmcqKiAoYFdgKSBpcyBhcHBsaWVkIGFzIGEKICAgICAgY29tcHJlc3NlZCBvcGVyYXRvciDigJQgZWl0aGVyIGEgdHJ1bmNhdGVkIFNWRMKgb2YgdGhlIGluLXNjYXR0ZXJpbmcgYmxvY2sKICAgICAgKHdpdGggdGhlIG91dC1zY2F0dGVyaW5nIGRpYWdvbmFsIGNhcnJpZWQgZXhhY3RseSkgb3IgYSB0ZW5zb3ItdHJhaW4gKFRUKQogICAgICByZXByZXNlbnRhdGlvbiDigJQgd2l0aCBncmlkLWluZGVwZW5kZW50IHJhbmsuIFRoZSBzY2F0dGVyaW5nIG1hdHJpeCBpcwogICAgICBjb25zdHJ1Y3RlZCB0byBzYXRpc2Z5IHRocmVlIHBoeXNpY2FsIGNvbnN0cmFpbnRzIHRoYXQgYXJlIGxvYWQtYmVhcmluZwogICAgICBmb3IgYSBzdGFibGUgZGV2aWNlIHNvbHZlOiAxLiAqKkVuZXJneSBjb25zZXJ2YXRpb24qKiwgYFcgYyA9IDBgLCB3aGVyZQogICAgICBgY2AgYXJlIHRoZSBtb2RhbCBoZWF0IGNhcGFjaXRpZXMuIDIuICoqRGV0YWlsZWQgYmFsYW5jZSoqLCBgY19pIFdfaWogPQogICAgICBjX2ogV19qaWAuIDMuICoqTmVnYXRpdmUgc2VtaS1kZWZpbml0ZW5lc3MqKiBvbiB0aGUgbm9uLWVxdWlsaWJyaXVtCiAgICAgIHN1YnNwYWNlLiBDb25zZXJ2YXRpb24gaXMgbm90IG9wdGlvbmFsOiBhIG5vbi1jb25zZXJ2aW5nIG9wZXJhdG9yIG1ha2VzCiAgICAgIHRoZSBkZXZpY2Ugc29sdmVyIGRpdmVyZ2UuIFRoZSBjb25zdHJ1Y3Rpb24gZW5mb3JjZXMgYWxsIHRocmVlCiAgICAgIGFuYWx5dGljYWxseSBhbmQgdGhlbiBwcm9qZWN0cyBvdXQgdGhlIHJlc2lkdWFsLCByZWFjaGluZyBtYWNoaW5lCiAgICAgIHByZWNpc2lvbiBvbiBlYWNoIChzZWUgIlZlcmlmeWluZyB0aGUgaW5zdGFsbCAiIGJlbG93KS4gLS0tICMjCiAgICAgIFJlcG9zaXRvcnkgbGF5b3V0IGBgYCBfX2luaXRfXy5weSBTZXRzIHRoZSB2ZXJzaW9uIGFuZCBpdHMgZGVzY3JpcHRpb24KICAgICAgY29yZS8gVGVuc29yLXRyYWluIGFsZ2VicmEgKHBoeXNpY3MtYWdub3N0aWMpIHRlbnNvcl90cmFpbi5weSBUZW5zb3JUcmFpbgogICAgICBjbGFzcywgaW5kZXggYm9va2tlZXBpbmcgdHRfb3BlcmF0b3JzLnB5IFRUT3BlcmF0b3IgKE1QTyksCiAgICAgIGFkZC9zY2FsZS9jb21wcmVzcyB0dF9zb2x2ZXJzLnB5IEFNRW4gbGluZWFyIHNvbHZlciBwaHlzaWNzLyBQaG9ub24gbW9kZWwKICAgICAgYW5kIHNjYXR0ZXJpbmcgb3BlcmF0b3Igc3dfcG90ZW50aWFsLnB5IFN0aWxsaW5nZXLigJNXZWJlciBlbmVyZ3kgYW5kIGZvcmNlcwogICAgICBzaV9waHlzaWNhbF9hbmFseXNpc192Mi5weSBGb3JjZSBjb25zdGFudHMsIHBob25vbnMsIGFuZCB0aGUgZnVsbC1XCiAgICAgIHNjYXR0ZXJpbmctbWF0cml4IGNvbnN0cnVjdGlvbiAodGhlIGNvcmUgcGh5c2ljYWwgY29udHJpYnV0aW9uKQogICAgICBzd19waG9ub25fYnJpZGdlLnB5IFNXUGhvbm9uQ29tcHV0YXRpb246IGVuZC10by1lbmQgU1cg4oaSICh2LCDPhCwgQywgVykKICAgICAgcGhvbm9uX2RhdGEucHkgUGhvbm9uQmFuZERhdGEgY29udGFpbmVyIGFuZCByZWZlcmVuY2UgbW9kZWxzIG1vZGVfc3BhY2UucHkKICAgICAgTW9kZVNwYWNlRGF0YTogdGhlIG1vZGUtcmVzb2x2ZWQgbW9kZWwgY29uc3VtZWQgYnkgZXZlcnkgc29sdmVyOyBmYWN0b3J5CiAgICAgIG1vZGVfc3BhY2VfZnJvbV9zdygpIHN2ZF9zY2F0dGVyaW5nLnB5IFNWRFNjYXR0ZXJpbmdPcGVyYXRvcjogbG93LXJhbmsgVwogICAgICB3aXRoIGV4YWN0IM6zIHR0X3NjYXR0ZXJpbmcucHkgVFRTY2F0dGVyaW5nT3BlcmF0b3I6IHRlbnNvci10cmFpbiBXCiAgICAgIHNvbHZlcnMvIEJURSBzb2x2ZXJzIChoeWJyaWQgbW9kZS1zcGFjZSkgYnRlX3NsYWJfMWRfaHlicmlkLnB5IDFEIHNsYWIKICAgICAgKHZhbGlkYXRpb24gYWdhaW5zdCBhbmFseXRpYyByZWZlcmVuY2UpIGJ0ZV9zbGFiXzJkX2h5YnJpZC5weSAyRCBzbGFiCiAgICAgIGJ0ZV9tb25vbGl0aGljXzJkLnB5IDJEIG1vbm9saXRoaWMgZG9tYWluIGRlbnNlX3N3ZWVwXzNkX2h5YnJpZC5weSAzRCBib3gKICAgICAgZGVuc2Utc3dlZXAgcmVmZXJlbmNlIGJ0ZV8zZF9maW5mZXQucHkgM0QgRmluRkVULWxpa2UgZGV2aWNlIChmaW4gKyBiYXNlLAogICAgICBTY2h3YXJ6IGNvdXBsaW5nKSDigJQgdGhlIGhlYWRsaW5lIGRldmljZSBnZW9tZXRyeSBkc2Ffb3BlcmF0b3IucHkKICAgICAgRGlmZnVzaW9uLXN5bnRoZXRpYyBhY2NlbGVyYXRpb24gKGJhc2UpIGRzYV9vcGVyYXRvcl8xZC5weSBEU0EsIDFECiAgICAgIGRzYV9vcGVyYXRvcl8yZC5weSBEU0EsIDJEIGRzYV9vcGVyYXRvcl8zZC5weSBEU0EsIDNEIChGb3VyaWVyLWNvc2luZSkgYGBgCiAgICAgIERpZmZ1c2lvbi1zeW50aGV0aWMgYWNjZWxlcmF0aW9uIChEU0EpIGlzCiAgICAgIGFuwqAqKm9wdGlvbmFsJmFtcDsjeEEwOyoqJmFtcDsjeDYzO29udmVyZ2VuY2UgYWNjZWxlcmF0b3LCoGFuZCBpcyAqKm9mZiBieQogICAgICBkZWZhdWx0Kio7IGl0IGlzIG5vdCBwYXJ0IG9mIHRoZSBwcm9kdWN0aW9uIG1ldGhvZG9sb2d5IGFuZCBpcyBwcm92aWRlZAogICAgICBvbmx5IGZvciBjcm9zcy1jaGVja2luZy4gQWxsIHRoZSBjb2RlIGZpbGVzIGFyZQogICAgICBpbsKgRHJ5YWRfdHRfYnRlX3NvbHZlci56aXAuIC0tLSAjIyBSZXF1aXJlbWVudHMgKiBQeXRob24g4omlIDMuMTAgKiBOdW1QeSAqCiAgICAgIFNjaVB5IFRoYXQgaXMgdGhlIGNvbXBsZXRlIHJ1bnRpbWUgcmVxdWlyZW1lbnQuIFRoZSBzb2x2ZXIgcnVucyBlbnRpcmVseQogICAgICBvbiBDUFUvTnVtUHkuIEpBWCBpcyBhbiAqb3B0aW9uYWwqIGRlcGVuZGVuY3ksIHVzZWQgb25seSBieSBhIHNpbmdsZQogICAgICBHUFUtcmVzaWRlbnQgRFNBIGNvcnJlY3Rpb24gbWV0aG9kIChgRFNBT3BlcmF0b3IzRC5hcHBseV9jb3JyZWN0aW9uX2pheGApLgogICAgICBJdCBpcyBub3QgbmVlZGVkIHRvIHJ1biBhbnkgc29sdmVyIG9yIHRvIHJlcHJvZHVjZSBhbnkgcmVzdWx0IGluIHRoZQogICAgICBwYXBlcjsgdGhlIHJlbGV2YW50IGltcG9ydCBpcyBsYXp5LCBzbyB0aGUgcGFja2FnZSBsb2FkcyBhbmQgcnVucyB3aXRob3V0CiAgICAgIEpBWCBpbnN0YWxsZWQuIEluc3RhbGwgdGhlIHJlcXVpcmVtZW50cyB3aXRoOiBgYGAgcGlwIGluc3RhbGwgbnVtcHkgc2NpcHkKICAgICAgYGBgIC0tLSAjIyBJbnN0YWxsaW5nIGFuZCBpbXBvcnRpbmcgVGhpcyBpcyBhIGZsYXQgcGFja2FnZTogcHV0IHRoZQogICAgICBkaXJlY3RvcnkgdGhhdCAqY29udGFpbnMqIGBjb3JlL2AswqDCoGBwaHlzaWNzL2AsIGFuZCBgc29sdmVycy9gIG9uIHlvdXIKICAgICAgUHl0aG9uIHBhdGggYW5kIGltcG9ydCB0aGUgc3VicGFja2FnZXMgZGlyZWN0bHkuIFRoZSBzaW1wbGVzdCBhcHByb2FjaCBpcwogICAgICB0byBydW4gUHl0aG9uIGZyb20gaW5zaWRlIHRoaXMgZGlyZWN0b3J5LCBvciB0byBhZGQgaXQgdG8gYFBZVEhPTlBBVEhgOgogICAgICBgYGAgZXhwb3J0IFBZVEhPTlBBVEg9L3BhdGgvdG8vdGhpcy9kaXJlY3Rvcnk6JFBZVEhPTlBBVEggYGBgIFRoZW4sIGluCiAgICAgIFB5dGhvbjogYGBgcHl0aG9uIGZyb20gcGh5c2ljcyBpbXBvcnQgU1dQaG9ub25Db21wdXRhdGlvbiwKICAgICAgU1ZEU2NhdHRlcmluZ09wZXJhdG9yLCBNb2RlU3BhY2VEYXRhIGZyb20gcGh5c2ljcy5tb2RlX3NwYWNlIGltcG9ydAogICAgICBtb2RlX3NwYWNlX2Zyb21fc3cgZnJvbSBzb2x2ZXJzIGltcG9ydCBCVEVTbGFiMUQsIERlbnNlU3dlZXAzREh5YnJpZCBmcm9tCiAgICAgIHNvbHZlcnMuYnRlXzNkX2ZpbmZldCBpbXBvcnQgRGVuc2VTd2VlcDNERmluRkVUIGBgYCAtLS0gIyMgVmVyaWZ5aW5nIHRoZQogICAgICBpbnN0YWxsIFRoZSBmb2xsb3dpbmcgYnVpbGRzIHRoZSBTVyBwaG9ub24gbW9kZWwgb24gYSBzbWFsbCBncmlkLAogICAgICBjb25zdHJ1Y3RzIHRoZSBmdWxsIHNjYXR0ZXJpbmcgbWF0cml4LCBhbmQgY29uZmlybXMgdGhlIGNvbnNlcnZhdGlvbiwKICAgICAgZGV0YWlsZWQtYmFsYW5jZSwgYW5kIHNlbWktZGVmaW5pdGVuZXNzIGdhdGVzLiBJdCB0YWtlcyBhIGNvdXBsZSBvZgogICAgICBtaW51dGVzIChtb3N0IG9mIHRoZSB0aW1lIGlzIHRoZSBmb3JjZS1jb25zdGFudCBjb21wdXRhdGlvbikgYW5kIHJlcXVpcmVzCiAgICAgIG9ubHkgTnVtUHkgYW5kIFNjaVB5LiBgYGBweXRob24gZnJvbSBwaHlzaWNzIGltcG9ydCBTV1Bob25vbkNvbXB1dGF0aW9uCiAgICAgIGNvbXAgPSBTV1Bob25vbkNvbXB1dGF0aW9uKHFfZ3JpZF9zaXplPTMpICMgc21hbGwgM3gzeDMgcS1ncmlkCiAgICAgIGNvbXAuY29tcHV0ZShidWlsZF9XPVRydWUsIHZlcmJvc2U9VHJ1ZSkgIyBidWlsZHMgdiwgdGF1LCBDLCBhbmQgVyAjIEFmdGVyCiAgICAgIGNvbnN0cnVjdGlvbiB0aGUgc29sdmVyIHByaW50cyB0aGUgbWF0cml4IGdhdGVzLCBlLmcuOiAjIEVuZXJneQogICAgICBjb25zZXJ2YXRpb24gfHxXIGN8fCAvIHx8Y3x8IH4gMWUtMTYgKFdjID0gMCkgIyBEZXRhaWxlZCBiYWxhbmNlIG1heHxjX2kKICAgICAgV19paiAtIC4uLnwgfiAxZS0xNiAjIEVpZ2VudmFsdWVzIGFsbCAmbHQ7PSAwIChzZW1pLWRlZmluaXRlKQogICAgICBwcmludCgibW9kZXM6IiwgY29tcC5XLnNoYXBlWzBdKSBgYGAgQSBjbGVhbiBydW4gcHJpbnRzCiAgICAgIGNvcnJlY3RlZCBjb25zZXJ2YXRpb24gYW5kIGRldGFpbGVkLWJhbGFuY2UgcmVzaWR1YWxzIGF0IHRoZSBsZXZlbCBvZgogICAgICBtYWNoaW5lIHByZWNpc2lvbiAoYH4xZS0xNWAgb3Igc21hbGxlcikgYW5kIG5vIHBvc2l0aXZlIGVpZ2VudmFsdWVzLiAtLS0KICAgICAgIyMgVHlwaWNhbCB3b3JrZmxvdyAjIyMgMS4gQnVpbGQgdGhlIHBob25vbiBtb2RlbCBgYGBweXRob24gZnJvbSBwaHlzaWNzCiAgICAgIGltcG9ydCBTV1Bob25vbkNvbXB1dGF0aW9uIGZyb20gcGh5c2ljcy5tb2RlX3NwYWNlIGltcG9ydAogICAgICBtb2RlX3NwYWNlX2Zyb21fc3cgY29tcCA9IFNXUGhvbm9uQ29tcHV0YXRpb24ocV9ncmlkX3NpemU9NykgIyBwcm9kdWN0aW9uCiAgICAgIGdyaWRzIHVzZSBsYXJnZXIgTiBjb21wLmNvbXB1dGUoYnVpbGRfVz1UcnVlKSBtb2RlX2RhdGEgPQogICAgICBtb2RlX3NwYWNlX2Zyb21fc3coY29tcCkgIyBNb2RlU3BhY2VEYXRhIGZvciB0aGUgc29sdmVycwogICAgICBwcmludChtb2RlX2RhdGEuc3VtbWFyeSgpKSBgYGAgYE1vZGVTcGFjZURhdGFgIGV4cG9zZXMgdGhlIG1vZGUtcmVzb2x2ZWQKICAgICAgdmVsb2NpdGllcywgaGVhdCBjYXBhY2l0aWVzLCB0aGUgZnVsbCBgV2AsIHRoZSBSVEEgb3BlcmF0b3IgYFdfcnRhYCwgdGhlCiAgICAgIHRoZXJtYWxseSBhY3RpdmUgbWFzaywgYW5kIGhlbHBlcnMgc3VjaCBhcyBgYnVsa190aGVybWFsX2NvbmR1Y3Rpdml0eSgpYAogICAgICBhbmQgYHByb2plY3RfdG9fMWQoKWAuICMjIyAyLiBDb21wcmVzcyB0aGUgc2NhdHRlcmluZyBvcGVyYXRvciAob3B0aW9uYWwKICAgICAgYnV0IHJlY29tbWVuZGVkKSBgYGBweXRob24gZnJvbSBwaHlzaWNzIGltcG9ydCBTVkRTY2F0dGVyaW5nT3BlcmF0b3IKICAgICAgc3ZkX29wID0gU1ZEU2NhdHRlcmluZ09wZXJhdG9yLmZyb21fbW9kZV9kYXRhKG1vZGVfZGF0YSwgcmFuaz01MCkKICAgICAgc3ZkX29wLnByaW50X3Jhbmtfc3VtbWFyeSgpIGBgYCBUaGUgb3V0LXNjYXR0ZXJpbmcgZGlhZ29uYWwgYM6zYCBpcwogICAgICByZXRhaW5lZCBleGFjdGx5OyBvbmx5IHRoZSBpbi1zY2F0dGVyaW5nIGJsb2NrIGlzIGFwcHJveGltYXRlZCwgc28gdGhlCiAgICAgIHRyYW5zcG9ydC1jcml0aWNhbCByZWxheGF0aW9uIHJhdGVzIGFyZSBwcmVzZXJ2ZWQuICMjIyAzLiBTb2x2ZSBhIGdlb21ldHJ5CiAgICAgIDFEIHNsYWIgKHVzZWQgZm9yIHZhbGlkYXRpb24gYWdhaW5zdCB0aGUgYW5hbHl0aWMgRnVjaHPigJNTb25kaGVpbWVyCiAgICAgIHJlZmVyZW5jZSk6IGBgYHB5dGhvbiBmcm9tIHNvbHZlcnMgaW1wb3J0IEJURVNsYWIxRCBzbGFiID0KICAgICAgQlRFU2xhYjFEKE5feD0xMDAsIEw9MjAwZS05LCBtb2RlX2RhdGE9bW9kZV9kYXRhLnByb2plY3RfdG9fMWQoKSkgcmVzdWx0ID0KICAgICAgc2xhYi5zb2x2ZSh0b2w9MWUtOCwgdmVyYm9zZT1UcnVlKSBgYGAgM0QgRmluRkVULWxpa2UgZGV2aWNlICh0aGUgaGVhZGxpbmUKICAgICAgZ2VvbWV0cnkpOiBgYGBweXRob24gZnJvbSBzb2x2ZXJzLmJ0ZV8zZF9maW5mZXQgaW1wb3J0IERlbnNlU3dlZXAzREZpbkZFVAogICAgICAjIENvbnN0cnVjdCB3aXRoIHRoZSBmaW4vYmFzZSBzcGF0aWFsIHJlc29sdXRpb24gYW5kIGdlb21ldHJ5LCBzdXBwbHkgdGhlCiAgICAgICMgbW9kZV9kYXRhIGFuZCAob3B0aW9uYWxseSkgdGhlIFNWRC1jb21wcmVzc2VkIG9wZXJhdG9yLCB0aGVuIHNvbHZlLiAjCiAgICAgIFNlZSB0aGUgRGVuc2VTd2VlcDNERmluRkVUIGRvY3N0cmluZyBmb3IgdGhlIGZ1bGwgY29uc3RydWN0b3Igc2lnbmF0dXJlICMKICAgICAgYW5kIGJvdW5kYXJ5LWNvbmRpdGlvbiBvcHRpb25zIChpc290aGVybWFsIHNpbmssIGRpZmZ1c2Ugc2lkZSB3YWxscywgIwogICAgICB5LXVuaWZvcm0gbGluZSBoZWF0IHNvdXJjZSkuIGBgYCBFYWNoIHNvbHZlciByZXR1cm5zIGEgcmVzdWx0IG9iamVjdAogICAgICBjYXJyeWluZyB0aGUgY29udmVyZ2VkIHRlbXBlcmF0dXJlIGZpZWxkLMKgIHRoZSBoZWF0IGZsdXgsIGFuZCBzb2x2ZXIKICAgICAgZGlhZ25vc3RpY3MuIC0tLSAjIyBSZXByb2R1Y2luZyB0aGUgcGFwZXIncyBoZWFkbGluZSBxdWFudGl0aWVzIFRoZQogICAgICBkZXZpY2UgcmVzdWx0IGlzIHRoZSBmdWxsLWBXYCBjb3JyZWN0aW9uIHRvIHRoZSBwZWFrIHRlbXBlcmF0dXJlIHJpc2UsCiAgICAgIGRlZmluZWQgYXMgYSBzYW1lLWdyaWQgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBmdWxsLWBXYCBhbmQgUlRBIHNvbHV0aW9ucwogICAgICBvbiB0aGUgRmluRkVULWxpa2UgZ2VvbWV0cnkgd2l0aCBhIHktdW5pZm9ybSBsaW5lIGhlYXQgc291cmNlIG9uIHRoZSB0b3AKICAgICAgb2YgdGhlIGZpbi4gRm9yIEJyaWxsb3Vpbi16b25lIGdyaWRzLHMgYE4g4omlIDExYCB0aGUgY29ycmVjdGlvbiBpcyBgYGAKICAgICAgzrRUX2ZXIC8gKFRfUlRBIOKIkiBUXzApID0gMTEuNyDCsSAwLjMgJSwgYGBgIGEgYm91bmRlZCwgZ3JpZC1yb2J1c3QKICAgICAgY29ycmVjdGlvbi4gVGhlIFJUQSBiYXNlbGluZSB1c2VkIGZvciB0aGlzIGNvbXBhcmlzb24gY2FycmllcyB0aGUgc2FtZQogICAgICBpc290b3BlIGNoYW5uZWwgYXMgdGhlIGZ1bGwgb3BlcmF0b3IsIHNvIHRoZSB0d28gc29sdXRpb25zIGRpZmZlciBvbmx5IGluCiAgICAgIHRoZSBvZmYtZGlhZ29uYWwgc2NhdHRlcmluZy4gVG8gcmVwcm9kdWNlIGEgc2luZ2xlIHBvaW50OiBidWlsZCB0aGUgbW9kZWwKICAgICAgYXQgdGhlIGRlc2lyZWQgZ3JpZC7CoGBOYCAoYHFfZ3JpZF9zaXplPU5gKSwgY29uc3RydWN0IGJvdGggdGhlIGZ1bGwgYW5kCiAgICAgIFJUQSBvcGVyYXRvcnMgZnJvbSB0aGUgc2FtZSBgTW9kZVNwYWNlRGF0YWDCoHNvbHZlIHRoZSBGaW5GRVQgZ2VvbWV0cnkgd2l0aAogICAgICBlYWNoLCBhbmQgdGFrZSB0aGUgZGlmZmVyZW5jZSBvZiB0aGUgcGVhayB0ZW1wZXJhdHVyZXMuIFRoZSBidWxrCiAgICAgIGNvbmR1Y3Rpdml0eSBvZiB0aGUgU1cgbW9kZWwgb24gdGhpcyBncmlkIGlzIGBrX2J1bGsgPSAxNDguMCBXIG3igbvCuSBL4oG7wrlgCiAgICAgIChpc290cm9waWMgdG8gYmV0dGVyIHRoYW4gMC4wMDMlKSwgd2hpY2ggaXMgYSB1c2VmdWwgY3Jvc3MtY2hlY2sgdGhhdCB0aGUKICAgICAgcGhvbm9uIG1vZGVsIGlzIGJ1aWx0IGNvcnJlY3RseS4gLS0tICMjIE51bWVyaWNhbCBub3RlcyBhbmQga25vd24KICAgICAgcHJvcGVydGllcyAqICoqzpMtY2VudHJlZCBNb25raG9yc3TigJNQYWNrIHNhbXBsaW5nLioqIE9uIM6TLWNlbnRyZWQgZ3JpZHMsCiAgICAgIHRoZSBhYnNvbHV0ZSBkZXZpY2UgdGVtcGVyYXR1cmVzIGNvbnZlcmdlIG5vbi1tb25vdG9uaWNhbGx5IGF0IHNtYWxsIG9kZAogICAgICBgTmAgKHRoZSBncmlkIGRvZXMgbm90IGNsb3NlIHVuZGVyIGBxIOKGkiDiiJJxYCk7IG1vbm90b25lIGJlaGF2aW91ciBzZXRzIGluCiAgICAgIGJ5IGBOIOKJiCAxMeKAkzE1YC4gVGhlIHNhbWUtZ3JpZCAqY29ycmVjdGlvbiogaXMgZmFyIGxlc3Mgc2Vuc2l0aXZlIGFuZCBpcwogICAgICByZXBvcnRlZCBhcyBhIGJvdW5kZWQgYmFuZC4gKiAqKlNXIGdyb3VwLXZlbG9jaXR5IGFuaXNvdHJvcHkuKiogT24gYQogICAgICDOky1jZW50cmVkIGdyaSxkIHRoZSBTVyBncm91cCB2ZWxvY2l0aWVzIGNhcnJ5IGEgZml4ZWQgYFsxMTFdYCBlbGxpcHRpY2l0eSwKICAgICAgZ2l2aW5nIGEgbm9uLW5lZ2xpZ2libGUgb2ZmLWRpYWdvbmFsIENhcnRlc2lhbiBjb25kdWN0aXZpdHkgKGDOul94eS/Oul94eCDiiYgKICAgICAgMC41NmApLiBUaGUgc2NhbGFyIGJ1bGsgY29uZHVjdGl2aXR5IGlzIHVuYWZmZWN0ZWQgKHRoZSB0ZW5zb3IgaXMKICAgICAgdHJhY2VsZXNzLWNsZWFuKS4gVGhlIHktdW5pZm9ybSBsaW5lIHNvdXJjZSB1c2VkZm9yIHRoZWUgZGV2aWNlIHJlc3VsdHMKICAgICAgbWFrZXNg4oiCVC/iiIJ5IOKJiCAwYCwgc28gdGhpcyB0ZXJtIGlzIGdlb21ldHJpY2FsbHkgaW5hY3RpdmUuICoKICAgICAgKipTY2F0dGVyaW5nLW1hdHJpeCBzY2FsaW5nLioqIFRoZSBudW1iZXIgb2YgdGhyZWUtcGhvbm9uIGNoYW5uZWxzLCBhbmQKICAgICAgaGVuY2UgdGhlwqBub256ZXJvcyBvZmBXYCwgc2NhbGVzIGFzIHRoZSBzcXVhcmUgb2YgdGhlIGFjdGl2ZSBtb2RlIGNvdW50LAogICAgICBzbyB0aGUgb3BlcmF0b3LCoGlzIGdlbnVpbmVseSBkZW5zZS4gQ29tcHJlc3Npb24gb2YgdGhlICpzb2x1dGlvbiogKG5vdCB0aGUKICAgICAgb3BlcmF0b3IpIGlzIHdoYXQgbWFrZXMgdGhlIHNvbHZlciBlZmZpY2llbnQuIElmIHlvdSB1c2UgdGhpcyBzb2x2ZXIsIHdlCiAgICAgIGVuY291cmFnZSB5b3UgdG8gY2l0ZSB0aGUgYWNjb21wYW55aW5nIHBhcGVyICIqRGV0ZXJtaW5pc3RpYwogICAgICBmdWxsLW1hdHJpeCBwaG9ub24gQlRFIHNvbHZlciBmb3IgM0QgZGV2aWNlIGdlb21ldHJpZXMqLCIgYnkgWS4gUy4gSnUKICAgICAgaW4gKlNjaWVudGlmaWMgUmVwb3J0cyogKDIwMjYpLgogICAgPC9kZXNjcmlwdGlvbj4KICA8L2Rlc2NyaXB0aW9ucz4KPC9yZXNvdXJjZT4=","url":"https://datadryad.org/dataset/doi:10.5061/dryad.dr7sqvbdq","contentUrl":null,"metadataVersion":1,"schemaVersion":"http://datacite.org/schema/kernel-4","source":"mds","isActive":true,"state":"findable","reason":null,"viewCount":26,"viewsOverTime":[{"yearMonth":"2026-08","total":13},{"yearMonth":"2026-09","total":13}],"downloadCount":9,"downloadsOverTime":[{"yearMonth":"2026-08","total":3},{"yearMonth":"2026-09","total":6}],"referenceCount":0,"citationCount":1,"citationsOverTime":[{"year":"2026","total":1}],"partCount":0,"partOfCount":0,"versionCount":0,"versionOfCount":0,"created":"2026-07-22T10:56:06.000Z","registered":"2026-07-22T10:56:07.000Z","published":"2026","updated":"2026-08-11T20:33:18.000Z"},"relationships":{"client":{"data":{"id":"dryad.dryad","type":"clients"}},"provider":{"data":{"id":"dryad","type":"providers"}},"media":{"data":{"id":"10.5061/dryad.dr7sqvbdq","type":"media"}},"references":{"data":[]},"citations":{"data":[{"id":"10.1038/s41598-026-62876-7","type":"dois"}]},"parts":{"data":[]},"partOf":{"data":[]},"versions":{"data":[]},"versionOf":{"data":[]}}}}