diff --git a/Cargo.toml b/Cargo.toml index b570103..c6b20c7 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -57,6 +57,7 @@ attiny13a = ["device-selected"] attiny167 = ["device-selected"] attiny202 = ["device-selected"] attiny212 = ["device-selected"] +attiny204 = ["device-selected"] attiny214 = ["device-selected"] attiny2313 = ["device-selected"] attiny2313a = ["device-selected"] @@ -67,6 +68,7 @@ attiny412 = ["device-selected"] attiny414 = ["device-selected"] attiny416 = ["device-selected"] attiny44a = ["device-selected"] +attiny804 = ["device-selected"] attiny816 = ["device-selected"] attiny828 = ["device-selected"] attiny84 = ["device-selected"] @@ -75,6 +77,7 @@ attiny84a = ["device-selected"] attiny85 = ["device-selected"] attiny861 = ["device-selected"] attiny88 = ["device-selected"] +attiny1604 = ["device-selected"] attiny1606 = ["device-selected"] attiny1614 = ["device-selected"] attiny1626 = ["device-selected"] diff --git a/README.md b/README.md index 2ba3782..985f8b2 100644 --- a/README.md +++ b/README.md @@ -17,22 +17,25 @@ Via the feature you can select which chip you want the register specifications f | `atmega8` | `atmega8u2` | `atmega3208` | `at90usb1286` | `attiny13a` | | `atmega48p` | `atmega16u2` | `atmega3209` | | `attiny167` | | `atmega64` | `atmega32u2` | `atmega4808` | | `attiny202` | -| `atmega644` | `atmega32u4` | `atmega4809` | | `attiny212` | -| `atmega88p` | `avr64du32` | | | `attiny214` | -| `atmega16` | `avr64du28` | | | `attiny402` | -| `atmega168` | | | | `attiny404` | -| `atmega324pa` | | | | `attiny412` | -| `atmega328p` | | | | `attiny414` | -| `atmega328pb` | | | | `attiny416` | -| `atmega32a` | | | | `attiny44a` | -| `atmega1280` | | | | `attiny84` | -| `atmega1284p` | | | | `attiny85` | -| `atmega128a` | | | | `attiny88` | -| `atmega128rfa1` | | | | `attiny816` | -| `atmega2560` | | | | `attiny828` | -| `atmega164pa` | | | | `attiny841` | +| `atmega644` | `atmega32u4` | `atmega4809` | | `attiny204` | +| `atmega88p` | `avr64du32` | | | `attiny212` | +| `atmega16` | `avr64du28` | | | `attiny214` | +| `atmega168` | | | | `attiny402` | +| `atmega324pa` | | | | `attiny404` | +| `atmega328p` | | | | `attiny412` | +| `atmega328pb` | | | | `attiny414` | +| `atmega32a` | | | | `attiny416` | +| `atmega1280` | | | | `attiny44a` | +| `atmega1284p` | | | | `attiny84` | +| `atmega128a` | | | | `attiny85` | +| `atmega128rfa1` | | | | `attiny88` | +| `atmega2560` | | | | `attiny804` | +| `atmega164pa` | | | | `attiny816` | +| | | | | `attiny828` | +| | | | | `attiny841` | | | | | | `attiny84a` | | | | | | `attiny861` | +| | | | | `attiny1604` | | | | | | `attiny1606` | | | | | | `attiny1614` | | | | | | `attiny1626` | diff --git a/patch/attiny1604.yaml b/patch/attiny1604.yaml new file mode 100644 index 0000000..77a72e0 --- /dev/null +++ b/patch/attiny1604.yaml @@ -0,0 +1,5 @@ +_svd: ../svd/attiny1604.svd + +_include: + - common/attiny-xmega/common.yaml + - common/attiny-xmega/0-series.yaml diff --git a/patch/attiny204.yaml b/patch/attiny204.yaml new file mode 100644 index 0000000..4fbf46a --- /dev/null +++ b/patch/attiny204.yaml @@ -0,0 +1,5 @@ +_svd: ../svd/attiny204.svd + +_include: + - common/attiny-xmega/common.yaml + - common/attiny-xmega/0-series.yaml diff --git a/patch/attiny804.yaml b/patch/attiny804.yaml new file mode 100644 index 0000000..21a21ec --- /dev/null +++ b/patch/attiny804.yaml @@ -0,0 +1,5 @@ +_svd: ../svd/attiny804.svd + +_include: + - common/attiny-xmega/common.yaml + - common/attiny-xmega/0-series.yaml diff --git a/src/devices.rs b/src/devices.rs index 6ed66fe..94a93c6 100644 --- a/src/devices.rs +++ b/src/devices.rs @@ -177,6 +177,12 @@ pub mod attiny1606 { include!(concat!(env!("OUT_DIR"), "/pac/attiny1606.rs")); } +/// [ATtiny1604](https://www.microchip.com/wwwproducts/en/ATtiny1604) +#[cfg(feature = "attiny1604")] +pub mod attiny1604 { + include!(concat!(env!("OUT_DIR"), "/pac/attiny1604.rs")); +} + /// [ATtiny1614](https://www.microchip.com/wwwproducts/en/ATtiny1614) #[cfg(feature = "attiny1614")] pub mod attiny1614 { @@ -195,6 +201,12 @@ pub mod attiny202 { include!(concat!(env!("OUT_DIR"), "/pac/attiny202.rs")); } +/// [ATtiny204](https://www.microchip.com/wwwproducts/en/ATtiny204) +#[cfg(feature = "attiny204")] +pub mod attiny204 { + include!(concat!(env!("OUT_DIR"), "/pac/attiny204.rs")); +} + /// [ATtiny212](https://www.microchip.com/wwwproducts/en/ATtiny212) #[cfg(feature = "attiny212")] pub mod attiny212 { @@ -261,6 +273,12 @@ pub mod attiny44a { include!(concat!(env!("OUT_DIR"), "/pac/attiny44a.rs")); } +/// [ATtiny804](https://www.microchip.com/wwwproducts/en/ATtiny804) +#[cfg(feature = "attiny804")] +pub mod attiny804 { + include!(concat!(env!("OUT_DIR"), "/pac/attiny804.rs")); +} + /// [ATtiny816](https://www.microchip.com/wwwproducts/en/ATtiny816) #[cfg(feature = "attiny816")] pub mod attiny816 { diff --git a/src/lib.rs b/src/lib.rs index f2e37f9..48bab3a 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -28,10 +28,12 @@ #![cfg_attr(feature = "atmega88p", doc = "**atmega88p**,")] #![cfg_attr(feature = "attiny13a", doc = "**attiny13a**,")] #![cfg_attr(feature = "attiny167", doc = "**attiny167**,")] +#![cfg_attr(feature = "attiny1604", doc = "**attiny1604**,")] #![cfg_attr(feature = "attiny1606", doc = "**attiny1606**,")] #![cfg_attr(feature = "attiny1614", doc = "**attiny1614**,")] #![cfg_attr(feature = "attiny1626", doc = "**attiny1626**,")] #![cfg_attr(feature = "attiny202", doc = "**attiny202**,")] +#![cfg_attr(feature = "attiny204", doc = "**attiny204**,")] #![cfg_attr(feature = "attiny212", doc = "**attiny212**,")] #![cfg_attr(feature = "attiny214", doc = "**attiny214**,")] #![cfg_attr(feature = "attiny2313", doc = "**attiny2313**,")] @@ -43,6 +45,7 @@ #![cfg_attr(feature = "attiny414", doc = "**attiny414**,")] #![cfg_attr(feature = "attiny416", doc = "**attiny416**,")] #![cfg_attr(feature = "attiny44a", doc = "**attiny44a**,")] +#![cfg_attr(feature = "attiny804", doc = "**attiny804**,")] #![cfg_attr(feature = "attiny816", doc = "**attiny816**,")] #![cfg_attr(feature = "attiny828", doc = "**attiny828**,")] #![cfg_attr(feature = "attiny84", doc = "**attiny84**,")] @@ -89,9 +92,11 @@ //! `atmega88p`, //! `attiny13a`, //! `attiny167`, +//! `attiny1604`, //! `attiny1614`, //! `attiny1626`, //! `attiny202`, +//! `attiny204`, //! `attiny212`, //! `attiny214`, //! `attiny2313`, @@ -103,6 +108,7 @@ //! `attiny414`, //! `attiny416`, //! `attiny44a`, +//! `attiny804`, //! `attiny816`, //! `attiny828`, //! `attiny84`, @@ -264,20 +270,24 @@ compile_error!( * atmega88p * attiny13a * attiny167 + * attiny1604 * attiny1606 * attiny1614 * attiny1626 * attiny202 + * attiny204 * attiny212 * attiny214 * attiny2313 * attiny2313a * attiny26 * attiny402 + * attiny404 * attiny412 * attiny414 * attiny416 * attiny44a + * attiny804 * attiny816 * attiny828 * attiny84 @@ -350,6 +360,8 @@ pub use crate::devices::atmega88p; pub use crate::devices::atmega8u2; #[cfg(feature = "attiny13a")] pub use crate::devices::attiny13a; +#[cfg(feature = "attiny1604")] +pub use crate::devices::attiny1604; #[cfg(feature = "attiny1606")] pub use crate::devices::attiny1606; #[cfg(feature = "attiny1614")] @@ -360,6 +372,8 @@ pub use crate::devices::attiny1626; pub use crate::devices::attiny167; #[cfg(feature = "attiny202")] pub use crate::devices::attiny202; +#[cfg(feature = "attiny204")] +pub use crate::devices::attiny204; #[cfg(feature = "attiny212")] pub use crate::devices::attiny212; #[cfg(feature = "attiny214")] @@ -382,6 +396,8 @@ pub use crate::devices::attiny414; pub use crate::devices::attiny416; #[cfg(feature = "attiny44a")] pub use crate::devices::attiny44a; +#[cfg(feature = "attiny804")] +pub use crate::devices::attiny804; #[cfg(feature = "attiny816")] pub use crate::devices::attiny816; #[cfg(feature = "attiny828")] diff --git a/vendor/attiny1604.atdf b/vendor/attiny1604.atdf new file mode 100644 index 0000000..ef49163 --- /dev/null +++ b/vendor/attiny1604.atdf @@ -0,0 +1,4752 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/vendor/attiny204.atdf b/vendor/attiny204.atdf new file mode 100644 index 0000000..7887851 --- /dev/null +++ b/vendor/attiny204.atdf @@ -0,0 +1,4775 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/vendor/attiny804.atdf b/vendor/attiny804.atdf new file mode 100644 index 0000000..a279b37 --- /dev/null +++ b/vendor/attiny804.atdf @@ -0,0 +1,4752 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +